重构内存分配器、增加中断支持、整理rust运行时环境 #4
|
@ -7,7 +7,7 @@
|
||||||
/**
|
/**
|
||||||
* @name gate_descriptor_t
|
* @name gate_descriptor_t
|
||||||
* @addindex 平台依赖结构 x86_64
|
* @addindex 平台依赖结构 x86_64
|
||||||
*
|
*
|
||||||
* 门描述符的结构体形式。
|
* 门描述符的结构体形式。
|
||||||
*/
|
*/
|
||||||
typedef struct __gate_descriptor_t
|
typedef struct __gate_descriptor_t
|
||||||
|
@ -23,12 +23,12 @@ typedef struct __gate_descriptor_t
|
||||||
/**
|
/**
|
||||||
* @name INTERRUPT_DESCRIPTOR_FLAG_IST
|
* @name INTERRUPT_DESCRIPTOR_FLAG_IST
|
||||||
* @addindex 平台依赖结构 x86_64
|
* @addindex 平台依赖结构 x86_64
|
||||||
*
|
*
|
||||||
* `gate_descriptor_t`的`flags`的标志位。
|
* `gate_descriptor_t`的`flags`的标志位。
|
||||||
*
|
*
|
||||||
* `ssp`代表一个tss描述符在任务段中的的索引。
|
* `ssp`代表一个tss描述符在任务段中的的索引。
|
||||||
*/
|
*/
|
||||||
#define INTERRUPT_DESCRIPTOR_FLAG_IST(ssp) (ssp)
|
#define INTERRUPT_DESCRIPTOR_FLAG_IST 1
|
||||||
|
|
||||||
// 在第15位上有一个表示代码段是否存在的标志位,代码段总是存在,故直接设置为1
|
// 在第15位上有一个表示代码段是否存在的标志位,代码段总是存在,故直接设置为1
|
||||||
#define INTERRUPT_DESCRIPTOR_FLAG_TYPE_INTERRUPT (0x8e << 8)
|
#define INTERRUPT_DESCRIPTOR_FLAG_TYPE_INTERRUPT (0x8e << 8)
|
||||||
|
@ -36,7 +36,7 @@ typedef struct __gate_descriptor_t
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @name idt
|
* @name idt
|
||||||
*
|
*
|
||||||
* 中断描述符表。
|
* 中断描述符表。
|
||||||
*/
|
*/
|
||||||
extern gate_descriptor_t idt[256];
|
extern gate_descriptor_t idt[256];
|
||||||
|
|
|
@ -12,4 +12,6 @@
|
||||||
*/
|
*/
|
||||||
extern void prepare_stack();
|
extern void prepare_stack();
|
||||||
|
|
||||||
|
extern u32 TSS[26];
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -26,9 +26,6 @@ init64:
|
||||||
lea rax, [systemcall_procedure]
|
lea rax, [systemcall_procedure]
|
||||||
wrmsr
|
wrmsr
|
||||||
|
|
||||||
; 加载中断相关寄存器
|
|
||||||
; 需要加载寄存器IA32_INTERRUPT_SSP_TABLE
|
|
||||||
|
|
||||||
jmp kmain
|
jmp kmain
|
||||||
|
|
||||||
section .multiboot2 align=8
|
section .multiboot2 align=8
|
||||||
|
|
|
@ -47,7 +47,7 @@ init32:
|
||||||
; 设置gdt_ptr
|
; 设置gdt_ptr
|
||||||
mov eax, 0x10402a ; gdt_ptr + 2
|
mov eax, 0x10402a ; gdt_ptr + 2
|
||||||
mov dword [eax], 0x104000 ; gdt
|
mov dword [eax], 0x104000 ; gdt
|
||||||
; 加载GDTR和段寄存器
|
; 加载GDTR、段寄存器和TR寄存器
|
||||||
db 0x66
|
db 0x66
|
||||||
lgdt [0x104028] ; gdt_ptr
|
lgdt [0x104028] ; gdt_ptr
|
||||||
mov ax, 0x10
|
mov ax, 0x10
|
||||||
|
@ -56,6 +56,8 @@ init32:
|
||||||
mov es, ax
|
mov es, ax
|
||||||
mov fs, ax
|
mov fs, ax
|
||||||
mov gs, ax
|
mov gs, ax
|
||||||
|
mov ax, 0x30
|
||||||
|
ltr ax
|
||||||
|
|
||||||
; 打开PAE
|
; 打开PAE
|
||||||
mov eax, cr4
|
mov eax, cr4
|
||||||
|
@ -99,10 +101,13 @@ PD0:
|
||||||
; 分段
|
; 分段
|
||||||
gdt:
|
gdt:
|
||||||
dq 0
|
dq 0
|
||||||
dq 0x0020980000000000 ; 内核态代码段
|
dq 0x0020980000000000 ; 内核态代码段
|
||||||
dq 0x0000920000000000 ; 内核态数据段
|
dq 0x0000920000000000 ; 内核态数据段
|
||||||
dq 0x0020f80000000000 ; 用户态代码段
|
dq 0x0020f80000000000 ; 用户态代码段
|
||||||
dq 0x0000f20000000000 ; 用户态数据段
|
dq 0x0000f20000000000 ; 用户态数据段
|
||||||
|
dq 0
|
||||||
|
dq 0x0000891060000000 ; TSS段(低64位)
|
||||||
|
dq 0 ; TSS段(高64位)
|
||||||
gdt_end:
|
gdt_end:
|
||||||
|
|
||||||
gdt_ptr: ; 0x104028
|
gdt_ptr: ; 0x104028
|
||||||
|
@ -120,3 +125,14 @@ idt_ptr: ; 0x104038
|
||||||
global idt
|
global idt
|
||||||
idt:
|
idt:
|
||||||
resq 512 ; 16 bytes per descriptor (512 q-bytes)
|
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)
|
||||||
|
|
|
@ -13,10 +13,14 @@ SECTIONS {
|
||||||
{
|
{
|
||||||
*(.multiboot2)
|
*(.multiboot2)
|
||||||
}
|
}
|
||||||
.cpumeta :
|
.cpumeta ALIGN(4096) :
|
||||||
{
|
{
|
||||||
*(.cpumeta)
|
*(.cpumeta)
|
||||||
}
|
}
|
||||||
|
.cpumeta.tss ALIGN(4096) :
|
||||||
|
{
|
||||||
|
*(.cpumeta.tss)
|
||||||
|
}
|
||||||
. = 16M;
|
. = 16M;
|
||||||
.text :
|
.text :
|
||||||
{
|
{
|
||||||
|
|
Reference in New Issue