作業系統虛擬位址轉換為實體地址是如何避免衝突的?

時間 2021-05-05 18:19:46

1樓:jiangtao9999

你都說了分頁,又有頁表概念了,為什麼理解不了?

頁表等於是告訴了作業系統,哪個頁是哪個程式用的。

作業系統遇到記憶體訪問時,通過查詢頁表就可以知道記憶體什麼地方歸誰用。之後再去對應去翻譯虛擬位址和實際位址就行了。這個轉換我記得 CPU 自己的功能不需要作業系統自己實現,除非沒有 MMU 。

至於程式,原則上是不需要考慮物理記憶體位址的,每個程式自己都是獲得了整個硬體設計上支援的全部記憶體空間。當然這是虛擬的。包括 32 位計算機計算機只有 1G 記憶體,但是在應用程式上,依然有 4G 記憶體的空間。

這個虛擬的空間和實際物理記憶體位址,是靠作業系統和 CPU 去翻譯的。

至於頁表怎麼管理,我印象裡這個要看 CPU 的設計,有些作業系統是兩個頁表,乙個核心用乙個使用者程式用,也有作業系統是乙個頁表,各有優缺點。沒印象有作業系統是乙個應用乙個頁表的,不過這東西都在使用者頁表上,不排除通過特殊手段來限制範圍,讓乙個程式固定在乙個範圍內來提供快速查詢。

頁表應該是每個程式都有自己的好幾個專案,裡面就是標註程式自己的虛擬頁位址和實體地址的對應關係。我印象裡,有些作業系統固定乙個頁就是 64/128M,當然也有大有小,有些系統好像還支援動態大小。

所有在這個區間內的訪問,通過這乙個轉換可以知道記憶體的對應關係。至於置換,我記得有些作業系統是用 3 級頁表,專門記錄不在記憶體裡面的頁表,以及空閒的交換區容量。

嗯,很多年前看的,是不是正確不清楚了。僅供參考。

2樓:海淀遊民

Q1、我覺得你是混淆了軟硬體的功能。

設程序要從乙個位址 vaddr 讀出乙個整形值(設4個位元組),CPU 根據頁表暫存器拿到頁表實體地址,再在頁表中用 vaddr 查出實際的實體地址 paddr,最後從 paddr 處讀出四個位元組。

以上過程是 CPU 的硬體功能。也就是說,作業系統是利用了硬體的功能來實現程序間記憶體隔離,如果硬體不支援,作業系統自己是做不了這件事的。

所以,乙個程序在執行前,作業系統要為它設定好頁表暫存器,讓它指向程序自己專屬的頁表。

如果上面的看懂了,你就應該能明白了:

1、兩個程序的虛位址可以完全是一樣的,只要經過頁表翻譯後指向不同的物理記憶體位址即可

2、乙個程序所佔據的物理頁,完全可以是不連續的,甚至在物理上順序是無所謂的

實際上,乙個應用程式裡資料的虛位址,已經被編譯器寫死了。

一般的帶頁式記憶體轉換的CPU,例如英特爾CPU,都有個標誌位,指示記憶體是否使用頁暫存器進行翻譯,硬體啟動時,該標誌位不做翻譯,作業系統第乙個被載入系統,這時它就可以:

1、獲取全部的物理記憶體頁,並建表管理起來

2、設定好自己的頁表,設定標誌位使用翻譯,進入翻譯模式(英特爾叫保護模式)。

關於後面的缺頁按需載入。

當程序的某個頁表位址為空(0x000……),CPU 硬體會丟擲異常,並呼叫一段事先註冊好的程式去處理(已經被作業系統註冊了),那個程式就會檢查,程序想要訪問的位址是否合法,如果合法,就從空閒物理頁中拿出乙個填入程序的頁表,恢復回程序繼續執行。

如何理解虛擬位址空間?

St.John 一般文中出現虛擬的東西,大都不是真實存在的。虛擬位址空間就是以程式設計師視角,作業系統提供的乙個可操作空間。很形象的比喻就是你找銀行貸款,銀行說能給你貸款數額5 100w,這個區間就是你借款區間,至於真正能不能貸款到指定數額的,還得看你的財務狀態和銀行的現金流情況。這裡也是類似的,虛...

ELF檔案裡面section的虛擬位址是如何在鏈結(link)時確定的?

安陽 先簡略的回答一下,因為每個使用者任務乃至核心都會維護自己的乙個頁目錄和頁表,頁目錄的位址是控制暫存器指向的,在切換任務的時候,要切換cr3指向的頁目錄,加上虛擬記憶體,就是說哪怕兩個任務的線性位址相同,但是也會因為不是同一套頁目錄頁表的關係,經過mmu計算之後,得出的實體地址也會不同 我天,你...

程式發出的位址都是虛擬位址,即程式只存在於虛擬空間中,據說虛擬空間的大小與系統的長度有關,這是為什麼?

答問題的第一部分 由於作業系統本身也是一組程式,所以我們應當首先把 程式 明確地區分為 作業系統程式 與執行其上的 應用程式 兩類。應用程式使用虛擬位址是作業系統的要求,在有這種要求的作業系統中,物理記憶體的使用由作業系統去排程,作業系統把物理記憶體按一定策略 規則對映給上層的應用程式。作業系統中負...