将内核定位到高地址(存在bug,中断时会访问低地址)

This commit is contained in:
fslongjin
2022-04-10 21:30:16 +08:00
parent 3063a340e2
commit f5f36aafd8
23 changed files with 689 additions and 238 deletions

View File

@ -269,8 +269,17 @@ enter_head_from_ap_boot:
hlt
ret
.code64
.global ready_to_start_64
ready_to_start_64:
mov $0x10, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
mov %ax, %ss
mov $0x7e00, %esp
//6. start64
movq switch_to_start64(%rip), %rax
pushq $0x08 //
@ -281,19 +290,23 @@ switch_to_start64:
.quad _start64
.code64
is_from_ap:
hlt
.global _start64
.type _start64, @function
.extern Start_Kernel
ENTRY(_start64)
//
mov $0x10, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
mov %ax, %ss
mov $0x7e00, %esp
// === GDTR ====
@ -302,13 +315,7 @@ ENTRY(_start64)
// === IDTR ====
lidt IDT_POINTER(%rip)
//lidt $IDT_POINTER
mov $0x10, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
mov %ax, %ss
mov %ax, %gs
movq GDT_POINTER(%rip), %r12
movq _stack_start(%rip), %rsp
// apu
@ -333,10 +340,13 @@ ENTRY(_start64)
// ==== CR3
load_cr3:
movq $__PML4E, %rax //
movq %rax, %cr3
load_cr3:
// apu
movq $__PML4E, %rax //
movq %rax, %cr3
movq switch_seg(%rip), %rax
// ljmplcallGASlretcs
// Amazing
@ -360,6 +370,21 @@ entry64:
movq _stack_start(%rip), %rsp //rsp
// GDTIDT
leaq GDT_Table(%rip), %r8
leaq GDT_END(%rip), %r9
subq %r8, %r9
movq %r9, %r13 // GDT size
leaq IDT_Table(%rip), %r8
leaq IDT_END(%rip), %r9
subq %r8, %r9
movq %r9, %r12 // IDT size
lgdt GDT_POINTER64(%rip)
lidt IDT_POINTER64(%rip)
// apu
movq $0x1b, %rcx // IA32_APIC_BASE.BSP[8]apu
@ -399,6 +424,10 @@ SetUp_TSS64:
// == 64 ===
//rdx8B rax8B
leaq TSS64_Table(%rip), %rdx
movq $0xffff800000000000, %r8
addq %r8, %rdx
xorq %rax, %rax
xorq %rcx, %rcx
@ -440,23 +469,57 @@ SetUp_TSS64:
or $(3 << 9), %ax //set CR4.OSFXSR and CR4.OSXMMEXCPT at the same time
movq %rax, %cr4
//call Start_Kernel
movq go_to_kernel(%rip), %rax /* movq address */
pushq $0x08
pushq %rax
movq mb2_info, %r15
movq mb2_info, %r15
movq mb2_magic, %r14
lretq
go_to_kernel:
.quad Start_Kernel
start_smp:
//now enable SSE and the like
movq %cr0, %rax
and $0xFFFB, %ax //clear coprocessor emulation CR0.EM
or $0x2, %ax //set coprocessor monitoring CR0.MP
movq %rax, %cr0
movq %cr4, %rax
or $(3 << 9), %ax //set CR4.OSFXSR and CR4.OSXMMEXCPT at the same time
movq %rax, %cr4
movq go_to_smp_kernel(%rip), %rax /* movq address */
pushq $0x08
pushq %rax
/*
// GDTIDT
leaq GDT_Table(%rip), %r8
leaq GDT_END(%rip), %r9
subq %r8, %r9
movq %r9, %r13 // GDT size
leaq IDT_Table(%rip), %r8
leaq IDT_END(%rip), %r9
subq %r8, %r9
movq %r9, %r12 // IDT size
lgdt GDT_POINTER64(%rip)
lidt IDT_POINTER64(%rip)
*/
lretq
go_to_smp_kernel:
@ -484,10 +547,10 @@ ENTRY(_stack_start)
//
.align 0x1000 //4k
.org 0x1000 //0x1000
//.org 0x1000 //0x1000
__PML4E:
.quad 0x103003 // 访 31~12
.quad 0x103007 // 访 31~12
.fill 255,8,0
.quad 0x103003
.fill 255,8,0
@ -575,6 +638,11 @@ GDT_POINTER:
GDT_LIMIT: .word GDT_END - GDT_Table - 1 // GDT
GDT_BASE: .quad GDT_Table
.global GDT_POINTER64
GDT_POINTER64:
GDT_LIMIT64: .word GDT_END - GDT_Table - 1 // GDT
GDT_BASE64: .quad GDT_Table + 0xffff800000000000
// IDT
.global IDT_Table
@ -587,6 +655,11 @@ IDT_POINTER:
IDT_LIMIT: .word IDT_END - IDT_Table - 1
IDT_BASE: .quad IDT_Table
.global IDT_POINTER64
IDT_POINTER64:
IDT_LIMIT64: .word IDT_END - IDT_Table - 1
IDT_BASE64: .quad IDT_Table + 0xffff800000000000
// 64TSS
.global TSS64_Table