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

Source

  • 完成 文件读/写任务
  • read/write 调用
  • 共传入 1个参数 mode
    • mode : FREAD / FWRITE 分别对应 读/写 模式
  • 由 用户态 传入3个参数 fildes, buffer, nbytes,参看系统调用的参数传递
    • fildes : 文件打开标志, u.u_ofile[fildes] 指向对应的文件打开结构,参看内存打开文件结构,保存在 u.u_ar0[R0]
    • buffer : 读取/写入的起始偏移位,保存在 u.u_arg[0]
    • nbytes : 读取/写入的字节数,保存在 u.u_arg[1]
  • 向 用户态 返回 一个参数
    • 共读取/写入 的字节数

5725

5726 /*

5727  * common code for read and write calls:

5728  * check permissions, set base, count, and offset,

5729  * and switch out to readi, writei, or pipe code.

5730  */

5731 rdwr(mode)

5732 {

5733     register *fp, m;

5734

5735     m = mode;

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

5737     if(fp == NULL)

5738          return;

5739     if((fp->f_flag&m) == 0) {

5740          u.u_error = EBADF;

5741          return;

5742     }

  • 检查 读/写 权限
  • 检查失败抛出错误
5743     u.u_base = u.u_arg[0];

5744     u.u_count = u.u_arg[1];

5745     u.u_segflg = 0;

5746     if(fp->f_flag&FPIPE) {

5747          if(m==FREAD)

5748           readp(fp); else

5749           writep(fp);

5750     } else {

5751          u.u_offset[1] = fp->f_offset[1];

5752          u.u_offset[0] = fp->f_offset[0];

5753          if(m==FREAD)

5754           readi(fp->f_inode); else

5755           writei(fp->f_inode);

5756          dpadd(fp->f_offset, u.u_arg[1]-u.u_count);

  • 处理 文件 读/写
5757     }

5758     u.u_ar0[R0] = u.u_arg[1]-u.u_count;

  • 向 用户态 返回 共读取/写入 的字节数
5759 }

5760 /* ------------------------- */

Caller

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