我可能在这里有一个更基本的误解,所以我将概述所有内容:
我希望更好地了解程序在内存中的布局。从here开始,我做了一些简单的程序,并在GDB中打开它们,看看在更实际的意义上放置的东西:
0x0 - 0x08048000 = ??
0x08048000 = Start .text section
0x08048000 = PLT
0x08048300 = _start
0x08048400 = main
0x08048480 = other functions
0x0804a000 = GOT
0x0804a020 = Start .data section
0x0804a028 = Start .bss section
(random offset)
0x0804b008 = Start heap
...
0xf7?????? = Start memory mapping section
0xf7e50000 = #included library function definitions
0xf7ff0000 = Linux dynamic loader
(random offset)
0xffffd010 = Top of stack (grows negatively)
(random offset)
据我所知,很多这些地址都有可能发生变化,但它帮助我通过为事物分配数字来形象化。
无论如何,在上面的源代码中提供的下图中,有一个专用于程序地址空间顶部的内核空间的块:
但是允许一整千兆字节!我检查的程序中的堆栈顶部是0xffffd010,之后为内核相关的东西留下的空间非常小。它真的存在吗?它是否会增长,在虚拟地址空间中推动其余的程序段更加紧密?更重要的是,我该如何检查并使用它?
答案 0 :(得分:1)
我检查的程序中的堆栈顶部是0xffffd010,之后为内核相关的东西留下的空间非常小。它真的存在吗?
您的堆栈位于内存顶部 - 没有内核映射。这表明以下情况之一就是这样:
要了解您的地址空间实际的外观,请在运行过程中查看/proc/$pid/maps
。
是否会增长,在虚拟地址空间中将其余的程序段推得更近?
没有。内核映射的大小被编译到内核中,并且永远不会在运行时更改。 (它可以配置为2GB / 2GB而不是3GB / 1GB,但这种情况非常罕见。)
更重要的是,我该如何检查并使用它?
你不能 - 至少不能来自用户空间。这就是内核的存在。