📄 2
字号:
系统的初始化过程是漫长的,其中主要过程在main函数中(init目录中的main.c)实现。目前实现了tty的初始化、内存管理单元的初始化、进程调度的初始化、中断处理的初始化、最后开中断后将初始化的进程返回到用户态下,作为进程0来运行,但进程0什么也不做。
首先取消了低端4M的地址映射,这是开启分页时必须的,现在不需要了。
接下来做了以下初始化工作(目前)。
tty的初始化:void init_tty(void) drivers/char/tty_io.c
void init_tty(void)
{
chrdev_fops = &tty_fops; //初始化tty的读写跳转表
init_con(); //初始化控制台,即显卡的显示内存的初始信息
}
内存管理单元的初始化: void init_mem() mm/memory.c
暂时mem_map只是一个u8类型的数组
//初始化内存管理
//主要是初始化内存页的使用计数器
void init_mem()
{
int len = sizeof(mem_map) - mem_start_index;
memset((void *)mem_map, 1, sizeof(mem_map)); //先全部设置为1
memset((void *)mem_map + mem_start_index, 0, len); //从2M开始处开始管理内存页
}
进程调度的初始化: void init_sched() kernel/scheduler.c
//初始化进程调度模块
void init_sched()
{
init_timer(); //初始化定时器
pinit_task = init_task(); //初始化进程0的进程控制块
sleep_task = pinit_task;
current = pinit_task;
//设置TSS全局描述附
setup_GDT_entry(&gdt[5], (u32) & global_tss, sizeof(tss_struct), ACS_TSS, 0);
load_fs(0x23);
load_gs(0x23);
lldt(0);
ltr(0x28); /* 加载tr寄存器 */
}
中断处理的初始化:void init_irq(void) kernel/irq.c
//初始化异常、系统调用等中断处理程序
void init_irq(void)
{
set_trap_gate(0x00, DIVIDE_ERROR_INTERRUPT);
set_trap_gate(0x01, DEBUG_INTERRUPT);
set_trap_gate(0x02, NMI_INTERRUPT);
set_system_gate(0x03, INT3_INTERRUPT);
set_system_gate(0x04, OVERFLOW_INTERRUPT);
set_system_gate(0x05, BOUNDS_INTERRUPT);
set_trap_gate(0x06, INVALID_OP_INTERRUPT);
set_trap_gate(0x07, DEVICE_NOT_AVAILABLE_INTERRUPT);
set_trap_gate(0x08, DOUBLE_INTERRUPT);
set_trap_gate(0x09, COPROCESSOR_SEGMENT_OVERRUN_INTERRUPT);
set_trap_gate(0x0A, INVALID_TSS_INTERRUPT);
set_trap_gate(0x0B, SEGMENT_NOT_PRESENT_INTERRUPT);
set_trap_gate(0x0C, STACK_SEGMENT_INTERRUPT);
set_trap_gate(0x0D, GENERAL_PROTECTION_INTERRUPT);
set_trap_gate(0x0E, PAGE_FAULT_INTERRUPT);
set_trap_gate(0x0F, ISR_0F_WRAPPER);
set_trap_gate(0x10, COPROCESSOR_ERROR_INTERRUPT);
set_trap_gate(0x11, ISR_11_WRAPPER);
set_trap_gate(0x12, ISR_12_WRAPPER);
set_trap_gate(0x13, ISR_13_WRAPPER);
set_trap_gate(0x14, ISR_14_WRAPPER);
set_trap_gate(0x15, ISR_15_WRAPPER);
set_trap_gate(0x16, ISR_16_WRAPPER);
set_trap_gate(0x17, ISR_17_WRAPPER);
set_trap_gate(0x18, ISR_18_WRAPPER);
set_trap_gate(0x19, ISR_19_WRAPPER);
set_trap_gate(0x1A, ISR_1A_WRAPPER);
set_trap_gate(0x1B, ISR_1B_WRAPPER);
set_trap_gate(0x1C, ISR_1C_WRAPPER);
set_trap_gate(0x1D, ISR_1D_WRAPPER);
set_trap_gate(0x1E, ISR_1E_WRAPPER);
set_trap_gate(0x1F, ISR_1F_WRAPPER);
set_trap_gate(0x20, TIMER_INTERRUPT);
set_trap_gate(0x21, KBD_INTERRUPT);
set_system_gate(0x80, SYSTEM_CALL);//系统调用入口
idtr.limit = sizeof(idt) - 1;
idtr.base = ((u32) idt);
lidt(&idtr);//设置lidt
outb_p(0x36, 0x43); /* binary, mode 3, LSB/MSB, ch 0 */
outb_p(LATCH & 0xff, 0x40); /* LSB */
outb(LATCH >> 8, 0x40); /* MSB *///初始化始终中断频率
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -