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

Source

  • 从指定指定空间的指定地址读出字节
  • 修改 u_base,u_count,u_offset,参看user
    • 地址空间 由 u.u_segflg指明
    • 指定地址 由 u.u_base提供
    • c : 存放读出的字节
  • 返回值
    • 若出错,则返回-1
    • 当u_count == 0 (读出任务完成),则返回-1
    • 否则返回读出的字节

6534

6535 /*

6537  * write call at location u_base;

6538  * update u_base, u_count, and u_offset. Return -1

6539  * when u_count is exhausted. u_base is in the user?ˉs

6540  * address space unless u_segflg is set.

6541  */

6542 cpass()

6543 {

6544     register c;

6545

6546     if(u.u_count == 0)

6547          return(-1);

  • 若u_count==0(已读完),则返回-1
6548     if(u.u_segflg)

6549          c = *u.u_base; else

6550     if((c=fubyte(u.u_base)) < 0) {

6551          u.u_error = EFAULT;

6552          return(-1);

6553 }

  • 若 目标地址空间 为 核心态地址空间,则直接从目标地址读出字节
  • 若 目标地址空间 为 用户态地址空间,则调用fubyte 向目标地址读出字节
6554     u.u_count--;

6555     if(++u.u_offset[1] == 0)

6556          u.u_offset[0]++;

6557     u.u_base++;

6558     return(c&0377);
  • 返回c的低八位
6559 }

6560 /* -------------------------*/

Caller

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