From 925ff4777daa5434ef6485d6744c6e3894d11d68 Mon Sep 17 00:00:00 2001 From: pointer-to-bios Date: Mon, 26 Feb 2024 22:02:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=AD=E6=96=AD=E5=90=91?= =?UTF-8?q?=E9=87=8F=E8=A1=A8=E5=8F=8ATSS=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/kernel/arch/x86_64/interrupt.h | 10 +++++----- include/kernel/arch/x86_64/kernel.h | 2 ++ src/kernel/arch/x86_64/entry.s | 3 --- src/kernel/arch/x86_64/entry32.s | 26 +++++++++++++++++++++----- src/metaverse.lds | 6 +++++- 5 files changed, 33 insertions(+), 14 deletions(-) diff --git a/include/kernel/arch/x86_64/interrupt.h b/include/kernel/arch/x86_64/interrupt.h index 04c9dfd..8e2dc9a 100644 --- a/include/kernel/arch/x86_64/interrupt.h +++ b/include/kernel/arch/x86_64/interrupt.h @@ -7,7 +7,7 @@ /** * @name gate_descriptor_t * @addindex 平台依赖结构 x86_64 - * + * * 门描述符的结构体形式。 */ typedef struct __gate_descriptor_t @@ -23,12 +23,12 @@ typedef struct __gate_descriptor_t /** * @name INTERRUPT_DESCRIPTOR_FLAG_IST * @addindex 平台依赖结构 x86_64 - * + * * `gate_descriptor_t`的`flags`的标志位。 - * + * * `ssp`代表一个tss描述符在任务段中的的索引。 */ -#define INTERRUPT_DESCRIPTOR_FLAG_IST(ssp) (ssp) +#define INTERRUPT_DESCRIPTOR_FLAG_IST 1 // 在第15位上有一个表示代码段是否存在的标志位,代码段总是存在,故直接设置为1 #define INTERRUPT_DESCRIPTOR_FLAG_TYPE_INTERRUPT (0x8e << 8) @@ -36,7 +36,7 @@ typedef struct __gate_descriptor_t /** * @name idt - * + * * 中断描述符表。 */ extern gate_descriptor_t idt[256]; diff --git a/include/kernel/arch/x86_64/kernel.h b/include/kernel/arch/x86_64/kernel.h index 5ac5529..af07ab4 100644 --- a/include/kernel/arch/x86_64/kernel.h +++ b/include/kernel/arch/x86_64/kernel.h @@ -12,4 +12,6 @@ */ extern void prepare_stack(); +extern u32 TSS[26]; + #endif diff --git a/src/kernel/arch/x86_64/entry.s b/src/kernel/arch/x86_64/entry.s index 54a341c..efbb1ad 100644 --- a/src/kernel/arch/x86_64/entry.s +++ b/src/kernel/arch/x86_64/entry.s @@ -26,9 +26,6 @@ init64: lea rax, [systemcall_procedure] wrmsr - ; 加载中断相关寄存器 - ; 需要加载寄存器IA32_INTERRUPT_SSP_TABLE - jmp kmain section .multiboot2 align=8 diff --git a/src/kernel/arch/x86_64/entry32.s b/src/kernel/arch/x86_64/entry32.s index f68326e..e05cffb 100644 --- a/src/kernel/arch/x86_64/entry32.s +++ b/src/kernel/arch/x86_64/entry32.s @@ -47,7 +47,7 @@ init32: ; 设置gdt_ptr mov eax, 0x10402a ; gdt_ptr + 2 mov dword [eax], 0x104000 ; gdt - ; 加载GDTR和段寄存器 + ; 加载GDTR、段寄存器和TR寄存器 db 0x66 lgdt [0x104028] ; gdt_ptr mov ax, 0x10 @@ -56,6 +56,8 @@ init32: mov es, ax mov fs, ax mov gs, ax + mov ax, 0x30 + ltr ax ; 打开PAE mov eax, cr4 @@ -99,10 +101,13 @@ PD0: ; 分段 gdt: dq 0 - dq 0x0020980000000000 ; 内核态代码段 - dq 0x0000920000000000 ; 内核态数据段 - dq 0x0020f80000000000 ; 用户态代码段 - dq 0x0000f20000000000 ; 用户态数据段 + dq 0x0020980000000000 ; 内核态代码段 + dq 0x0000920000000000 ; 内核态数据段 + dq 0x0020f80000000000 ; 用户态代码段 + dq 0x0000f20000000000 ; 用户态数据段 + dq 0 + dq 0x0000891060000000 ; TSS段(低64位) + dq 0 ; TSS段(高64位) gdt_end: gdt_ptr: ; 0x104028 @@ -120,3 +125,14 @@ idt_ptr: ; 0x104038 global idt idt: resq 512 ; 16 bytes per descriptor (512 q-bytes) + + section .cpumeta.tss alogn=4096 + global TSS +TSS: + dd 0 + dq 0x1000000 ; (rsp0)内核栈 + dq 0 ; (rsp1) + dq 0 ; (rsp2) + dq 0 + dq 0x400000 ; (ist1)中断栈 + resb 104 - ($ - TSS) diff --git a/src/metaverse.lds b/src/metaverse.lds index 87da7f2..f4b2bdb 100644 --- a/src/metaverse.lds +++ b/src/metaverse.lds @@ -13,10 +13,14 @@ SECTIONS { { *(.multiboot2) } - .cpumeta : + .cpumeta ALIGN(4096) : { *(.cpumeta) } + .cpumeta.tss ALIGN(4096) : + { + *(.cpumeta.tss) + } . = 16M; .text : {