抽象 位址空間

2021-10-03 10:38:57 字數 1552 閱讀 9432

小結早期的單道程式,作業系統是很簡單的,僅僅是一組供使用者程式呼叫的函式。

之後,為了提高效率,出現了多道程式共享機器。當某個程序在等待i/o時,可以切換到其他程序,盡可能少的讓機器處於等待狀態,提高利用率。

又有了新的需求,想要提高互動性,大家都想要盡快地得到相應,所以出現了時分共享系統。

時分共享地實現:其實想法很簡單,就是將執行的所有程序輪轉,共享cpu。比較粗糙的方式就是將暫停的程序的資訊儲存到磁碟,再把要執行的程式載入記憶體。相比於將多個程序保留在記憶體中,將暫停的程序狀態儲存到磁碟更容易實現,但是,如果牽扯到對磁碟的i/o,效率很低。

所以,程序應該保留在記憶體,而不是儲存到磁碟。因此,新的需求就出現了:保護。不希望乙個程序可以讀取其他程序的記憶體,更不允許它讀取作業系統的記憶體。

作業系統需要提供乙個易用的記憶體抽象。這個抽象叫做位址空間,是執行的程序看到的的記憶體(而不是真實的物理記憶體)。

如圖,就是乙個程序的位址空間。圖中位址空間中的位址,是程序看到的虛擬位址。位址空間是從0kb開始的,稱之為虛擬記憶體,是因為不能將他載入到實體地址為0的地方,所以程序使用的位址是虛擬的。

虛擬記憶體系統的主要目標是透明。也就是說,程序看不到物理記憶體,看到的僅僅是自己的位址空間。

在程序看來,位址空間中的記憶體都是它自己占有的,而實際執行時,程序「不知道」真實的實體地址,程序只使用位址空間的虛擬位址,而遮蔽掉了真實的位址。

舉個例子:

可以看到,分別輸出了三個不同段的位址。看到的這些位址都是虛擬位址。真實的實體地址只有作業系統和硬體知道,每當程序訪問自己位址空間中的某個虛擬位址時,作業系統和硬體將這個虛擬位址轉換為實體地址,然後再對實體地址進行操作。

根據輸出的虛擬位址,**段和堆基本上是「挨在一起」的,但這僅僅是在位址空間中的排布,在真實的情況它們兩可能離得很遠。

當乙個程序執行載入,儲存或指令提取時,不應該以任何方式訪問或影響其他程序或作業系統本身的記憶體內容。關於保護的實現,在之後的部落格中說明。

程序共享記憶體後,在時間上不應該影響執行的效率;在空間上不需要太多額外的記憶體支援虛擬化。

虛擬記憶體系統負責為程式提供乙個巨大的、稀鬆的私有的位址空間假象,其中儲存了程式的所有指令和資料。作業系統在專門的硬體幫助下(下篇部落格討論),將位址空間中的虛擬位址轉換為實體地址。

系統位址空間,PCI位址空間

1 系統位址空間與 pci 位址空間 1.1 pci 位址空間 pci 匯流排具有 32 位資料 位址復用匯流排,所以其儲存位址空間為 2的32次方 4gb 也就是 pci 上的所有裝置共同對映到這 4gb 上,每個 pci 裝置占用唯一的一段 pci 位址,以便於 pci 匯流排統一定址。每個 p...

位址空間 位址生成

位址空間定義 邏輯位址生成 1 生成過程 1 編譯 高階語言 組合語言 2 彙編 組合語言 機器語言 5 例,乙個 c 程式中的函式位置 變數名是一種邏輯位址,將 c 語言編譯成組合語言,組合語言中依然使用變數和函式名等來進行編寫,將組合語言進行彙編形成 o 程式,o 程式的起始位址都是從 0 開始...

邏輯位址空間和實體地址空間

位址空間是乙個程序可用於定址記憶體的一套位址集合。1 程式經過編譯後,每個目標模組都是從0號單元開始編址,稱為該目標模組的相對位址 或邏輯位址 2 當鏈結程式將各個模組鏈結成乙個完整的可執行目標程式時,鏈結程式順序依次按各個模組的相對位址構成統一的從0號單元開始編址的邏輯位址空間。3 使用者程式和程...