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