編譯Linux內核2.6.34.3對ARMv7(Cortex-A8的)Linux內核ARM轉換表基(TTB0和TTB1)
我看着內核代碼,它看起來像Linux內核設置了硬件頁表TTB1(轉換表基礎)上的內核地址空間(超過0xC0000000的所有內容)和ttb0上的所有用戶進程(0xC0000000以下的所有內容),每個進程上下文切換都會發生更改。它是否正確?我仍然困惑MMU如何知道翻譯需要哪些ttb?
我讀到TTBCR(轉換表基本控制寄存器)確定哪個ttb寄存器在找不到MVA時行走,但是寄存器始終讀爲0,這意味着始終使用ARM體系結構參考手冊中的TTBR0。這怎麼可能?任何人都可以向我解釋Linux內核如何使用這兩個ttbs?
我讀了如何從這個網站http://www.cs.rutgers.edu/~pxk/416/notes/09a-paging.html入藏作品,但我還是不明白內核如何使用這兩種TTBS
(雙重檢查內核代碼,因爲某些原因都ttb0和ttb1設置,但似乎像ttb1從來沒有使用過,我把TTB1寄存器設置爲0,並且Linux內核像往常一樣繼續運行)
在你包圍的鏈接,'TTBR0仍將包含操作系統的內存映射和內存映射I/O.',我猜他們的意思是說'TTBR1仍將包含操作系統的內存映射,內存映射I/O.',這對3G/1G(2G/2G)內存拆分更有意義。 'TTBR0'映射進程AS,地址從0到0xbfffffff,'TTBR0'在每個進程切換期間切換。 'TTBR1'永遠不會被修改,因爲它包含了到內核AS的鏈接(從具有3G/1G分裂的Linux上的0xc000000開始)。 – Benoit
感謝您的回覆,所以對於每個表格散步,硬件只使用TTB0是否正確?硬件不使用TTBCR來確定哪些ttb寄存器要走?那麼TTB1僅用於將OS頁面複製到進程頁面? – MrGigu