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

Source

  • INODE结构共有两个部分,两者有不同的部分
    • 内存INODE
    • 磁盘INODE
  • 从两个部分分别读出需要的状态,写入指定地址
6040

6041 /*

6042  * The basic routine for fstat and stat:

6043  * get the inode and pass appropriate parts back.

6044  */

6045 stat1(ip, ub)

6046 int ip;

6047 {

6048     register i, *bp, *cp;

6049

6050     iupdat(ip, time);

  • 将 内存INODE 写回 磁盘
6051     bp = bread(ip->i_dev, ldiv(ip->i_number+31, 16));
  • 读出 ip所在对应的磁盘块bp
6052     cp = bp->b_addr + 32*lrem(ip->i_number+31, 16) +24;
  • cp ← 指向 bp上对应ip的INODE的i_atime项
6053     ip = &(ip->i_dev);
  • ip ← 指向原ip的i_dev项
6054     for(i=0; i<14; i++) {

6055          suword(ub, *ip++);

6056          ub =+ 2;

6057     }

  • 将以下内容写入用户态地址空间ub地址,ip的
    • i_dev
    • i_number
    • i_mode
    • i_nlink
    • i_uid
    • i_gid
    • i_size0
    • i_size1
    • i_addr[8]
6058     for(i=0; i<4; i++) {

6059          suword(ub, *cp++);

6060          ub =+ 2;

6061     }

  • 将以下内容写入用户态地址空间ub地址,ip对应的磁盘inode的
    • i_atime
    • i_mtime
6062     brelse(bp);
  • 释放 bp
6063 }

6064 /* ------------------------- */

Ref

Caller

⚠️ **GitHub.com Fallback** ⚠️