⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 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 + -