11 main方法:整个操作系统就三十几行代码

你好,我是闪客。

第一部分,我们通过一大堆讨厌的汇编代码,把进入 main 方法前的苦力工作都完成了。

我们的程序终于跳到第一个由 c 语言写的文件 main.c 中,这里有个名字叫做 main 的方法,写得非常精简,把操作系统的整个骨架都勾勒出来了。

第二部分,我们的主题是“大战前期的初始化工作”,学习重点就是 main 方法中的各种初始化函数,这些函数是操作系统各个模块得以运作的基础。

在详细分析这些函数之前,这一讲,我先作为“导游”,结合 main 方法的代码,带你建立初始化过程的整体印象。

// init/main.c
void main(void) {
    ROOT_DEV = ORIG_ROOT_DEV;
    drive_info = DRIVE_INFO;
    memory_end = (1<<20) + (EXT_MEM_K<<10);
    memory_end &= 0xfffff000;
    if (memory_end > 16*1024*1024)
        memory_end = 16*1024*1024;
    if (memory_end > 12*1024*1024) 
        buffer_memory_end = 4*1024*1024;
    else if (memory_end > 6*1024*1024)
        buffer_memory_end = 2*1024*1024;
    else
        buffer_memory_end = 1*1024*1024;
    main_memory_start = buffer_memory_end;
    mem_init(main_memory_start,memory_end);
    trap_init();
    blk_dev_init();
    chr_dev_init();
    tty_init();
    time_init();
    sched_init();
    buffer_init(buffer_memory_end);
    hd_init();
    floppy_init();
    sti();
    move_to_user_mode();
    if (!fork()) {
        init();
    }
    for(;;) pause();
}