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

Source

  • 将 相对地址映照表 加载为 地址映照表
  • 相对地址映照表 为 u.u_uisa/u.u_uisd
  • 加载到 UISA UISD 寄存器

1732

1733 /*

1734  * Load the user hardware segmentation

1735  * registers from the software prototype.

1736  * The software registers must have

1737  * been setup prior by estabur.

1738  */

1739 sureg()

1740 {

1741     register *up, *rp, a;

1742

1743     a = u.u_procp->p_addr;

  • a 指向 PPDA区
1744     up = &u.u_uisa[16];

1745     rp = &UISA->r[16];

1746     if(cputype == 40) {

1747          up =- 8;

1748          rp =- 8;

1749     }

  • up 指向 u.u_uisa[8]
  • rp 指向 UISA[8]
  • 1746 的 判断 当前机器为pdp11/40时为真
不为pdp11/40时不作讨论
1750     while(rp > &UISA->r[0])

1751          *--rp = *--up + a;

i = 0..7
1752     if((up=u.u_procp->p_textp) != NULL)

1753          a =- up->x_caddr;

  • 若已加载正文段,则 a ← PPDA区首地址 - 正文段首地址
1754     up = &u.u_uisd[16];

1755     rp = &UISD->r[16];

1756     if(cputype == 40) {

1757          up =- 8;

1758          rp =- 8;

1759     }

  • up 指向 u.u_uisd[8]
  • rp 指向 UISD[8]
  • 1756 的 判断 当前机器为pdp11/40时为真
不为pdp11/40时不作讨论
1760     while(rp > &UISD->r[0]) {

1761          *--rp = *--up;

1762          if((*rp & WO) == 0)

1763           rp[(UISA-UISD)/2] =- a;

1764     }

i = 0..7
  • u.u_uisd[i] 不含有写标志 (1762)(数据段和栈段含有写标志,只有正文段不含写标志),则
UISA[i] ← UISA[i] - a i = 0..7 相当于UISA[i] ← u.u_uisa[i] + 正文段起始地址
1765 }

1766 /* ------------------------- */

Ref

Caller

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