code:smount - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Source

  • 系统调用 mount 的实现函数
  • 使用3个隐式参数: special; name; rwflag
    • special : 设备装载文件路径,如 "/etc/rk2",保存在u.u_arg[0]和u.u_dirp(参看trap 2770)
    • name : 装载点文件路径,保存在u.u_arg[1]
    • rwflag : 读/写模式,保存在u.u_arg[2]
  • 该函数将 special指定的子文件系统 装载到 name 指定的装载点,模式位rwflag

6082

6083 /*

6084  * the mount system call.

6085  */

6086 smount()

6087 {

6088     int d;

6089     register *ip;

6090     register struct mount *mp, *smp;

6091     extern uchar;

6092

6093     d = getmdev();

u.u_dirp 即special 指定的INODE(块设备装载INODE) 提取 设备号d
6094     if(u.u_error)

6095          return;

6096     u.u_dirp = u.u_arg[1];

6097     ip = namei(&uchar, 0);

6098     if(ip == NULL)

6099          return;

  • ip ← name 对应的INODE
6100     if(ip->i_count!=1 || (ip->i_mode&(IFBLK&IFCHR))!=0)

6101          goto out;

  • 以下情况 转到出错处理
    • ip被其他进程使用(ip->i_count!=1)
    • ip不是设备装载INODE
6102     smp = NULL;

6103     for(mp = &mount[0]; mp < &mount[NMOUNT]; mp++) {

6104          if(mp->m_bufp != NULL) {

6105           if(d == mp->m_dev)

6106                goto out;

6107          } else

6108           if(smp == NULL)

6109                smp = mp;

6110     }

  • 遍历mount[],找到 空闲项(mp->m_bufp == NULL)
    • 若已有 对应设备的加载项,则转到出错处理
6111     if(smp == NULL)

6112          goto out;

6113     (*bdevsw[d.d_major].d_open)(d, !u.u_arg[2]);

6114     if(u.u_error)

6115          goto out;

  • 启动对应设备
  • 对 RK磁盘 没有作用
  • 至于 传入的参数 原因不明,列入遗留问题
6116     mp = bread(d, 1);
  • 读出 d设备的超级块
6117     if(u.u_error) {

6118          brelse(mp);

6119          goto out1;

6120     }

6121     smp->m_inodp = ip;

6122     smp->m_dev = d;

6123     smp->m_bufp = getblk(NODEV);

6124     bcopy(mp->b_addr, smp->m_bufp->b_addr, 256);

6125     smp = smp->m_bufp->b_addr;

6126     smp->s_ilock = 0;

6127     smp->s_flock = 0;

6128     smp->s_ronly = u.u_arg[2] & 1;

  • 置 加载块 smp 相关参数
6129     brelse(mp);

6130     ip->i_flag =| IMOUNT;

  • ip 置 IMOUNT 标志
6131     prele(ip);

6132     return;

6133

6134 out:

6135     u.u_error = EBUSY;

6136 out1:

6137     iput(ip);

6138 }

6139 /* ------------------------- */

Ref

Param

(mount = 21.)
sys mount; special; name; rwflag
⚠️ **GitHub.com Fallback** ⚠️