对于我的大学项目,我需要写保护整个地址空间的过程。我正在读取/proc/self/maps文件并解析映射。
因此,对于格式08048000-0804c000 r-xp 00000000 08:03 7971106 /bin/cat,的每个条目,我正在读取前两个条目(在这里,08048000 & 0804c000),将它们转换为十进制)。让我们假设十进制等价物分别是A和B。然后我做mprotect((int*)A, B-A, PROT_READ).但是这种方法给了我分割错误。我不知道我在这里做错了什么。可能是我在这里有一些知识差距,这是造成问题的原因。有人能给我一些建议吗?
发布于 2013-11-28 09:43:31
假设您的实现是正确的,我仍然希望看到分段错误。
毕竟,您是在告诉内核,您不希望被允许写入内存的任何部分。之后,您将继续运行您的进程,下次尝试编写任何内容时,您将得到一个分段错误,因为这是不允许的。
这很可能是当您在“保护”堆栈之后从mprotect()返回时。
考虑得更多一点,在执行内存(即共享库或可执行代码)时,您甚至有可能在“保护”内存之后得到分段错误。
实际上,应用只读/不执行标志的所有内存段都已经设置了这些标志。
我想这就是这个大学项目给你的洞察力。
https://stackoverflow.com/questions/20261874
复制相似问题