内核启动中根分区是怎样挂上去的?
比如用grub引导,grub把内核装进来后,执行内核,内核执行快完毕时要挂载根分区,比如/dev/hda6,但是此时根分区又还没挂起来,内核去哪里找/dev/hda6这个设备文件呢? check start_kernel and do_mounts.c 看看情景分析的最后一章,上面有很详细的解释 start_kernel函数是内核初始化的第一站,负责内核所有数据结构的构建以及进一步初始化页表和填充中断描述表,在此前startup_32函数已经把内核依赖于平台的环境基本搭建好了(cpu子系统,MMU),而init则负责其余初始化过程,它是初始化的最后一站。init函数调用do_basic_setup来安装驱动。
static int init(void * unused)
{
...
do_basic_setup(); /*见下*/
...
if (sys_access((const char __user *) "/init", 0) == 0)
execute_command = "/init";
else
prepare_namespace();/*挂载根文件系统(中间根据mount_initrd变量来决定是否经过initrd处理)*/
do_basic_setup();
static void __init do_basic_setup(void)
{
driver_init(); /*安装设备驱动程序,也就是dirvers目录下面的驱动*/
至于根文件系统的初始化(也蕴含在initrd判断流程中),可以参详我的帖子:
http://www.linuxsir.org/bbs/showthread.php?s=&threadid=113586&perpage=15&pagenumber=2 要注意的是,内核挂载根文件系统后,从内核态进入用户态,init命令调用的初始化脚本将再次以可读写方式(一般就是rc.sysinit)挂载根文件系统,前者是根据boot loader的参数而定的(也可以由linuxrc改变,echo $DEV > /proc/sys/kernel/real-root-dev 即可),后者是根据/etc/fstab中的根文件系统条目来决定的。
/etc/fstab与内核挂载根文件系统无关!
页:
[1]