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

Source

  • 将 指定进程的图像 交换到盘交换区
  • 共输入3个参数
    • p : 指向 指定进程 的proc 结构
    • ff : 图像清理 标志位
      • 若置位,交换后 清理内存图像
      • 否则,交换后 不清理内存图像
    • os : 进程交换图像的大小(块数,64字节/块)

4357

4358 /* Swap out process p.

4359  * The ff flag causes its core to be freed--

4360  * it may be off when called to create an image for a

4361  * child process in newproc.

4362  * Os is the old size of the data area of the process,

4363  * and is supplied during core expansion swaps.

4364  *

4365  * panic: out of swap space

4366  * panic: swap error -- IO error

4367  */

4368 xswap(p, ff, os)

4369 int *p;

4370 { register *rp, a;

4371

4372     rp = p;

4373     if(os == 0)

4374          os = rp->p_size;

  • 修正 os 值
4375     a = malloc(swapmap, (rp->p_size+7)/8);

4376     if(a == NULL)

4377          panic("out of swap space");

  • 从 盘交换区 分配空间
    • 空间大小为 (rp->p_size+7)/8 块 (512字节/块)
  • 若分配失败,则进入错误处理
4378     xccdec(rp->p_textp);
  • 处理 共享正文段 ,参看 xccdec
4379     rp->p_flag =| SLOCK;
4380     if(swap(a, rp->p_addr, os, 0))

4381          panic("swap error");

  • 进行 写盘交换区的操作
  • 若I/O操作出错,进行错误处理
4382     if(ff)

4383          mfree(coremap, os, rp->p_addr);

  • 若ff标志位被置,则清理内存图像
4384     rp->p_addr = a;

4385     rp->p_flag =& ~(SLOAD|SLOCK);

4386     rp->p_time = 0;

  • 设置相关参数
    • p_addr 指针指向 盘交换区上的图像
    • 清SLOAD ,解锁proc结构
    • 清 进程驻留时间
4387     if(runout) {

4388          runout = 0;

4389          wakeup(&runout);

4390     }

4391 }

  • 若 有进程睡眠在runout上,则唤醒该进程
4392 /* ------------------------- */

Ref

Caller

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