2013-08-24 86 views

回答

13

爲了給出一個合理的答案,我們首先回顧一些概念。

大多數現代處理器都有一個內存管理單元(MMU),它被用於許多目的。

一個目的是在虛擬地址(CPU「看到」的那個)和物理地址(芯片實際連接的地方)之間映射。這被稱爲地址轉換。

另一個目的是爲特定的虛擬內存的位置設置訪問屬性(東西像內存讀寫,或只讀,或無法訪問)

隨着MMU,你可以有所謂的「團結映射「處理器的虛擬地址與物理地址相同(即不使用地址轉換)。例如,如果處理器訪問0x10000,則它正在訪問物理位置​​0x10000。

「扁平」內存模型通常指的是CPU訪問的任何虛擬地址都是唯一的。因此,對於32位CPU,地址空間的最大限制爲4G。

它通常(雖然不一定)用於指代虛擬內存和物理內存之間的統一映射。相比之下,在工作站領域,大多數操作系統(Linux/Windows)都使用「重疊」內存模型。例如,您在Windows中啓動的任何程序(一個進程)將具有0x10000的起始地址。

窗口如何有10個進程都從地址0x10000運行?

這是因爲每個進程都使用MMU來映射虛擬地址0x10000到不同的物理地址。對於P1可能有0x10000 = 0x10000,而P2有0x10000 = 0x40000,等等......

在RAM中,程序是在不同的物理地址,但CPU虛擬地址空間看起來每個進程相同。

據我所知,Windows和Standard Linux總是使用重疊模型(即它們沒有平面模型)。 uLinux或其他特殊內核可能有一個扁平模型。

現在,保護與平坦與受保護模型無關。 我會說大多數重疊的模型操作系統將使用保護,以便一個進程不會影響(即寫入另一個進程的內存)。使用VxWorks 6.x並引入Real-Time Processes,即使使用平面內存模型,通過使用保護也可以保護各個RTP(以及內核應用程序)。

如果您不使用RTP並在vxWorks內核中運行所有內容,則不會使用保護。


那麼,保護如何工作(無論是在VxWorks RTP或其他操作系統進程中)? 從本質上講,RTP/Process存在於具有一定範圍的(虛擬)地址的「內存氣泡」中,該地址包含代碼,數據,堆以及其他各種內存位置。

如果RTP/Process嘗試訪問其外部存儲區以外的內存位置,MMU將生成一個異常並調用OS(或信號處理程序)。典型的結果是段違例/總線異常。

但是,如果一個進程無法轉義它的內存泡沫,一個進程如何將一個數據包發送到以太網端口?這取決於處理器體系結構,但本質上,用戶端(RTP)套接字庫(例如)會進行「系統調用」 - 這是一個將cpu切換到內核空間和超級用戶模式的特殊指令。此時,某種設備驅動程序(通常駐留在內核中)運行將數據推送到某個硬件設備。一旦完成,系統調用返回,我們回到運行用戶代碼的RTP /進程空間。

操作系統負責所有MMU編程,系統調用處理等......這對應用程序是不可見的。

+1

感謝您的詳細解答。您能否介紹一下如何在VxWorks 6.x中的兩個RTP之間提供內存保護? – Ritesh