code:xswap - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 将 指定进程的图像 交换到盘交换区
- 共输入3个参数
- p : 指向 指定进程 的proc 结构
- ff : 图像清理 标志位
- 若置位,交换后 清理内存图像
- 否则,交换后 不清理内存图像
- os : 进程交换图像的大小(块数,64字节/块)
- 若为0,直接使用 os = proc.p_size
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;
4375 a = malloc(swapmap, (rp->p_size+7)/8);
- 修正 os 值
4376 if(a == NULL)
4377 panic("out of swap space");
4378 xccdec(rp->p_textp);
- 从 盘交换区 分配空间
- 空间大小为 (rp->p_size+7)/8 块 (512字节/块)
- 若分配失败,则进入错误处理
4379 rp->p_flag =| SLOCK;
- 处理 共享正文段 ,参看 xccdec
4380 if(swap(a, rp->p_addr, os, 0))
- proc置锁
4381 panic("swap error");
4382 if(ff)
4383 mfree(coremap, os, rp->p_addr);
4384 rp->p_addr = a;
- 若ff标志位被置,则清理内存图像
4385 rp->p_flag =& ~(SLOAD|SLOCK);
4386 rp->p_time = 0;
4387 if(runout) {
- 设置相关参数
- p_addr 指针指向 盘交换区上的图像
- 清SLOAD ,解锁proc结构
- 清 进程驻留时间
4388 runout = 0;
4389 wakeup(&runout);
4390 }
4391 }
4392 /* ------------------------- */
- 若 有进程睡眠在runout上,则唤醒该进程
- 睡眠原因 : runout