考虑我写的一个小测试程序的虚拟内存中的映射:
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找到我的动机。