2013-05-20 90 views
1

Ref。 Linux kernel ARM Translation table base (TTB0 and TTB1)ARM Linux內核頁表

我在以前的鏈接討論了主題父親疑問/查詢:

  1. 0至0xbfffffff是存儲器(用於用戶進程)的下部和在TTB0由頁表管理,它包含當前進程的頁表

    Ref。臂/包括/ ASM/pgtable-2level.h:PTRS_PER_PGD = 2048,PTRS_PER_PMD = 1,PTRS_PER_PTE = 512

  2. 0xc00000000的爲0xffffffff是地址空間的上半部分(OS和存儲器映射I/O)管理/由TTBR1中的頁表翻譯。 TTB1表的大小和對齊方式固定(至16k)。大小的每個1級條目都是32位,代表1MB的頁面/段。這是swapper_pg_dir(REF System.map)頁表是放在下面的實際文本地址16K
  1. 的是,在swapper_pg_dir = 0第768項(0x0到0xbfffffff用戶進程),並從768有效進入1024(0xc0000000到0xffffffff用於OS和內存映射I/O)?

  2. 任何人都喜歡在內核空間(內核模塊)共享一些示例代碼來瀏覽此swapper_pg_dir PGD?

+0

如果您閱讀引用的話題,則不使用TTB0/TTB1。只使用一個版本。典型的Linux內存模型的拆分是錯誤的。這對其他操作系統可能有好處。 –

+0

Thx爲您的更新。 –

+0

Thx爲您的更新。請您確認 - (1)swapper_pg_dir中的每個條目對應1MB的內存部分? (2)任何遍歷PGD列表的例子(每個條目8字節和2048個條目)? –

回答

4

由於ARM MMU的設計方式,翻譯表(TTB0和TTB1)只能用於1:1映射內核映射。

大多數Linux內核具有3:1映射(3GB用戶空間:1GB用於ARM的內核空間)。 這意味着0-0xBFFFFFFF是用戶空間,而0xC0000000 - 0xFFFFFFFF是內核空間。

現在對於HW存儲器轉換,僅使用TTBR0。 TTBR1僅保存初始交換頁面(包含所有內核映射)的地址,並不真正用於虛擬地址轉換。 TTBR0保存當前使用的頁面目錄(HW用於翻譯的頁表)的地址。現在每個用戶進程都有自己的頁表,並且對於每個進程切換,TTBR0更改爲當前用戶進程頁表(它們都位於內核空間中)。

例如,對於每個新的用戶進程,內核創建一個新的頁面目錄,將所有內核映射從swapper頁面(3-4GB的頁面幀)複製到新的頁面表並清除用戶頁面(頁面從0-3GB的幀)。然後它將TTB0設置爲該頁面目錄的基地址,並刷新緩存以安裝新的地址空間。交換頁面也隨時更新映射。

對於你的問題:

  1. 簡化,硬件上的第一級頁面有4096項。每個條目代表1MB的虛擬地址,總計4GB的內存。條目0-3071代表用戶空間,條目3072-4095代表內核空間。

  2. 交換頁面通常位於地址0xC0004000-0xc0008000(4096個條目* 4bytes每個條目= 16384 = 16kb在十六進制= 0x4000)。通過查看0xc0004000-0xc0007000處的內存,您可以找到用戶空間的條目(空),從0xc0007000-0xc0008000可以找到內核條目。我使用gdb和命令行x /100x 0xc0007000來檢查前100個內核條目。然後,您可以檢查當前平臺的技術參考手冊以破譯頁表屬性。

如果您想了解更多關於Linux內核的知識,我建議您使用Qemu與gdb一起模擬Beagleboard來檢查和調試源代碼。我這樣做是爲了瞭解內核在初始化過程中如何構建頁表。

+0

MrGigu,請讓我知道你的意思是「TTBR0保存當前使用的頁面目錄的地址(硬件用於翻譯的頁表)。我很難理解頁面表在兩個操作系統級別和硬件級別(即MMU),所以您所說的頁面目錄(頁表的第一級)設置了僅具有虛擬地址的Linux操作系統,並且將這些虛擬地址提供給硬件時(MMU單元)作爲輸入,MMU的輸出是一個物理地址,但我不明白在這個過程中如何使用Harware頁表? –

+0

Hello Amit,頁表位於RAM的某處,用於32位Linux ARM,通常位於虛擬地址0xc0004000 - 0xc0008000。因此,頁表中包含4096個條目,每個條目佔用4個字節,即16KB空間。爲簡單起見,假設每個條目映射爲1MB節頁,則條目0映射虛擬地址0,條目1廣告服裝0x0100 0000,條目2地址0x0200 0000等最多0xFFF0 0000,即總共4GB的RAM。 – MrGigu

+0

從最後一條消息開始繼續:現在每個頁條目都可以映射到一個自定義物理地址,所以如果條目1映射到地址0x0a00 0000,那麼對虛擬地址0x0100 0000的所有訪問都將被轉換爲物理地址0x0a00 0000.這是頁表位於軟件,硬件MMU在虛擬地址空間中查看每個訪問的翻譯。 MMU也有一個稱爲TLB的緩存,其中最近的和經常翻譯的條目被緩存在系統中。 – MrGigu