2015-02-11 162 views
2

超過896MB的線性地址對應於高內存區域ZONE_HIGHMEM。 因此,頁面分配器功能在這個區域不起作用,因爲它們給出ZONE_NORMAL和ZONE_DMA中直接映射的頁面幀的線性地址。內核虛擬地址空間中的高內存映射

我感到困惑的Undertanding Linux內核指定的這幾行:

  1. 做什麼時,他們說,他們的意思是「在64位硬件平臺ZONE​​_HIGHMEM始終是空的。」

  2. 這是什麼突出的語句意味着:「高內存頁幀的分配是通過alloc_pages只是做()函數,因爲它們不存在這些函數不返回線性地址取而代之的是函數返回線性地址這些線性地址總是存在的,因爲在內核初始化期間,所有的頁面描述符在低內存中一次性分配一次。「

什麼是這些頁面描述符,896MB是否已經擁有整個RAM的所有頁面描述符。

回答

1
  1. 的X86-32內核需要高存儲器訪問除物理內存1G多,因爲不可能永久大於2^{32}的地址的32位地址空間,並在內核中映射/用戶分割爲1G/3G。 x86-64內核沒有這樣的限制,因爲可物理尋址的內存(當前爲256T)的數量適合其64位地址空間,因此可以永久映射。 高內存是一個黑客。理想情況下,你不需要它。的確,x86-64的重點是能夠直接處理所有你可能想要的內存。拍攝 from https://www.quora.com/Linux-Kernel/What-is-the-difference-between-high-memory-and-normal-memory

  2. 我認爲頁面描述符的意思是struct page。並考慮到尺寸struct page。是的,他們都可以存儲在ZONE_NORMAL中

+0

瞭解第一個問題。關於第二,是使用alloc_pages()分配的高內存,我讀了alloc_pages會返回NULL爲高內存,因爲沒有映射存在。他的意思是:「這些線性地址總是存在的,因爲在內核初始化期間,所有的頁面描述符都會在內存中分配一次,直到永遠。」 – Haswell 2015-02-11 06:27:21

+1

AFAIK,高內存只能由alloc_pages分配,因爲__get_free_pages和kmalloc返回的是邏輯地址而不是結構頁。但即使使用alloc_page,它的分配並不嚴格,當你將__GFP_HIGHMEM分配給alloc_page時,分配器的第一個首選項是ZONE_NORMAL。而且大部分的分配都會在ZONE_NORMAL中結束。 – 2015-02-11 08:20:23

+0

@MilindDumbare,在32位或64位情況下,「lowmem」地址0的基址的VA是什麼?從你的評論看來,似乎暗示給定物理內存的基本VA,我們只需訪問'base_VA + desired_RAM_location'即可訪問RAM中的任何字節。很明顯,我們可以在64位的情況下訪問所有的物理內存,但是這個問題對於32位的情況仍然有效(即我們可以訪問所有的「lowmem」)。 – sherrellbc 2017-06-23 17:09:08

相關問題