linux – 有一个基于线程的mprotect吗?

linux – 有一个基于线程的mprotect吗?,第1张

概述mprotect()用于保护内存页面,例如,使页面为只读.它为整个过程设置了这种保护,也就是说,如果页面是只读的,则没有线程可以写入该页面.有没有办法以不同的方式为不同的线程保护页面?例如,1个线程可以写入页面P,而我程序中的所有其他线程只能从P读取. 如果在“clone”系统调用中使用CLONE_VM标志创建线程(这通常称为线程),则MMU设置与父线程相同. 这意味着两个线程都可以进行写访问. @H_404_6@ mprotect()用于保护内存页面,例如,使页面为只读.它为整个过程设置了这种保护,也就是说,如果页面是只读的,则没有线程可以写入该页面.有没有办法以不同的方式为不同的线程保护页面?例如,1个线程可以写入页面P,而我程序中的所有其他线程只能从P读取.解决方法 如果在“clone”系统调用中使用CLONE_VM标志创建线程(这通常称为线程),则MMU设置与父线程相同.

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

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

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

有可能做你想做的事 – 但这将是非常困难的:

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

如果创建了新线程,则直接使用“clone()”而不是“pthread_create()”且未设置CLONE_VM标志.

共享内存在线程之间共享,并且由“正常”内存分配函数(例如malloc())创建的线程不在线程之间共享. mmap()映射内存也是如此.

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

分配更多“共享”内存相当棘手.如果只应在分配线程和未创建的子线程之间共享内存,这很容易.很难在已经运行的线程之间或作为不同已经运行的线程的(间接)子线程的线程之间共享内存.

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

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

总结

以上是内存溢出为你收集整理的linux – 有一个基于线程的mprotect吗?全部内容,希望文章能够帮你解决linux – 有一个基于线程的mprotect吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1019665.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存