2014-10-06 50 views
0

我可能在這裏有一個更根本的誤解,所以我會概括一切:有什麼方法可以檢查GDB中的內核空間嗎?

我想更好地瞭解程序如何在內存中佈局。從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

我檢查的程序中堆棧的頂端是0xffffd010,之後爲與內核相關的東西留下了很小的空間。它真的在那裏嗎?

您的堆棧位於內存的頂部 - 沒有內核映射。這表明以下情況之一是:

  • 您在64位系統上運行32位二進制文​​件,因此內核在64位空間中無法看到它。
  • 你在一個完全獨立的地址空間運行與the 4GB/4GB patch一個奇怪的核心應用,所以內核(再次)
  • 你對總是具有獨立的地址空間爲用戶提供非x86架構和系統進程(如PowerPC的,我相信?)

要獲得看看你的地址空間實際上的樣子,而它的運行看一看/proc/$pid/maps爲您處理。

它是否增長,將其餘的程序段在虛擬地址空間中靠得更近?

不。內核映射的大小被編譯到內核中,並且在運行時不會改變。 (它可以配置爲2GB/2GB而不是3GB/1GB,但這種情況很少見)。

更重要的是,我該如何檢查它並使用它?

你不能 - 至少,不能從用戶空間。這就是內核所在的地方。

+0

你的第一個猜測是完全正確的。我在使用-m32標誌編譯的64位Ubuntu上運行一個程序。謝謝! – Rstevoa 2014-10-06 16:09:31

相關問題