2015-11-06 85 views
1

假設我們有一個具有MMU,其工作原理如下的CPU:內核空間和用戶空間佈局

  • 內存管理只使用尋呼
  • 每個進程都有自己的頁表
  • 的每 過程
  • 虛擬地址被分成用戶空間與內核空間 (如使用尋呼不許多CPU)
  • 內核空間(具體他的虛擬地址)被所有之間共享進程(例如更高地址)

現在想象一下,我們正在運行多個進程(當然在非特權模式下)。當我們想爲任何進程分配額外的內存時,它只是在我看來應用以下場景。我們執行系統調用,並通過更新進程頁表或者報告一些錯誤代碼來爲系統調用提供服務(在特權模式下)。

我的問題:但是現在,當我們要分配給內核的一些記憶,我們必須更新都在各自的核心部分地址的所有進程的表?據我所知,沒有任何核心頁面表,理論上可以解決這個問題(但帶來其他問題),在類似的CPU中。那麼如何解決這種情況,如果有可能發生?

對不起,我的英文。

+0

如果您的頁面表存儲爲樹形結構(例如https://www.kernel.org/doc/gorman/html/understand/understand-html006.png from https://www.kernel.org/doc/gorman /html/understand/understand006.html),有少量的指針來描述內核空間;您甚至可以將這些指針指向內核空間的單個pmd-subtree。在這種情況下,您將只爲所有進程執行一個子樹更新。 – osgx

+0

@osgx謝謝你的回答,但是你想告訴我,當一個進程啓動它的頁面表時,指向了屬於內核空間(多級頁面)的頁表的指針?下面的情況會不會更好?我們有兩個用於指向頁表的指針寄存器 - 第一個用於用戶空間,第二個用於內核空間。兩者都描述了所有虛擬空間,而每一個頁面都描述了它們的地址空間部分。這種結構中的關鍵問題是每個進程與其他進程具有完全相同的內核空間,還是在內核空間中有一些例外? –

回答

0

最後,我找到了解決辦法。我認爲,這種聯繫說明了一切:

ARM Solution

很重要的一點就是表6.13。翻譯表尺寸。總而言之,每個進程的虛擬空間當然分爲內核空間和用戶空間。但是,兩個空間都有自己的表。進程切換時,內核表指針不變,但用戶表指針改變。我希望你明白這一點。

對不起,我的英文。

+2

太棒了!關於arm Linux的另一個描述 - http://elinux.org/Tims_Notes_on_ARM_memory_allocation得到了同樣的結論「*就是說,當發生上下文切換時,內核會將'TTBR0'設置爲'current-> mm.pgd'來處理新進程。'TTBR1'是整個系統的全局資源,它代表內核的頁表。*「and comment」* ARM使用一種奇怪的方式將Linux頁表映射到ARM硬件表上。仍然不確定x86/x86_64 linux(http://lxr.free-electrons。com/source/Documentation/x86/x86_64/mm.txt)和其他受歡迎的*專有*操作系統 – osgx

+0

應在https://www.kernel.org/doc/gorman/pdf/understand.pdf的某處回答,但該書太容易找到它。本書的第86-87頁有一個註釋:「4GiB/4GiB用戶/內核拆分」,它表示在32位x86中有2.4(可能在2.6中啓用)的補丁。修補程序內核和用戶將只有16 MB的公用地址空間;內核將在syscall/sysexit上使用自己的虛擬空間。 – osgx

+0

@osgx感謝您的關注。 –

相關問題