手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux虚拟文件系统(安装根文件系统)

[日期:2012-02-10] 来源:Linux社区  作者:bullbat [字体: ]

2,安装实际根文件系统

关于__setup宏

__setup宏来注册关键字及相关联的处理函数,__setup宏在include/linux/init.h中定义,其原型如下:
__setup(string, _handler);
其中:string是关键字,_handler是关联处理函数。__setup只是告诉内核在启动时输入串中含有string时,内核要去
执行_handler。String必须以“=”符结束以使parse_args更方便解析。紧随“=”后的任何文本都会作为输入传给
_handler。下面的例子来自于init/do_mounts.c,其中root_dev_setup作为处理程序被注册给“root=”关键字:
 __setup("root=", root_dev_setup);

比如我们在启动向参数终有

  noinitrd root=/dev/mtdblock2 console=/linuxrc

 setup_arch解释时会发现root=/dev/mtdblock2,然后它就会调用root_dev_setup

[cpp]
  1. static int __init root_dev_setup(char *line)  
  2. {  
  3.     strlcpy(saved_root_name, line, sizeof(saved_root_name));  
  4.     return 1;  
  5. }  
  6.   
  7. __setup("root=", root_dev_setup);  


Start_kernel->rest_init->init-> prepare_namespace->

[cpp]
  1. /* 
  2.  * Prepare the namespace - decide what/where to mount, load ramdisks, etc. 
  3.  */  
  4. void __init prepare_namespace(void)  
  5. {  
  6.     int is_floppy;  
  7.   
  8.     if (root_delay) {  
  9.         printk(KERN_INFO "Waiting %dsec before mounting root device...\n",  
  10.                root_delay);  
  11.         ssleep(root_delay);  
  12.     }  
  13.   
  14.     /* 
  15.      * wait for the known devices to complete their probing 
  16.      * 
  17.      * Note: this is a potential source of long boot delays. 
  18.      * For example, it is not atypical to wait 5 seconds here 
  19.      * for the touchpad of a laptop to initialize. 
  20.      */  
  21.     wait_for_device_probe();  
  22.     /*创建/dev/ram0,必须得,因为initrd要放到/dev/ram0里*/  
  23.     md_run_setup();  
  24.   
  25.     if (saved_root_name[0]) {/*saved_root_name为从启动参数"root"中获取的设备文件名*/  
  26.         root_device_name = saved_root_name;  
  27.         if (!strncmp(root_device_name, "mtd", 3) ||  
  28.             !strncmp(root_device_name, "ubi", 3)) {/*如果设备名开头为这两个*/  
  29.             mount_block_root(root_device_name, root_mountflags);  
  30.             goto out;  
  31.         }  
  32.         /*主设备号和次设备号*/  
  33.         ROOT_DEV = name_to_dev_t(root_device_name);  
  34.         if (strncmp(root_device_name, "/dev/", 5) == 0)  
  35.             root_device_name += 5;/*滤掉'/dev/'字符*/  
  36.     }  
  37.   
  38.     if (initrd_load())  
  39.         goto out;  
  40.   
  41.     /* wait for any asynchronous scanning to complete */  
  42.     if ((ROOT_DEV == 0) && root_wait) {  
  43.         printk(KERN_INFO "Waiting for root device %s...\n",  
  44.             saved_root_name);  
  45.         while (driver_probe_done() != 0 ||  
  46.             (ROOT_DEV = name_to_dev_t(saved_root_name)) == 0)  
  47.             msleep(100);  
  48.         async_synchronize_full();  
  49.     }  
  50.   
  51.     is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;  
  52.   
  53.     if (is_floppy && rd_doload && rd_load_disk(0))  
  54.         ROOT_DEV = Root_RAM0;  
  55.     /*实际操作*/  
  56.     mount_root();  
  57. out:  
  58.     devtmpfs_mount("dev");/*devfs从虚拟的根文件系统的/dev umount*/  
  59.     sys_mount(".""/", NULL, MS_MOVE, NULL);/*将挂载点从当前目录【/root】(在mount_root函数中设置的)移到根目录*/  
  60.     /*当前目录即【/root】(真正文件系统挂载的目录)做为系统根目录*/  
  61.     sys_chroot(".");  
  62. }  
linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款