情况如下:
一个进程有两个页面 vp1 和 vp2。这两个页面映射到交换中的 2 个物理页面或 2 个页面。我们将这些物理(或交换)页面称为 pp1 和 pp2。映射是:
vp1->pp1
vp2->pp2
现在,如果我想将映射更改为:
vp1->pp2
vp2->pp1
这意味着,进程从 vp2 中读取将获得原始在 vp1 中的内容。有没有一种方法可以在不更改 Linux 内核的情况下做到这一点?
是的,但你必须先做一些工作。实现此目的的一种方法是创建两个共享内存对象。然后可以在进程地址空间中映射和取消映射共享内存对象。有关详细信息,请参阅系统调用shmat
、shmdt
、shmget
和shmctl
。
映射和取消映射可能会花费大量时间,因此与使用某些指针方案来选择进程用于访问数据的地址相比,它可能无法节省时间。
不。如果您想保持系统正常工作,一般情况下不会。但是,如果您控制映射的创建方式,您可以使用文件的 mmap 或 shm_open 中的对象创建它们,当您需要交换它们时,只需使用 mmap(... MAP_FIXED ...) 覆盖它们。