簡體   English   中英

ARM Linux內核頁表

[英]ARM Linux kernel page table

參考 Linux內核ARM轉換表庫(TTB0和TTB1)

我對上一個鏈接中討論的主題有疑問或疑問:

  1. 0到0xbfffffff是內存的下部(用於用戶進程),由TTB0中的頁表管理,它包含當前進程的頁表

    參考 arm / include / asm / pgtable-2level.h:PTRS_PER_PGD = 2048,PTRS_PER_PMD = 1,PTRS_PER_PTE = 512

  2. 0xc0000000到0xffffffff是由TTBR1中的頁表管理/轉換的地址空間的上半部分(操作系統和內存映射的I / O)。 TTB1表的大小和對齊方式固定為16k。 每個1級條目的大小為32位,代表1MB頁面/段。 這是swapper_pg_dir (ref System.map )頁表,該頁表位於實際文本地址下方16K
  1. swapper_pg_dir = 0中的第一個768條目swapper_pg_dir = 0 (對於用戶進程來說是0x0到0xbfffffff),而從768到1024的有效條目(0xc0000000到0xffffffff是用於OS和內存映射的I / O)嗎?

  2. 是否有人喜歡在內核空間(內核模塊)中共享一些示例代碼來瀏覽此swapper_pg_dir PGD​​?

由於ARM MMU的設計方式,兩個轉換表(TTB0和TTB1)只能在1:1映射內核映射中使用。

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

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

例如,對於每個新的用戶進程,內核會創建一個新的頁面目錄,將所有內核映射從交換器頁面(3-4GB的頁面框架)復制到新頁面表中,並清除用戶頁面(0- 3GB)。 然后,它將TTB0設置為該頁面目錄的基地址,並刷新緩存以安裝新的地址空間。 交換器頁面也始終與映射保持最新。

對於您的問題:

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

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

如果您想了解有關Linux內核的更多信息,建議您使用Qemu和gdb一起模擬Beagleboard,以檢查和調試源代碼。 我這樣做是為了了解內核如何在初始化期間構建頁表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM