0xfff<something> 处的用户space 地址

User-space address at 0xfff<something>

我正在 gdb 上调试一个简单的程序,我看到堆栈帧内的局部变量地址如下所示 -- 0xffffbc100xffffc340

我的理解是内核-space 地址占用 0xffffffff0xcfffffff,而用户-space 地址从 0xbfffffff 开始。

为什么会出现这种差异?

编辑:请注意,我已关闭虚拟地址 space 随机化、堆栈保护器,并且正在使用 -m32 进行编译。如果有帮助,这是我的编译命令:

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

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

32 位程序只有 3GB 虚拟地址的假设 space 是无效的,但由于一些遗留程序错误地假设了这一点,Linux "personality" 系统允许你 运行 他们模仿这种行为。它可以通过 setarch 命令的 -3 选项访问。