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

你可能感兴趣的:(linux)