main.c
main函数其实是内核的初始化,如果把内核功能比作业务软件的话,就相当于是业务的初始化,从该文件的文件夹归属(init文件夹)也可以看出这一点。
main主函数很短,从代码中可以基本看出整个内核的功能模块,如下:
void main(void) { //略去一部分初值设置 mem_init(main_memory_start,memory_end);//内存管理初始化 trap_init();//陷阱门初始化 blk_dev_init();//块设备驱动初始化 chr_dev_init();//字符驱动初始化 tty_init();//tty初始化 time_init();//时钟初始化,通过读PC的CMOS sched_init();//调度模块初始化 buffer_init(buffer_memory_end);//文件缓存系统初始化 hd_init();//硬盘初始化 floppy_init();//软盘初始化 sti();//中断开启 move_to_user_mode(); if (!fork()) { /* we count on this going ok */ init();//fork一个初始化进程,在该初始进程中会另外起一个进程,该进程完成shell功能,循环等待用户输入。开启shell的前提是要能打开设备tty0. } for(;;) pause();
注:在linux中fork一个进程和unix是一样的,子进程会拷贝父进程的上下文、代码段。因此虽然代码文件的角度看似乎是顺序执行的,但在内核中如上述中的if(!fork())和init()是在不同的进程中执行的。