我想知道Linux内核如何在x86_64上的0x7fffffffffff下面映射用户空间部分(如堆栈,堆和全局变量)。
内核是否更喜欢每个部分的固定起始地址?或者它在某种程度上取决于链接器的决定?每个部分的大小是多少?
答案 0 :(得分:2)
Linux(以及大多数其他现代操作系统)正在做一些名为Address space layout randomization的事情。这允许操作系统将堆栈,堆和库移动到任意位置,以防止某些类型的攻击。</ p>
需要链接器支持的唯一部分是文本部分 - 您需要构建enter link description here以便随机化本节的开头。
关于部分的大小,文本部分显然取决于二进制大小,以及特定程序的已初始化和未初始化数据部分。最大堆栈大小由内核控制,堆大小由程序中断确定(有关图形描述,请参阅enter link description here),可以通过调用brk (2)
来更改堆栈大小。