forked from metaverse/kernel-dev
Compare commits
No commits in common. "320ceaa56dff2ce20ae9164b3d8221158d5556d7" and "925ff4777daa5434ef6485d6744c6e3894d11d68" have entirely different histories.
320ceaa56d
...
925ff4777d
5
Makefile
5
Makefile
|
@ -1,6 +1,6 @@
|
||||||
SOURCE := $(shell pwd)/src/scripts
|
SOURCE := $(shell pwd)/src/scripts
|
||||||
|
|
||||||
.PHONY: all clear run debug config disass
|
.PHONY: all clear run debug config
|
||||||
|
|
||||||
all: config
|
all: config
|
||||||
@make -C src all --no-print-directory
|
@make -C src all --no-print-directory
|
||||||
|
@ -25,6 +25,3 @@ config:
|
||||||
touch metaverse_kernel; \
|
touch metaverse_kernel; \
|
||||||
"${SOURCE}/depcheck"; \
|
"${SOURCE}/depcheck"; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
disass:
|
|
||||||
objdump -D src/metaverse.elf > kerndisass.txt
|
|
||||||
|
|
|
@ -9,8 +9,7 @@
|
||||||
*
|
*
|
||||||
* 物理地址空间:
|
* 物理地址空间:
|
||||||
*
|
*
|
||||||
* * 0 \~ 1MB:保留。
|
* * 0 \~ 2MB:不使用,不映射
|
||||||
* * 1MB \~ 2MB:内核头。
|
|
||||||
* * 2MB \~ 4MB:中断栈。
|
* * 2MB \~ 4MB:中断栈。
|
||||||
* * 4MB \~ 16MB:内核栈。
|
* * 4MB \~ 16MB:内核栈。
|
||||||
* * 16MB \~ ?:内核镜像。
|
* * 16MB \~ ?:内核镜像。
|
||||||
|
|
|
@ -16,6 +16,14 @@ typedef struct __raw_allocator_cell
|
||||||
} raw_allocator_cell;
|
} raw_allocator_cell;
|
||||||
#define raw_allocator_next_cell(cell) (raw_allocator_cell *)((void *)((cell)->content) + (cell)->capacity)
|
#define raw_allocator_next_cell(cell) (raw_allocator_cell *)((void *)((cell)->content) + (cell)->capacity)
|
||||||
|
|
||||||
|
// 原始分配器
|
||||||
|
//
|
||||||
|
// 包括至少一个cell,分配时像cell的分裂一样将空白的一段分成两段,
|
||||||
|
// 释放时,只把length归零,并不将cell合并。
|
||||||
|
// length=0的cell称为空cell
|
||||||
|
//
|
||||||
|
// 统计从上次细胞合并以来free的调用次数,当调用次数很多或可用空间不足时
|
||||||
|
// 触发细胞合并。
|
||||||
/**
|
/**
|
||||||
* @name raw_allocator_t
|
* @name raw_allocator_t
|
||||||
*
|
*
|
||||||
|
@ -25,8 +33,6 @@ typedef struct __raw_allocator_cell
|
||||||
*
|
*
|
||||||
* 统计从上次细胞合并以来free的调用次数,当调用次数达到`RAW_ALLOCATOR_FREE_MAX`或无可用空间时触发细胞合并。
|
* 统计从上次细胞合并以来free的调用次数,当调用次数达到`RAW_ALLOCATOR_FREE_MAX`或无可用空间时触发细胞合并。
|
||||||
*
|
*
|
||||||
* 使用建议:只在少量allocate和free的情况下使用。使用大量allocate时效率低下并难以得到内存安全保证。
|
|
||||||
*
|
|
||||||
* @internal free_count
|
* @internal free_count
|
||||||
*
|
*
|
||||||
* free方法的调用次数,达到`RAW_ALLOCATOR_FREE_MAX`时归零。
|
* free方法的调用次数,达到`RAW_ALLOCATOR_FREE_MAX`时归零。
|
||||||
|
|
|
@ -6,13 +6,12 @@ init64:
|
||||||
endbr64
|
endbr64
|
||||||
cli
|
cli
|
||||||
|
|
||||||
|
; 加载段寄存器
|
||||||
mov rax, 0x1000000
|
mov rax, 0x1000000
|
||||||
mov rbp, rax
|
mov rbp, rax
|
||||||
mov rsp, rax
|
mov rsp, rax
|
||||||
mov rdi, rbx
|
mov rdi, rbx
|
||||||
|
|
||||||
lidt [0x104010]
|
|
||||||
|
|
||||||
; 加载系统调用相关寄存器
|
; 加载系统调用相关寄存器
|
||||||
; IA32_STAR = 0x0018_0008_0000_0000
|
; IA32_STAR = 0x0018_0008_0000_0000
|
||||||
mov rcx, 0xc0000081
|
mov rcx, 0xc0000081
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
section .entry
|
section .entry
|
||||||
extern init64
|
extern init64
|
||||||
; 寄存器ebx是multiboot2 information,不可以使用
|
; 寄存器ebx是multiboot2 information,不可以使用
|
||||||
|
;
|
||||||
|
; 由于这个代码是32位环境的代码,而链接器链接时会把它当作64位代码链接
|
||||||
|
; 所以这里所有的使用了常数的位置都要通过指令写入
|
||||||
init32:
|
init32:
|
||||||
cli
|
cli
|
||||||
|
|
||||||
|
@ -34,9 +37,19 @@ init32:
|
||||||
add edi, 4
|
add edi, 4
|
||||||
loop init32_loop0
|
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寄存器
|
; 加载GDTR、段寄存器和TR寄存器
|
||||||
db 0x66
|
db 0x66
|
||||||
lgdt [0x104000] ; gdt_ptr
|
lgdt [0x104028] ; gdt_ptr
|
||||||
mov ax, 0x10
|
mov ax, 0x10
|
||||||
mov ds, ax
|
mov ds, ax
|
||||||
mov ss, ax
|
mov ss, ax
|
||||||
|
@ -73,6 +86,7 @@ init32:
|
||||||
section .cpumeta align=4096
|
section .cpumeta align=4096
|
||||||
global PML4
|
global PML4
|
||||||
; 分页
|
; 分页
|
||||||
|
; 链接器会把这些数据替换掉所以要在代码中重新设置
|
||||||
PML4:
|
PML4:
|
||||||
dq 0x003 + PDPT0
|
dq 0x003 + PDPT0
|
||||||
resq 511
|
resq 511
|
||||||
|
@ -84,20 +98,7 @@ PDPT0:
|
||||||
PD0:
|
PD0:
|
||||||
resq 512
|
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:
|
gdt:
|
||||||
dq 0
|
dq 0
|
||||||
dq 0x0020980000000000 ; 内核态代码段
|
dq 0x0020980000000000 ; 内核态代码段
|
||||||
|
@ -105,16 +106,27 @@ gdt:
|
||||||
dq 0x0020f80000000000 ; 用户态代码段
|
dq 0x0020f80000000000 ; 用户态代码段
|
||||||
dq 0x0000f20000000000 ; 用户态数据段
|
dq 0x0000f20000000000 ; 用户态数据段
|
||||||
dq 0
|
dq 0
|
||||||
dq 0x0000891070000000 ; TSS段(低64位)
|
dq 0x0000891060000000 ; TSS段(低64位)
|
||||||
dq 0 ; TSS段(高64位)
|
dq 0 ; TSS段(高64位)
|
||||||
gdt_end:
|
gdt_end:
|
||||||
|
|
||||||
section .cpumeta.idt align=4096
|
gdt_ptr: ; 0x104028
|
||||||
|
dw gdt_end - gdt - 1
|
||||||
|
dq gdt
|
||||||
|
|
||||||
|
resb 6
|
||||||
|
|
||||||
|
idt_ptr: ; 0x104038
|
||||||
|
dw 0x7ff
|
||||||
|
dq idt
|
||||||
|
|
||||||
|
resb 14
|
||||||
|
|
||||||
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 align=4096
|
section .cpumeta.tss alogn=4096
|
||||||
global TSS
|
global TSS
|
||||||
TSS:
|
TSS:
|
||||||
dd 0
|
dd 0
|
||||||
|
|
|
@ -17,18 +17,6 @@ SECTIONS {
|
||||||
{
|
{
|
||||||
*(.cpumeta)
|
*(.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 ALIGN(4096) :
|
||||||
{
|
{
|
||||||
*(.cpumeta.tss)
|
*(.cpumeta.tss)
|
||||||
|
|
Loading…
Reference in New Issue