我知道pmap
一个进程显示了内存映射是如何完成的。例如,pmap 输出的第一行显示了到进程可执行文件的文本段的内存映射。假设我有一个非常大的可执行文件并且我的代码大小很大。对于小文本段(小可执行文件),pmamp 显示400000 - 401000 - 4096 B - 4 KiB
映射的文本段。
(1) 如果文本段真的很大,它如何映射? (2) 它是否根据代码执行进度所需的页面动态映射?
答案1
可执行文件中运行时所需的部分按原样映射,映射覆盖每个部分的完整范围;相应的页面仅根据需要加载,但映射必须提前存在才能发生。
例如,使用 Emacs,我看到
0000000000400000 88K r---- emacs-26.3
0000000000416000 2044K r-x-- emacs-26.3
0000000000615000 372K r---- emacs-26.3
0000000000672000 32K r---- emacs-26.3
000000000067a000 36560K rw--- emacs-26.3
文本段是2044KiBr-x
段,对应于.text
可执行文件中的部分(如例如 size -A
):
section size addr
...
.text 2049234 4324272
...