c - 这个内存区域是干什么用的?
问题描述
当我运行我的 C 程序并检查它的 /proc/PID/maps 文件时,我看到关于可执行文件的这三行:
1:
00400000-00401000 r-xp 00000000 08:03 38404099 /previous_path/a.out
2:
00600000-00601000 r--p 00000000 08:03 38404099 /previous_path/a.out
3:
0601000-00602000 rw-p 00001000 08:03 38404099 /previous_path/a.out
我认为第一个存储代码,第三个存储全局变量,但我不知道第二个是什么。谁能给我解释一下?
解决方案
让我尝试以一般方式回答这个问题。可执行文件是一组指令,指导加载程序如何设置程序的地址空间。加载器将按照这些指令将页面映射到进程地址空间。
所有有效页面都将可读。所以你只处理
可执行 (X) 和可写 (W)
这给出了可能的组合
R
RX
RXW
R W
RXW 异常但确实发生。我见过在运行时对其指令进行编码和解码的应用程序。我们可以忽略这种情况。实际上剩下一个:
R Readonly (Data, such as strings or numeric constants, tabular data)
RX Code
R W Read Write (static, global, stack, heap, etc.)
如果你有类似的东西
const char something [] = "SOMETHING" ;
文本 SOMETHING 可能会出现在只读页面中。
推荐阅读
- styled-components - 如何将 React DnD 与样式化组件一起使用?
- java - 调试时的值相同,但 if 语句中的值不同
- c# - 具有泛型列表的类继承设计
- php - PDO:如果 UPDATE :column 和 WHERE :column 相同,则防止值覆盖
- tensorflow - Deeplab:“未能找到所有 Cityscapes 模块”
- python - 一个长期的难题,如何在 python 中优化多级循环?
- android - 测试暂停 corotuine
- javascript - 正确禁用 Angular 5 输入字段
- excel - Excel数据透视表,VBA,将所有字段值更改为计数
- c# - C# HttpClient 无法验证 POST 请求中提供的 CSRF 令牌