到目前为止,我们可以知道在32位系统上,用户堆栈开始了。从0xc0000000地址开始(这是用户模式和内核模式之间的限制)。
如果我们在x86-64 linux系统上运行Elf32,则此地址不相同。我找不到此地址,但由于有了gdb,我可以确定它是0xffffe000:
(gdb) x $esp
0xffffd4bc: 0xf7e16a83
(gdb) x/w 0xffffdffc
0xffffdffc: 0x00000000
(gdb) x/w 0xffffe000
0xffffe000: Cannot access memory at address 0xffffe000
我们实际上可以看到0xffffe000地址指向无效的位置(或至少该进程没有访问此内存页面的适当权限。 。我做错了吗?
我可以找到有关linux-gate.so.1的信息,但我认为这不是重点。反向器?
#1 楼
通过查看其内存映射,可以查看(32或64位)进程的有效堆栈访问范围。我们可以通过pid
观察到ID为cat /proc/pid/maps
的进程的内存映射,这是我的64位盒上的32-bit process
的示例:如果是stack
,则对一个大于或等于[0xfff9b000, 0xfffbc000)
的地址的内存访问将触发0xfffbc000
异常。根据本文的内容,此范围是在内核将二进制文件映射到内存中时计算的,并且通过几个函数,有趣的输入是memory access violation
,由STACK_TOP
为32位进程定义。评论
好吧,我认为这值得进一步调查。感谢您的回答。
– Geoffrey R.
16年4月12日在14:28
感谢@GeoffreyR。,不客气。实际上,我也有同样的问题。
– Ta Thanh Dinh
16年4月12日在14:32
#2 楼
我有一个部分答案。由于个性系统调用,可以确定内存布局最终以0xc0000000还是0xffffe000结束。通过读取ADDR_LIMIT_3GB标志,可以找出32位进程最多映射到0xc0000000或0xffffe000。那末有4GB的存储空间。也许与内核堆栈大小有关。
评论
这是一个巧合,关于x64上32位二进制堆栈的有效地址,我也遇到了同样的问题。那你能得到什么价值?
我在这里找到了可能相关的东西:stackoverflow.com/questions/29426476/…
我在这里靠近:lxr.free-electrons.com/source/arch/x86/include/asm / ...
在本文中,从TASK_SIZE(对于32位进程)计算进程堆栈的有效范围。