linux – 有一个基于线程的mprotect吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – 有一个基于线程的mprotect吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1223字,纯文字阅读大概需要2分钟。
内容图文
![linux – 有一个基于线程的mprotect吗?](/upload/InfoBanner/zyjiaocheng/964/2806bb3ee24845949150733cc6ad5945.jpg)
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吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。