在Linux中更改程序的地址空间布局

时间:2014-05-13 11:32:52

标签: c linux memory

考虑我写的一个小测试程序的虚拟内存中的映射:

0000000000400000     20K r-x--  /home/arvidj/dev/examples/testgen.c.out
0000000000604000      4K r----  /home/arvidj/dev/examples/testgen.c.out
0000000000605000      4K rw---  /home/arvidj/dev/examples/testgen.c.out
0000000000606000     16K rw---    [ anon ]
00007ffff7a12000   1780K r-x--  /lib/x86_64-linux-gnu/libc-2.17.so
00007ffff7bcf000   2048K -----  /lib/x86_64-linux-gnu/libc-2.17.so
00007ffff7dcf000     16K r----  /lib/x86_64-linux-gnu/libc-2.17.so
00007ffff7dd3000      8K rw---  /lib/x86_64-linux-gnu/libc-2.17.so
00007ffff7dd5000     20K rw---    [ anon ]
00007ffff7dda000    140K r-x--  /lib/x86_64-linux-gnu/ld-2.17.so
00007ffff7fde000     12K rw---    [ anon ]
00007ffff7ff8000      8K rw---    [ anon ]
00007ffff7ffa000      8K r-x--    [ anon ]
00007ffff7ffc000      4K r----  /lib/x86_64-linux-gnu/ld-2.17.so
00007ffff7ffd000      8K rw---  /lib/x86_64-linux-gnu/ld-2.17.so
00007ffffffde000    132K rw---    [ stack ]
ffffffffff600000      4K r-x--    [ anon ]

这种布局有多灵活?哪些部分可以移动(静态或动态),以及如何移动?如果我希望堆栈从0x0000000001000000开始,我该如何更改?相反,我可以向上移动DATA / TEXT段,我可以自由地这样做吗?

如果我设法移动堆栈(可能是通过makecontext,或者通过在asm中摆弄sp),我该​​如何重新使用该空间?我可以使用地图,还是可以使用munmap取消映射?你可以在this question找到我的动机。

0 个答案:

没有答案