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

Source

  • 扩展 用户栈 直到 用户栈堆栈区包含地址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);

  • 若 堆栈区 已经包含了sp,则直接返回0
4143     si = ldiv(-sp, 64) - u.u_ssize + SINCR;
  • si ← 堆栈区需扩展的块数
4144     if(si <= 0)

4145          return(0);

4146     if(estabur(u.u_tsize, u.u_dsize, u.u_ssize+si, u.u_sep))

4147          return(0);

  • 若分配失败,则直接返回0
4148     expand(u.u_procp->p_size+si);

4149     a = u.u_procp->p_addr + u.u_procp->p_size;

4150     for(i=u.u_ssize; i; i--) {

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 /* ------------------------- */

Ref

Caller

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