我正在调试gdb上的一个简单程序,并且在堆栈框架内看到了局部变量的地址,它们类似于以下内容-0xffffbc10
,0xffffc340
等
据我了解,内核空间地址占0xffffffff
到0xcfffffff
,并且用户空间地址从0xbfffffff
开始。
为什么这里有差异?
编辑:请注意,我已关闭虚拟地址空间随机化,堆栈保护程序,并正在使用-m32进行编译。这是我的编译命令(如果有帮助的话):
gcc -m32 -z execstack -fno-stack-protector -ggdb -static test.c -o test
答案 0 :(得分:6)
如果要在64位主机(和64位内核)上运行32位程序,则整个32位地址空间通常可供应用程序使用。原则上,这在32位内核上也是可行的,但是Linux和(其他所有)主要内核保留了虚拟地址空间的一部分,以使用户和内核模式之间的切换更加有效。
32位程序仅具有3GB虚拟地址空间的假设是无效的,但是由于某些旧版程序错误地假设了这一点,因此Linux“个性”系统使您可以通过模拟此行为来运行它们。可以通过setarch
命令的-3
选项进行访问。