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

Source

  • seek 的系统调用函数
  • 移动 指定文件 的偏移指针
  • 使用3个隐式参数 : fildes, offset, ptrname
    • fildes : 文件描述号,保存在 u.u_ar0[R0]
    • offset : 移动的增量,保存在 u.u_arg[0]
    • ptrname : 模式位,保存在 u.u_arg[1]
      • (以下为方便叙述
设px为 对应x模式位的 文件偏移指针 设 当前文件偏移为now 设当前文件大小为size)
      • 0,1,2 为 字节模式
      • 3,4,5 为 块模式
      • 0 : p0(无符号数) = offset
      • 1 : p1 = now + offset
      • 2 : p2 = size + offset
      • 3 : p3(无符号数) = p0 * 512
      • 4 : p4 = p1 * 512
      • 5 : p5 = p2 * 512

5857

5858 /*

5859  * seek system call

5860  */

5861 seek()

5862 {

5863     int n[2];

5864     register *fp, t;

5865

5866     fp = getf(u.u_ar0[R0]);

5867     if(fp == NULL)

5868          return;

5869     if(fp->f_flag&FPIPE) {

5870          u.u_error = ESPIPE;

5871          return;

5872     }

5873     t = u.u_arg[1];
  • t ← ptrname
5874     if(t > 2) {

5875          n[1] = u.u_arg[0]<<9;

5876          n[0] = u.u_arg[0]>>7;

5877          if(t == 3)

5878           n[0] =& 0777;

  • t = 3,4,5 ,n = u.u_arg[0] * 512
  • t = 3 时,清R[0]的最高位(即符号位),因为R[0]表示的是无符号数
5879     } else {

5880          n[1] = u.u_arg[0];

5881          n[0] = 0;

5882          if(t!=0 && n[1]<0)

5883           n[0] = -1;

  • t=0,1,2 ,n = u.u_arg[0]
  • t=1,2 ,若为负数,将负数扩展到双字
5884     }

5885     switch(t) {

5886

5887          case 1:

5888          case 4:

5889           n[0] =+ fp->f_offset[0];

5890           dpadd(n, fp->f_offset[1]);

5891           break;

  • t=1,4
n = n + now
5892

5893          default:

5894           n[0] =+ fp->f_inode->i_size0&0377;

5895           dpadd(n, fp->f_inode->i_size1);

  • t=2,5
n = n + size
5896

5897          case 0:

5898          case 3:

5899           ;

  • t=0,3
无操作
5900     }

5901     fp->f_offset[1] = n[1];

5902     fp->f_offset[0] = n[0];

5903 }

5904 /* ------------------------- */

Ref

Param

(seek = 19.)
(file descriptor in r0)
sys seek; offset; ptrname
⚠️ **GitHub.com Fallback** ⚠️