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

Source

  • 将进程的可交换图像部分内容写入当前目录的core文件中
  • 返回值:
    • 若成功写入,返回1
    • 否则,返回0

4083

4084 /*

4085  * Create a core image on the file "core"

4086  * If you are looking for protection glitches,

4087  * there are probably a wealth of them here

4088  * when this occurs to a suid command.

4089  *

4090  * It writes USIZE block of the

4091  * user.h area followed by the entire

4092  * data+stack segments.

4093  */

4094 core()

4095 {

4096     register s, *ip;

4097     extern schar;

4098

4099     u.u_error = 0;

4100     u.u_dirp = "core";

4101     ip = namei(&schar, 1);

  • 在用户所在目录中寻找是否有名为"core"的文件并且将找到的INODE赋给ip
4102     if(ip == NULL) {

4103                if(u.u_error)

4104                          return(0);

4105                ip = maknode(0666);

4106                if(ip == NULL)

4107                          return(0);

  • 若没有找到
    • 若发生错误
      • 返回0
    • 否则创建一个INODE赋给ip,传入参数mode = 0666 = IREAD|IWRITE|ITEXT|IWANT|IACC|IUPD ,参看inode.h
    • 若创建失败
      • 返回0
4108     }

4109     if(!access(ip, IWRITE) &&

4110           (ip->i_mode&IFMT) == 0 &&

4111           u.u_uid == u.u_ruid) {

  • 若身份验证通过,同时ip为普通INODE,并且用户的有效ID = 真实ID (参看权限管理)
4112           itrunc(ip);
  • 清ip所对应的文件.将ip所有相关磁盘块释放掉
4113           u.u_offset[0] = 0;

4114           u.u_offset[1] = 0;

4115           u.u_base = &u;

4116           u.u_count = USIZE*64;

4117           u.u_segflg = 1;

4118           writei(ip);

  • 设置I/O参数,将PPDA区写入core文件中,参数作用详见writei
  • 说明:PPDA区属于核心态地址空间,所以需要将u.u_segflg置为1,以用来在核心态地址空间寻址
4119           s = u.u_procp->p_size - USIZE;

4120           estabur(0, s, 0, 0);

  • s = 进程图像中除PPDA区以外的部分的长度
  • 根据s设置相对地址映照表
4121           u.u_base = 0;

4122           u.u_count = s*64;

4123           u.u_segflg = 0;

4124           writei(ip);

  • 设置I/O参数,将进程图像中除了PPDA区外的其他部分(数据段+用户栈)写入core文件中,参数作用详见writei
  • 说明:进程图像中除PPDA区以外的部分 属于用户态地址空间,所以需要将u.u_segflg置为0,以用来在用户态地址空间寻址
4125     }

4126     iput(ip);

4127     return(u.u_error==0);

4128 }

4129 /* ------------------------- */

Ref

Caller

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