asp*_*100 1 c gdb virtual-address-space
我调试的GDB一个简单的程序,我看地址栈帧中的局部变量,看起来像下面- 0xffffbc10,0xffffc340等等.
这是我的理解是内核空间地址占用0xffffffff到0xcfffffff,并且该用户空间地址的开始0xbfffffff.
为什么这里出现差异?
编辑:请注意,我已关闭虚拟地址空间随机化,堆栈保护程序,并使用-m32编译.这是我的编译命令,如果它有帮助:
gcc -m32 -z execstack -fno-stack-protector -ggdb -static test.c -o test
如果您在64位主机(和64位内核)上运行32位程序,则应用程序通常可以使用整个32位地址空间.原则上,这也可以在32位内核上实现,但Linux和(所有?)其他主要内核保留虚拟地址空间的一部分,以便更有效地在用户和内核模式之间切换.
假设32位程序只有3GB的虚拟地址空间无效,但由于某些遗留程序错误地认为这一点,Linux"个性"系统允许您通过模拟此行为来运行它们.可以通过setarch命令-3选项访问它.