用户空间地址为0xfff <something>

时间:2018-11-08 15:29:21

标签: c gdb virtual-address-space

我正在调试gdb上的一个简单程序,并且在堆栈框架内看到了局部变量的地址,它们类似于以下内容-0xffffbc100xffffc340

据我了解,内核空间地址占0xffffffff0xcfffffff,并且用户空间地址从0xbfffffff开始。

为什么这里有差异?

编辑:请注意,我已关闭虚拟地址空间随机化,堆栈保护程序,并正在使用-m32进行编译。这是我的编译命令(如果有帮助的话):

gcc -m32 -z execstack -fno-stack-protector -ggdb -static test.c -o test

1 个答案:

答案 0 :(得分:6)

如果要在64位主机(和64位内核)上运行32位程序,则整个32位地址空间通常可供应用程序使用。原则上,这在32位内核上也是可行的,但是Linux和(其他所有)主要内核保留了虚拟地址空间的一部分,以使用户和内核模式之间的切换更加有效。

32位程序仅具有3GB虚拟地址空间的假设是无效的,但是由于某些旧版程序错误地假设了这一点,因此Linux“个性”系统使您可以通过模拟此行为来运行它们。可以通过setarch命令的-3选项进行访问。