forked from metaverse/kernel-dev
Compare commits
No commits in common. "7e22dd604f2eec2e102ffc1f82b76485bc1f4c6d" and "57aaf60af5fc29e0a542b61b2e32c0c902ffd2cd" have entirely different histories.
7e22dd604f
...
57aaf60af5
|
@ -1,27 +0,0 @@
|
||||||
#ifndef X86_64_INTERRUPT_H
|
|
||||||
#define X86_64_INTERRUPT_H 1
|
|
||||||
|
|
||||||
#include <types.h>
|
|
||||||
#include <utils.h>
|
|
||||||
|
|
||||||
typedef struct __gate_descriptor_t
|
|
||||||
{
|
|
||||||
u16 offset_01;
|
|
||||||
u16 segment_selector; // for code segment
|
|
||||||
u16 flags;
|
|
||||||
u16 offset_23;
|
|
||||||
u32 offset_4567;
|
|
||||||
u32 reserved;
|
|
||||||
} DISALIGNED gate_descriptor_t;
|
|
||||||
|
|
||||||
// interrupt stack table,每个表项都指向tss
|
|
||||||
// 需要加载寄存器IA32_INTERRUPT_SSP_TABLE
|
|
||||||
#define INTERRUPT_DESCRIPTOR_FLAG_IST(ssp) (ssp)
|
|
||||||
|
|
||||||
// 在第15位上有一个表示代码段是否存在的标志位,代码段总是存在,故直接设置为1
|
|
||||||
#define INTERRUPT_DESCRIPTOR_FLAG_TYPE_INTERRUPT (0x8e << 8)
|
|
||||||
#define INTERRUPT_DESCRIPTOR_FLAG_TYPE_TRAP (0x8f << 8)
|
|
||||||
|
|
||||||
extern gate_descriptor_t idt[256];
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -15,7 +15,7 @@ typedef enum __memm_page_size
|
||||||
|
|
||||||
extern u64 PML4[512];
|
extern u64 PML4[512];
|
||||||
|
|
||||||
#define MEMM_PAGE_TABLE_FLAGS_MASK ((u64)0xfff)
|
#define MEMM_PAGE_TABLE_FLAGS_AREA ((u64)0xfff)
|
||||||
|
|
||||||
/* 页对齐掩码 */
|
/* 页对齐掩码 */
|
||||||
#define MEMM_4K_ALIGN_MASK ((u64)0xfff)
|
#define MEMM_4K_ALIGN_MASK ((u64)0xfff)
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
#ifndef X86_64_SYSCALL
|
|
||||||
#define X86_64_SYSCALL 1
|
|
||||||
|
|
||||||
#include <types.h>
|
|
||||||
|
|
||||||
extern void *system_calls_table[256];
|
|
||||||
|
|
||||||
// 系统调用使用的寄存器:
|
|
||||||
// rax - 调用号
|
|
||||||
// rbx - 系统调用程序保留
|
|
||||||
// rcx - rip寄存器缓存
|
|
||||||
// rdi - 系统调用程序保留
|
|
||||||
// rdx - 参数1
|
|
||||||
// r8 - 参数2
|
|
||||||
// r9 - 参数3
|
|
||||||
// r10 - 参数4
|
|
||||||
// r11 - rflags寄存器缓存
|
|
||||||
// r12 - 参数5
|
|
||||||
// r13 - 参数6
|
|
||||||
// r14 - 参数7
|
|
||||||
// r15 - 参数8
|
|
||||||
|
|
||||||
// 系统调用时,使用内核主堆栈
|
|
||||||
// 故设置一组函数,用于在sysret前保存和在syscall后加载
|
|
||||||
// rbp, rsp的函数
|
|
||||||
extern void save_kernel_stack();
|
|
||||||
extern void load_kernel_stack();
|
|
||||||
|
|
||||||
extern void set_kernel_stack_cache(usize stack);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,7 +0,0 @@
|
||||||
#ifndef INTERRUPT_H
|
|
||||||
#define INTERRUPT_H 1
|
|
||||||
|
|
||||||
void interrupt_open();
|
|
||||||
void interrupt_close();
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -23,7 +23,7 @@
|
||||||
/* 只分配不映射空间 */
|
/* 只分配不映射空间 */
|
||||||
#define MEMM_ALLOC_ONLY_MEMORY (128 * 1024 * 1024)
|
#define MEMM_ALLOC_ONLY_MEMORY (128 * 1024 * 1024)
|
||||||
|
|
||||||
typedef void *(*memm_allocate_t)(void *allocator, usize size);
|
typedef void *(*memm_allocate_t)(void *allocator, usize size, usize align);
|
||||||
typedef void (*memm_free_t)(void *allocator, void *mem);
|
typedef void (*memm_free_t)(void *allocator, void *mem);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
#ifndef SYSCALL_H
|
|
||||||
#define SYSCALL_H 1
|
|
||||||
|
|
||||||
#ifdef __x86_64__
|
|
||||||
#include <kernel/arch/x86_64/syscall.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void syscall_init();
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -33,7 +33,7 @@ bool lst_remove(lst_iterator_t *lst, usize left, usize right, bool force);
|
||||||
/*
|
/*
|
||||||
在`lst`中添加一个线段[left,right)
|
在`lst`中添加一个线段[left,right)
|
||||||
force=true时忽略已经存在于`lst`中的线段
|
force=true时忽略已经存在于`lst`中的线段
|
||||||
force=false时若有存在于`lst`中的线段,不添加任何线段,返回false,否则返回true
|
force=false时若有存在于`lst`中的线段,只添加这些部分之外的线段,返回false,否则返回true
|
||||||
*/
|
*/
|
||||||
bool lst_add(lst_iterator_t *lst, usize left, usize right, bool force);
|
bool lst_add(lst_iterator_t *lst, usize left, usize right, bool force);
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,14 @@
|
||||||
|
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
|
|
||||||
|
#define UTILS_BIT_GET(byte, bit) ((byte) & (1 << (bit)))
|
||||||
|
#define UTILS_BIT_SET(byte, bit) ((byte) |= (1 << (bit)));
|
||||||
|
#define UTILS_BIT_RESET(byte, bit) ((byte) &= ~(1 << (bit)));
|
||||||
|
|
||||||
|
#define UTILS_BITMAP_GET(map, bit) (((u8 *)(map))[bit / 8] & (1 << ((bit) % 8)))
|
||||||
|
#define UTILS_BITMAP_SET(map, bit) (((u8 *)(map))[bit / 8] |= (1 << ((bit) % 8)));
|
||||||
|
#define UTILS_BITMAP_RESET(map, bit) (((u8 *)(map))[bit / 8] &= ~(1 << ((bit) % 8)));
|
||||||
|
|
||||||
#define DISALIGNED __attribute__((packed))
|
#define DISALIGNED __attribute__((packed))
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -11,7 +11,7 @@ ifdef release
|
||||||
CCFLAGS := ${CCFLAGS} -O2
|
CCFLAGS := ${CCFLAGS} -O2
|
||||||
endif
|
endif
|
||||||
|
|
||||||
C_SRCS = main.c tty.c font.c memm.c memm_${ARCH}.c raw.c time.c syscall_${ARCH}.c
|
C_SRCS = main.c tty.c font.c memm.c memm_${ARCH}.c raw.c time.c
|
||||||
C_OBJS = ${C_SRCS:.c=.c.o}
|
C_OBJS = ${C_SRCS:.c=.c.o}
|
||||||
|
|
||||||
################################
|
################################
|
||||||
|
@ -26,7 +26,7 @@ endif
|
||||||
ASMFLAGS := ${ASMFLAGS}
|
ASMFLAGS := ${ASMFLAGS}
|
||||||
ASMFLAGS32 = -f elf32
|
ASMFLAGS32 = -f elf32
|
||||||
|
|
||||||
S_SRCS = entry32.s entry.s memm_${ARCH}.s kernel.s syscall_${ARCH}.s
|
S_SRCS = entry32.s entry.s memm_${ARCH}.s kernel.s
|
||||||
S_OBJS = ${S_SRCS:.s=.s.o}
|
S_OBJS = ${S_SRCS:.s=.s.o}
|
||||||
|
|
||||||
################################
|
################################
|
||||||
|
|
|
@ -1,31 +1,13 @@
|
||||||
section .entry align=8
|
section .entry align=8
|
||||||
extern kmain
|
extern kmain
|
||||||
extern systemcall_procedure
|
|
||||||
global init64
|
global init64
|
||||||
init64:
|
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
|
||||||
|
|
||||||
; 加载系统调用相关寄存器
|
|
||||||
; IA32_STAR = 0x0018_0008_0000_0000
|
|
||||||
mov rcx, 0xc0000081
|
|
||||||
mov rax, 0x0018000800000000
|
|
||||||
wrmsr
|
|
||||||
; IA32_FMASK = 0xffff_ffff
|
|
||||||
inc rcx
|
|
||||||
mov rax, 0xffffffff
|
|
||||||
wrmsr
|
|
||||||
; IA32_LSTAR = [systemcall_procedure]
|
|
||||||
lea rcx, [rcx + 2]
|
|
||||||
lea rax, [systemcall_procedure]
|
|
||||||
wrmsr
|
|
||||||
|
|
||||||
jmp kmain
|
jmp kmain
|
||||||
|
|
||||||
section .multiboot2 align=8
|
section .multiboot2 align=8
|
||||||
|
|
|
@ -37,13 +37,6 @@ 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
|
; 设置gdt_ptr
|
||||||
mov eax, 0x10402a ; gdt_ptr + 2
|
mov eax, 0x10402a ; gdt_ptr + 2
|
||||||
mov dword [eax], 0x104000 ; gdt
|
mov dword [eax], 0x104000 ; gdt
|
||||||
|
@ -105,18 +98,6 @@ gdt:
|
||||||
dq 0x0000f20000000000 ; 用户态数据段
|
dq 0x0000f20000000000 ; 用户态数据段
|
||||||
gdt_end:
|
gdt_end:
|
||||||
|
|
||||||
gdt_ptr: ; 0x104028
|
gdt_ptr:
|
||||||
dw gdt_end - gdt - 1
|
dw gdt_end - gdt - 1
|
||||||
dq gdt
|
dq gdt
|
||||||
|
|
||||||
resb 6
|
|
||||||
|
|
||||||
idt_ptr: ; 0x104038
|
|
||||||
dw 0x7ff
|
|
||||||
dq idt
|
|
||||||
|
|
||||||
resb 14
|
|
||||||
|
|
||||||
global idt
|
|
||||||
idt:
|
|
||||||
resq 512 ; 16 bytes per descriptor (512 q-bytes)
|
|
||||||
|
|
|
@ -19,13 +19,3 @@ prepare_stack:
|
||||||
mov rax, [rax]
|
mov rax, [rax]
|
||||||
mov [rsp], rax
|
mov [rsp], rax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
global interrupt_open
|
|
||||||
interrupt_open:
|
|
||||||
sti
|
|
||||||
ret
|
|
||||||
|
|
||||||
global interrupt_close
|
|
||||||
interrupt_close:
|
|
||||||
cli
|
|
||||||
ret
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
#include <kernel/syscall.h>
|
|
||||||
|
|
||||||
#include <libk/string.h>
|
|
||||||
|
|
||||||
void syscall_init()
|
|
||||||
{
|
|
||||||
memset(&system_calls_table, 0, sizeof(system_calls_table));
|
|
||||||
}
|
|
|
@ -1,87 +0,0 @@
|
||||||
section .data
|
|
||||||
global system_calls_table
|
|
||||||
system_calls_table:
|
|
||||||
resq 256
|
|
||||||
|
|
||||||
kernel_stack_cache:
|
|
||||||
dq 0, 0 ; 分别为 rbp, rsp
|
|
||||||
|
|
||||||
section .text
|
|
||||||
global systemcall_procedure
|
|
||||||
global save_kernel_stack
|
|
||||||
systemcall_procedure:
|
|
||||||
endbr64
|
|
||||||
call load_kernel_stack
|
|
||||||
push rbp
|
|
||||||
mov rbp, rsp
|
|
||||||
|
|
||||||
shl rax, 3 ; rax *= 8
|
|
||||||
; 将对应调用号的系统调用加载至rax
|
|
||||||
lea rdi, [system_calls_table]
|
|
||||||
lea rax, [rax + rdi]
|
|
||||||
; 判断是否为空调用
|
|
||||||
cmp rax, 0
|
|
||||||
je systemcall_procedure_none_call
|
|
||||||
mov rax, [rax]
|
|
||||||
; 调用对应的系统调用
|
|
||||||
call rax
|
|
||||||
|
|
||||||
leave
|
|
||||||
call save_kernel_stack
|
|
||||||
sysret
|
|
||||||
|
|
||||||
systemcall_procedure_none_call:
|
|
||||||
; TODO 调用了不存在的系统调用,属于无法恢复的错误,应保存错误状态并结束调用进程
|
|
||||||
; 暂时直接sysret
|
|
||||||
leave
|
|
||||||
call save_kernel_stack
|
|
||||||
sysret
|
|
||||||
|
|
||||||
; void set_kernel_stack_cache(usize stack)
|
|
||||||
set_kernel_stack_cache:
|
|
||||||
endbr64
|
|
||||||
push rax
|
|
||||||
|
|
||||||
lea rax, [kernel_stack_cache]
|
|
||||||
mov [rax], rdi
|
|
||||||
lea rax, [rax + 8]
|
|
||||||
mov [rax], rdi
|
|
||||||
|
|
||||||
pop rax
|
|
||||||
ret
|
|
||||||
|
|
||||||
save_kernel_stack:
|
|
||||||
endbr64
|
|
||||||
lea rbx, [kernel_stack_cache]
|
|
||||||
; 交换[rbx]与rbp
|
|
||||||
mov rdi, [rbx]
|
|
||||||
xor rbp, rdi
|
|
||||||
xor rdi, rbp
|
|
||||||
xor rbp, rdi
|
|
||||||
mov [rbx], rdi
|
|
||||||
lea rbx, [rbx + 8]
|
|
||||||
; 交换[rbx]与rsp
|
|
||||||
mov rdi, [rbx]
|
|
||||||
xor rsp, rdi
|
|
||||||
xor rdi, rsp
|
|
||||||
xor rsp, rdi
|
|
||||||
mov [rbx], rdi
|
|
||||||
ret
|
|
||||||
|
|
||||||
load_kernel_stack:
|
|
||||||
endbr64
|
|
||||||
lea rbx, [kernel_stack_cache]
|
|
||||||
; 交换[rbx]与rbp
|
|
||||||
mov rdi, [rbx]
|
|
||||||
xor rbp, rdi
|
|
||||||
xor rdi, rbp
|
|
||||||
xor rbp, rdi
|
|
||||||
mov [rbx], rdi
|
|
||||||
lea rbx, [rbx + 8]
|
|
||||||
; 交换[rbx]与rsp
|
|
||||||
mov rdi, [rbx]
|
|
||||||
xor rsp, rdi
|
|
||||||
xor rdi, rsp
|
|
||||||
xor rsp, rdi
|
|
||||||
mov [rbx], rdi
|
|
||||||
ret
|
|
|
@ -1,8 +1,6 @@
|
||||||
#include <kernel/kernel.h>
|
#include <kernel/kernel.h>
|
||||||
#include <kernel/tty.h>
|
#include <kernel/tty.h>
|
||||||
#include <kernel/memm.h>
|
#include <kernel/memm.h>
|
||||||
#include <kernel/interrupt.h>
|
|
||||||
#include <kernel/syscall.h>
|
|
||||||
|
|
||||||
#include <libk/multiboot2.h>
|
#include <libk/multiboot2.h>
|
||||||
#include <libk/math.h>
|
#include <libk/math.h>
|
||||||
|
@ -44,9 +42,6 @@ void kmain(void *mb2_bootinfo)
|
||||||
tty *tty0 = tty_new(tty_type_raw_framebuffer, tty_mode_text);
|
tty *tty0 = tty_new(tty_type_raw_framebuffer, tty_mode_text);
|
||||||
tty_set_framebuffer(tty0, &fb);
|
tty_set_framebuffer(tty0, &fb);
|
||||||
|
|
||||||
// 初始化系统调用
|
|
||||||
syscall_init();
|
|
||||||
|
|
||||||
// 为rust准备正确对齐的栈
|
// 为rust准备正确对齐的栈
|
||||||
prepare_stack();
|
prepare_stack();
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ void raw_allocator_new(raw_allocator_t *allocator, usize size)
|
||||||
allocator->cells[0].length = 0;
|
allocator->cells[0].length = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *raw_allocator_allocate(raw_allocator_t *allocator, usize size)
|
void *raw_allocator_allocate(raw_allocator_t *allocator, usize size, usize align)
|
||||||
{
|
{
|
||||||
usize real_size = size;
|
usize real_size = size;
|
||||||
align_to(real_size, 16);
|
align_to(real_size, 16);
|
||||||
|
|
|
@ -24,7 +24,7 @@ mem_manager_t *memm_new(usize mem_size)
|
||||||
MEMM_RAW_ALLOCATOR, 0);
|
MEMM_RAW_ALLOCATOR, 0);
|
||||||
|
|
||||||
allocator_iterator_t *alcatr_ind = allocator0->allocate(
|
allocator_iterator_t *alcatr_ind = allocator0->allocate(
|
||||||
&allocator0->allocator_instance, sizeof(allocator_iterator_t));
|
&allocator0->allocator_instance, sizeof(allocator_iterator_t), 0);
|
||||||
|
|
||||||
alcatr_ind->allocator = allocator0;
|
alcatr_ind->allocator = allocator0;
|
||||||
alcatr_ind->left = nullptr;
|
alcatr_ind->left = nullptr;
|
||||||
|
@ -37,7 +37,7 @@ mem_manager_t *memm_new(usize mem_size)
|
||||||
align_to(pmc_size, 8);
|
align_to(pmc_size, 8);
|
||||||
pmc_size /= 8;
|
pmc_size /= 8;
|
||||||
|
|
||||||
memory_manager.page_map = allocator0->allocate(&allocator0->allocator_instance, pmc_size);
|
memory_manager.page_map = allocator0->allocate(&allocator0->allocator_instance, pmc_size, 0);
|
||||||
memset(memory_manager.page_map, 0, pmc_size);
|
memset(memory_manager.page_map, 0, pmc_size);
|
||||||
memset(memory_manager.page_map, 0xff, MEMM_ALLOC_ONLY_MEMORY / MEMM_PAGE_SIZE / 8);
|
memset(memory_manager.page_map, 0xff, MEMM_ALLOC_ONLY_MEMORY / MEMM_PAGE_SIZE / 8);
|
||||||
for (usize i = (MEMM_ALLOC_ONLY_MEMORY / MEMM_PAGE_SIZE / 8) * (u8)8;
|
for (usize i = (MEMM_ALLOC_ONLY_MEMORY / MEMM_PAGE_SIZE / 8) * (u8)8;
|
||||||
|
@ -48,7 +48,7 @@ mem_manager_t *memm_new(usize mem_size)
|
||||||
|
|
||||||
// 配置分配器页地图
|
// 配置分配器页地图
|
||||||
memory_manager.map_with_allocator =
|
memory_manager.map_with_allocator =
|
||||||
allocator0->allocate(&allocator0->allocator_instance, pmc_size);
|
allocator0->allocate(&allocator0->allocator_instance, pmc_size, 0);
|
||||||
memset(memory_manager.map_with_allocator, 0, pmc_size);
|
memset(memory_manager.map_with_allocator, 0, pmc_size);
|
||||||
for (usize i = kernel_initial_size / MEMM_PAGE_SIZE;
|
for (usize i = kernel_initial_size / MEMM_PAGE_SIZE;
|
||||||
i < MEMM_ALLOC_ONLY_MEMORY / MEMM_PAGE_SIZE;
|
i < MEMM_ALLOC_ONLY_MEMORY / MEMM_PAGE_SIZE;
|
||||||
|
@ -59,7 +59,7 @@ mem_manager_t *memm_new(usize mem_size)
|
||||||
|
|
||||||
// 分配器释放页地图
|
// 分配器释放页地图
|
||||||
memory_manager.map_with_destructed_allocator =
|
memory_manager.map_with_destructed_allocator =
|
||||||
allocator0->allocate(&allocator0->allocator_instance, pmc_size);
|
allocator0->allocate(&allocator0->allocator_instance, pmc_size, 0);
|
||||||
memset(memory_manager.map_with_destructed_allocator, 0, pmc_size);
|
memset(memory_manager.map_with_destructed_allocator, 0, pmc_size);
|
||||||
|
|
||||||
// 配置空闲页线段搜索表
|
// 配置空闲页线段搜索表
|
||||||
|
@ -103,14 +103,14 @@ void *memm_find_and_allocate(allocator_iterator_t *allocator_ind, usize size, us
|
||||||
allocator_t *allocator = allocator_ind->allocator;
|
allocator_t *allocator = allocator_ind->allocator;
|
||||||
if (allocator->pid == pid && allocator->full == false)
|
if (allocator->pid == pid && allocator->full == false)
|
||||||
{ // 尝试用本节点分配
|
{ // 尝试用本节点分配
|
||||||
if ((ptr = allocator->allocate(&allocator->allocator_instance, size)) != nullptr)
|
if ((ptr = allocator->allocate(&allocator->allocator_instance, size, 0)) != nullptr)
|
||||||
{
|
{
|
||||||
*writeback = allocator;
|
*writeback = allocator;
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ((ptr = allocator->allocate(&allocator->allocator_instance, 0)) == nullptr)
|
if ((ptr = allocator->allocate(&allocator->allocator_instance, 0, 0)) == nullptr)
|
||||||
allocator->full = true;
|
allocator->full = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -197,7 +197,7 @@ void *memm_allocate(usize size, usize pid)
|
||||||
allind->left = nullptr;
|
allind->left = nullptr;
|
||||||
allind->right = nullptr;
|
allind->right = nullptr;
|
||||||
insert_allocator(memory_manager.allocators, allind);
|
insert_allocator(memory_manager.allocators, allind);
|
||||||
ptr = new_allocator->allocate(&new_allocator->allocator_instance, orgsize);
|
ptr = new_allocator->allocate(&new_allocator->allocator_instance, orgsize, 0);
|
||||||
|
|
||||||
after_allocation:
|
after_allocation:
|
||||||
if (ptr != nullptr)
|
if (ptr != nullptr)
|
||||||
|
|
Loading…
Reference in New Issue