From 2f0f12f893c1fedab65fde192961347f7ce6ef75 Mon Sep 17 00:00:00 2001 From: pointer-to-bios Date: Tue, 27 Feb 2024 22:18:14 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3idt=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/kernel/arch/x86_64/entry.s | 3 ++- src/kernel/arch/x86_64/entry32.s | 44 +++++++++++++------------------- src/metaverse.lds | 12 +++++++++ 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/kernel/arch/x86_64/entry.s b/src/kernel/arch/x86_64/entry.s index efbb1ad..2647c42 100644 --- a/src/kernel/arch/x86_64/entry.s +++ b/src/kernel/arch/x86_64/entry.s @@ -6,12 +6,13 @@ init64: endbr64 cli - ; 加载段寄存器 mov rax, 0x1000000 mov rbp, rax mov rsp, rax mov rdi, rbx + lidt [0x104010] + ; 加载系统调用相关寄存器 ; IA32_STAR = 0x0018_0008_0000_0000 mov rcx, 0xc0000081 diff --git a/src/kernel/arch/x86_64/entry32.s b/src/kernel/arch/x86_64/entry32.s index e05cffb..dc63960 100644 --- a/src/kernel/arch/x86_64/entry32.s +++ b/src/kernel/arch/x86_64/entry32.s @@ -37,19 +37,9 @@ init32: add edi, 4 loop init32_loop0 - ; 设置idt_ptr - mov eax, 0x10403a ; idt_ptr + 2 - mov dword [eax], 0x104050 - ; 加载IDTR寄存器 - db 0x66 - lidt [0x104038] - - ; 设置gdt_ptr - mov eax, 0x10402a ; gdt_ptr + 2 - mov dword [eax], 0x104000 ; gdt ; 加载GDTR、段寄存器和TR寄存器 db 0x66 - lgdt [0x104028] ; gdt_ptr + lgdt [0x104000] ; gdt_ptr mov ax, 0x10 mov ds, ax mov ss, ax @@ -98,7 +88,20 @@ PDPT0: PD0: resq 512 - ; 分段 + section .cpumeta.tblptrs + +gdt_ptr: ; 0x104000 + dw gdt_end - gdt - 1 + dq gdt + + dd 0 + dw 0 + +idt_ptr: ; 0x104010 + dw 0x7ff + dq idt + + section .cpumeta.gdt align=4096 gdt: dq 0 dq 0x0020980000000000 ; 内核态代码段 @@ -106,27 +109,16 @@ gdt: dq 0x0020f80000000000 ; 用户态代码段 dq 0x0000f20000000000 ; 用户态数据段 dq 0 - dq 0x0000891060000000 ; TSS段(低64位) + dq 0x0000891070000000 ; TSS段(低64位) dq 0 ; TSS段(高64位) gdt_end: -gdt_ptr: ; 0x104028 - dw gdt_end - gdt - 1 - dq gdt - - resb 6 - -idt_ptr: ; 0x104038 - dw 0x7ff - dq idt - - resb 14 - + section .cpumeta.idt align=4096 global idt idt: resq 512 ; 16 bytes per descriptor (512 q-bytes) - section .cpumeta.tss alogn=4096 + section .cpumeta.tss align=4096 global TSS TSS: dd 0 diff --git a/src/metaverse.lds b/src/metaverse.lds index f4b2bdb..1c8009e 100644 --- a/src/metaverse.lds +++ b/src/metaverse.lds @@ -17,6 +17,18 @@ SECTIONS { { *(.cpumeta) } + .cpumeta.tblptrs ALIGN(4096) : + { + *(cpumeta.tblptrs) + } + .cpumeta.gdt ALIGN(4096) : + { + *(.cpumeta.gdt) + } + .cpumeta.idt ALIGN(4096) : + { + *(.cpumeta.idt) + } .cpumeta.tss ALIGN(4096) : { *(.cpumeta.tss)