3.3.3 进程1在根设备上加载根文件系统(5) http://book.51cto.com/art/201306/398752.htm

http://book.51cto.com/art/201306/398752.htm

3.3.3 进程1在根设备上加载根文件系统(5)

2013-06-17 11:13 新设计团队 机械工业出版社  字号: T |  T

综合评级:

想读(8)  在读(0)  已读(0)   品书斋鉴(0)   已有8人发表书评

一键收藏,随时查看,分享好友!

《Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理(第2版)》第3章进程1的创建及执行,本章详细讲解了进程0创建进程1的全过程。还讲解了操作系统启动以来内核做的第一次进程调度,内容涉及了进程调度的很多代码,为更深入地理解进程调度起到了很好的铺垫作用。最后讲解了进程1第一次执行后所做的设置硬盘信息、格式化虚拟盘、加载根文件系统等工作。本节为大家介绍进程1在根设备上加载根文件系统。

AD:

3.3.3 进程1在根设备上加载根文件系统(5)

2.将根设备中的根i节点挂在super_block[8]中根设备超级块上

回到mount_root(?)函数中,调用iget(?)函数,从虚拟盘上读取根i节点。根i节点的意义在于,通过它可以到文件系统中任何指定的i节点,也就是能找到任何指定的文件。

执行代码如下:

    
    
    
    
  1. //代码路径:fs/super.c:  
  2. void mount_root(void)  
  3. {  
  4.    …  
  5.    if (!(p=read_super(ROOT_DEV)))  
  6.          panic("Unable to mount root");  
  7.    if (!(mi=iget(ROOT_DEV,ROOT_INO)))  
  8.          panic("Unable to read root i-node");      
  9.     …  

进入iget(?)函数后,操作系统从i节点表inode_table[32]中申请一个空闲的i节点位置(inode_table[32]是操作系统用来控制同时打开不同文件的最大数)。此时应该是首个i节点。对这个i节点进行初始化设置,其中包括该i节点对应的设备号、该i节点的节点号……

图3-42中给出了根目录i节点在内核i节点表中的位置。

对应代码如下:

    
    
    
    
  1. //代码路径:fs/inode.c:  
  2. struct m_inode * iget(int dev,int nr)   
  3. {  
  4.     struct m_inode * inode, * empty;  
  5.  
  6.     if (!dev)  
  7.          panic("iget with dev==0");  
  8.     emptyget_empty_inode();       //从inode_table[32]中申请一个空闲的i节点  
  9.     inodeinode_table;  
  10.     while (inode < NR_INODE?+?inode_table){ //查找与参数相同的inode  
  11.          if (inode->i_dev != dev || inode->i_num != nr) {  
  12.                inode++;  
  13.                continue;  
  14.          }  
  15.          wait_on_inode(inode);          //等待解锁  
  16.          if (inode->i_dev != dev || inode->i_num != nr){    //如等待期间发生  
  17.                inodeinode_table;      //变化,继续查找  
  18.                continue;  
  19.          }  
  20.          inode->i_count++;  
  21.          if (inode->i_mount) {  
  22.                int i;  
  23.  
  24.                for (i0;i<NR_SUPER;i++)        //如是mount点,则查找对应的超级块  
  25.                      if (super_block[i].s_imount==inode)  
  26.                                 break;  
  27.                if (i >= NR_SUPER) {  
  28.                      printk("Mounted inode hasn't got sb\n");  
  29.                      if (empty)  
  30.                                 iput(empty);  
  31.                      return inode;  
  32.                }  
  33.                iput(inode);  
  34.                devsuper_block[i].s_dev;   //从超级块中获取设备号  
  35.                nrROOT_INO;            // ROOT_INO为1,根i节点号  
  36.                inodeinode_table;  
  37.                continue;  
  38.          }  
  39.          if (empty)  
  40.                iput(empty);  
  41.          return inode;  
  42.     }  
  43.     if (!empty)  
  44.          return (NULL);  
  45.     inode=empty;  
  46.     inode->i_dev= dev;              //初始化  
  47.     inode->i_numnr;  
  48.     read_inode(inode);              //从虚拟盘上读出根i节点  
  49.     return inode;  

【责任编辑: book TEL:

你可能感兴趣的:(3.3.3 进程1在根设备上加载根文件系统(5) http://book.51cto.com/art/201306/398752.htm)