歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 處理器在 protected mode 下的 protection

處理器在 protected mode 下的 protection

日期:2017/2/28 14:22:54   编辑:Linux教程

前言

實模式,保護模式,分段,分頁,虛擬內存,內核態,用戶態,如果你對這些術語之間的關系非常熟悉,那就不用繼續看了。這篇主要記錄我對用戶態/內核態的一些理解,如有不對還請指教。

下述說明均為 x86-32 模式。

簡述

分段/分頁機制實現了邏輯地址到物理地址的轉換,為每個程序提供了自己獨立的虛擬內存空間,與其他應用程序進行隔離,防止修改其他程序相關數據。開啟了分頁機制之後,CPU 硬件會對所有代碼進行內存映射處理,不管是應用程序還是操作系統,都會使用虛擬內存機制。

對於4G 線性地址空間而言, linux 將最高 1G 空間映射為內存使用的空間,除去高端內存等小范圍概念,基本上內核的地址減去 PAGE_OFFSET 偏移就是其實際物理地址。注意這裡我沒有說 4G 線性地址空間的主體,它的主體是所有的進程,甚至包括內核自身。 每個進程都有自己的 CR3 ,每個進程的 CR3 的地址映射的最高 1G 都是一樣的,是通用的內核本身。

剛開始啟動的時候內核是作為一個可執行程序啟動,但在啟動完成後當有系統調用時,內核代碼開始執行,此時它所使用的 CR3 還是原進程的 CR3,所以我們會說一個程序在內核態運行。

我們為什麼需要用戶態/內核態之間的切換?

用戶態/內核態 不是原因,只是結果,只看結果是看不出什麼的。引入 用戶態/內核態 的原因是因為 privilege level, 用戶態/內核態的區分只是實現 privilege protection 的一種形式,而這種方式依賴於 分段/分頁來實現。

內存隔離與保護 —————-> 分段/分頁
privilege(特權等級) —————-> 用戶態/內核態

假設只有分段/分頁,其依賴於 GDT/LDT 與 CR3 寄存器指向的 page structure, 乍一看提供了隔離,但是如果沒有 privilege level 的保護,應用程序可以自己修改自己的 CR3 指向的內存映射,這個內存保護也就形同虛設了,更不用提一些危險的指令了。

假設只有privilege level,那也肯定不行,甚至連多程序運行都不可能。

所以說區分內核態/用戶態除了提供系統調用功能,更多的是進行 privilege 保護,不同模式下只允許運行對應的 CPU 指令。所有運行在內核態的代碼共享一個虛擬內存空間,也就是通過分段/分頁機制使得所有進程的 3G~4G 線性地址空間指向同一塊區域,也就是內核區域。從這個方面來看,此時操作系統不再是啟動時的可執行程序,更像是一個單例的共享庫一樣給所有進程使用。許多圖片上將操作系統畫成應用程序下的獨立一層應該更符號這個結構。

總結

之所以寫這篇文章是在自制操作系統的過程中對內核的虛擬地址配置有所疑問,不理解所有程序共用 3G~4G內存的原因,很多文章一上來就會告訴你這是內核態使用,我相信從 特權等級 的概念引申出去了解內核態和用戶態會更為簡單。

Copyright © Linux教程網 All Rights Reserved