2012-03-28 32 views
2

我想出了這個問題,因爲我不明白如何在內核區域執行地址轉換。CPU要求地址高於0xC0000000時如何執行地址轉換(virt-> phy)?

據我所知,要翻譯0xC0000000以上的任何地址,我們只需要減去這個地址PAGE_OFFSET(除了內核初始化過程,我們需要一個8MB範圍的頁表)。但是在CPU執行需要地址的指令時,例如0xF0000020,而系統只有256MB RAM,這沒有意義。

由於上述原因,我認爲內核確實有一個頁表,它允許MMU將高於0xC0000000的虛擬地址轉換爲物理地址。因此,在什麼情況下我們可以直接減去PAGE_OFFSET以及在什麼情況下我們需要內核頁表?

我可能在開始的時候出錯,所以請更正。


編輯

從< <瞭解Linux的虛擬內存管理>>,它說:內核頁表存在。現在,越來越迷茫......

3.6內核頁表

當系統第一次啓動,分頁沒有啓用,因爲頁表不 神奇初始化自己。每個體系結構實現這個不同,所以只討論x86情況。頁表初始化分爲兩個 階段。引導階段爲8MiB設置頁表,以便可以啓用分頁 單元。 第二階段初始化其餘頁表。我們 在下面的章節中討論這兩個階段。

3.6.1自舉

...

3.6.2敲定

負責敲定頁表的函數被調用paging_init()。圖3.4中可以看到x86上該函數的調用圖。 enter image description here

功能首先調用pagetable_init()來初始化必要 頁表以引用的所有物理存儲器中ZONE_DMA和ZONE_NORMAL。請記住,無法直接引用ZONE_HIGHMEM中的 高內存,並且臨時爲其設置映射 。對於內核使用的每個pgd t,調用引導存儲器 分配器(請參閱第5章)爲PGD分配一個頁面,並且如果可以使用PSE 位,則使用4MiB TLB條目而不是4KiB。如果不支持PSE 位,則會爲每個pmd分配一個PTE頁面。如果CPU 支持PGE標誌,則它也將被設置,以便頁表項將爲全局 ,並且對所有進程都可見。然後,pagetable_init()調用fixrange_init()在FIXADDR_START開始的虛擬地址空間末尾設置固定地址 空間映射。這些映射用於諸如本地高級可編程中斷控制器(APIC)之類的用途以及kmap_atomic()所需的FIX_KMAP_BEGIN 和FIX_KMAP_END之間的原子映射。最後,該函數調用 fixrang_init()來初始化與kmap()映射的普通高內存映射所需的頁表項。

pagetable_init()返回之後,內核空間中的頁表現在完全 初始化,因此靜態PGD(swapper_pg_dir)被裝入CR3寄存器,從而 該靜態表現在正在使用的尋呼單元。

paging_init()的下一個任務是負責調用kmap_init()到 用PAGE_KERNEL保護標誌初始化每個PTE。最後的任務是 來調用zone_sizes_init(),它初始化所有使用的區域結構。

回答

0

雖然線性映射對人類來說可能看起來很特殊,但它對於MMU配置來說(通常)並不是特殊的。

正如你所說,要將虛擬地址從3G轉換到3G + 900MB,我們可以直接用PAGE_OFFSET減去這些地址。這是否意味着內核不需要任何頁表?

它仍然需要這些表來解釋到MMU的特定(線性)映射。雖然有一些特殊情況,如MIPS R3000

但是,在CPU執行,在需要地址的指令這沒有任何意義,說0xF0000020

我問是否有意義在首位的是地址指令執行。我的意思是,在具有256MB RAM的系統上,你不會只是遇到這樣的請求(至少假設代碼不是越野車)。

令您困惑的一點是IMO:誰負責做地址翻譯?答案是(通常)MMU,通過硬件實現。因此,頁表是MMU如何進行翻譯的方式 - 這不是內核責任。內核只需要配置MMU。

當CPU需要高於0xC0000000的地址時,如何執行地址轉換(virt-> phy)?

就像下面的地址一樣。 This閱讀可能會有所幫助。

0

對於前900MB的物理內存(如果存在)有一個線性映射,以便該內存的虛擬地址等於物理內存加上PAGE_OFFSET。當然,這並不妨礙將相同的物理內存映射到進程地址空間中的其他地方,如果內核想要將該內存用於其他目的。

+0

正如你所說,要將虛擬地址從3G轉換到3G + 900MB,我們可以直接用PAGE_OFFSET減去這些地址。這是否意味着內核不需要任何頁表?但是,它確實存在,所以我不明白爲內核頁表提供什麼服務。請參閱編輯。 – sliter 2012-03-28 20:49:55

+0

一切都需要線性模式的頁表;這個映射只是一個約定,可以更容易地訪問第一個900MB的物理內存。 – Neil 2012-03-29 20:43:51

0

實際上你的用戶空間程序甚至內核都使用虛擬尋址。這意味着每個內存請求都通過MMU。如果這樣下去,通過MMU它使用頁表(見86 CR3寄存器)

virtual addr --> MMU --> physical addr 

和內核不使用,當你訪問lowmem一些神奇的優化。是lowmem是直接映射的,這就是爲什麼從人的角度來看,您可以通過簡單的減法將虛擬地址lowmem轉換爲物理地址,但是CPU通過內核頁表進行這種轉換。