mprotect()用于保护内存页面,例如,使页面变为只读。它为整个过程设置了这种保护,也就是说,如果页面是只读的,则没有线程可以写入该页面。有没有一种方法可以针对不同的线程以不同的方式保护页面?例如,一个线程可以写入P页,而我程序中的所有其他线程只能从P页读取。

最佳答案

如果您在“克隆”系统调用中使用CLONE_VM标志创建了线程(通常将其称为线程),则MMU设置与父线程相同。

这意味着两个线程都可以进行写访问。

如果您不使用CLONE_VM标志,则两个线程根本没有共享内存!

(pthread_create()在内部设置CLONE_VM标志)。

可以做您想做的事-但是这将非常困难:

使用共享内存函数(例如shmget())而不是标准函数(例如malloc())分配所有内存块。

如果创建了新线程,则在未设置CLONE_VM标志的情况下,直接使用“clone()”代替“pthread_create()”。

共享的内存在线程之间共享,而“普通”内存分配函数(例如malloc())创建的线程不在线程之间共享。 mmap()映射的内存也是如此。

创建新线程时,将复制此类内存块(由malloc或mmap创建),以便两个线程在同一地址拥有自己的该内存块副本。如果一个线程写入该地址,则另一个线程将看不到更改。

分配更多的“共享”内存非常棘手。如果仅在分配线程和尚未创建的子线程之间共享内存,则很容易。很难在已运行的线程之间或属于不同已运行线程的(间接)子级的线程之间共享内存。

线程没有共享的堆栈内存,因此它们无法访问彼此的堆栈。

全局变量和“静态”变量默认情况下不共享-为了使它们在线程之间“共享”,需要进行一些棘手的编程。

09-09 23:44