code:core - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 将进程的可交换图像部分内容写入当前目录的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";
4102 if(ip == NULL) {
- 在用户所在目录中寻找是否有名为"core"的文件并且将找到的INODE赋给ip
4103 if(u.u_error)
4104 return(0);
4105 ip = maknode(0666);
4106 if(ip == NULL)
4107 return(0);
4108 }
- 若没有找到
- 若发生错误
- 返回0
- 否则创建一个INODE赋给ip,传入参数mode = 0666 = IREAD|IWRITE|ITEXT|IWANT|IACC|IUPD ,参看inode.h
- 若创建失败
- 返回0
4109 if(!access(ip, IWRITE) &&
4110 (ip->i_mode&IFMT) == 0 &&
4112 itrunc(ip);
- 若身份验证通过,同时ip为普通INODE,并且用户的有效ID = 真实ID (参看权限管理)
4113 u.u_offset[0] = 0;
- 清ip所对应的文件.将ip所有相关磁盘块释放掉
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);
4119 s = u.u_procp->p_size - USIZE;
- 设置I/O参数,将PPDA区写入core文件中,参数作用详见writei
- 说明:PPDA区属于核心态地址空间,所以需要将u.u_segflg置为1,以用来在核心态地址空间寻址
4120 estabur(0, s, 0, 0);
4121 u.u_base = 0;
- s = 进程图像中除PPDA区以外的部分的长度
- 根据s设置相对地址映照表
4122 u.u_count = s*64;
4123 u.u_segflg = 0;
4124 writei(ip);
4125 }
- 设置I/O参数,将进程图像中除了PPDA区外的其他部分(数据段+用户栈)写入core文件中,参数作用详见writei
- 说明:进程图像中除PPDA区以外的部分 属于用户态地址空间,所以需要将u.u_segflg置为0,以用来在用户态地址空间寻址
4126 iput(ip);
4127 return(u.u_error==0);
4128 }
4129 /* ------------------------- */