linux 0.11 源码学习(六)

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()是在不同的进程中执行的。

posted @ 2013-05-04 09:54  Fredric_2013  阅读(251)  评论(0编辑  收藏  举报