code:grow - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 扩展 用户栈 直到 用户栈堆栈区包含地址sp
- 输入1个参数 sp
- 返回值
- 若 成功扩展,则返回1
- 否则,返回0
4130
- 注意:本函数 使用了 编程技巧#负数表示堆栈区
- 在具体位置将不再说明
4131 /*
4132 * grow the stack to include the SP
4133 * true return in successful.
4134 */
4135
4136 grow(sp)
4137 char *sp;
4138 {
4139 register a, si, i;
4140
4141 if(sp >= -u.u_ssize*64)
4142 return(0);
4143 si = ldiv(-sp, 64) - u.u_ssize + SINCR;
- 若 堆栈区 已经包含了sp,则直接返回0
4144 if(si <= 0)
- si ← 堆栈区需扩展的块数
4145 return(0);
4146 if(estabur(u.u_tsize, u.u_dsize, u.u_ssize+si, u.u_sep))
4147 return(0);
4148 expand(u.u_procp->p_size+si);
- 若分配失败,则直接返回0
4149 a = u.u_procp->p_addr + u.u_procp->p_size;
4150 for(i=u.u_ssize; i; i--) {
- a ← 堆栈区末尾
- 参看 进程图像
4151 a--;
4152 copyseg(a-si, a);
4153 }
4154 for(i=si; i; i--)
- 下移 原 堆栈区
4155 clearseg(--a);
4156 u.u_ssize =+ si;
- 清零 新增 堆栈区
4157 return(1);
4158 }
4159 /* ------------------------- */