0xfff<something> 处的用户space 地址
User-space address at 0xfff<something>
我正在 gdb 上调试一个简单的程序,我看到堆栈帧内的局部变量地址如下所示 -- 0xffffbc10
、0xffffc340
等
我的理解是内核-space 地址占用 0xffffffff
到 0xcfffffff
,而用户-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
选项访问。
我正在 gdb 上调试一个简单的程序,我看到堆栈帧内的局部变量地址如下所示 -- 0xffffbc10
、0xffffc340
等
我的理解是内核-space 地址占用 0xffffffff
到 0xcfffffff
,而用户-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
选项访问。