有没有办法在GDB中检查内核空间?

时间:2014-10-06 03:47:23

标签: memory x86 kernel

我可能在这里有一个更基本的误解,所以我将概述所有内容:

我希望更好地了解程序在内存中的布局。从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)

据我所知,很多这些地址都有可能发生变化,但它帮助我通过为事物分配数字来形象化。

无论如何,在上面的源代码中提供的下图中,有一个专用于程序地址空间顶部的内核空间的块:

Memory Layout

但是允许一整千兆字节!我检查的程序中的堆栈顶部是0xffffd010,之后为内核相关的东西留下的空间非常小。它真的存在吗?它是否会增长,在虚拟地址空间中推动其余的程序段更加紧密?更重要的是,我该如何检查并使用它?

1 个答案:

答案 0 :(得分:1)

  

我检查的程序中的堆栈顶部是0xffffd010,之后为内核相关的东西留下的空间非常小。它真的存在吗?

您的堆栈位于内存顶部 - 没有内核映射。这表明以下情况之一就是这样:

  • 您在64位系统上运行32位二进制文​​件,因此内核在64位空间中处于关闭状态,您无法看到它。
  • 您正在运行一个应用了the 4GB/4GB patch的奇怪内核,因此内核(再次)位于一个完全独立的地址空间中
  • 您使用的是非x86架构,始终为用户和系统进程提供单独的地址空间(比如PowerPC,我相信?)

要了解您的地址空间实际的外观,请在运行过程中查看/proc/$pid/maps

  

是否会增长,在虚拟地址空间中将其余的程序段推得更近?

没有。内核映射的大小被编译到内核中,并且永远不会在运行时更改。 (它可以配置为2GB / 2GB而不是3GB / 1GB,但这种情况非常罕见。)

  

更重要的是,我该如何检查并使用它?

你不能 - 至少不能来自用户空间。这就是内核的存在。