1. 程式人生 > >作業系統記憶體地址對映

作業系統記憶體地址對映

記憶體管理的機制

這裡主要是做個知識點的記錄,方便以後檢視

記憶體是現代計算機的執行的中心,記憶體是由很大的一組字或者是位元組組成的,每個字或者是位元組都是有它們自己的地址,以及CPU會根據程式計數器(PC)的值從記憶體中提取指令,這些指令可能會引起進一步對特定記憶體地址的讀取和寫入

在一個典型的指令執行週期當中,首先會從記憶體中去讀取指令。接著這個指令被解碼,以及可能需要從記憶體中讀取運算元,在指令對運算元執行之後,其的結果可能被存到記憶體中

需要注意的是CPU能直接訪問的儲存器只有記憶體和處理器內的暫存器,機器指令可以用記憶體地址作為引數,但是不能用磁碟的地址作為引數,所以其實CPU在執行指令的時候一定要保證所要用的資料在CPU可以直接訪問的儲存裝置當中

CPU的內建暫存器通常可以在一個CPU的時鐘週期當中完成訪問,對於暫存器當中的內容,絕大多數CPU可以在一個時鐘週期內去解析並且去執行一個或者是多個指令,但是對於記憶體的訪問則是可能需要多個CPU的時鐘週期,而CPU執行有些指令的時候是需要資料的,如果沒有資料的話有些指令就執行不了,所以CPU的效率就會受到影響,所以為了解決記憶體訪問頻繁的情況,解決方法就是在CPU和記憶體之間去增加高速記憶體,這種協調速度差異的記憶體的緩衝區被稱為是快取記憶體

我們除了去保證訪問實體記憶體的相對的速度之外,我們還要確保作業系統所在的記憶體空間不被使用者的程序所訪問,以及確保使用者程序不被其他使用者程序訪問,這種保護可以通過硬體來實現,方法有多種,這裡就介紹一種可能的情況

為了確保每個程序都有獨立的記憶體空間,所以我們需要去確定程序可訪問的合法地址的範圍,並且確保程序只訪問其的合法地址,我們可以通過兩個暫存器拿來當做基地址暫存器以及界限地址暫存器,基地址暫存器當中包含最小的合法實體記憶體地址,界限地址暫存器決定了範圍的大小,就比如說如果基地址暫存器中是3000,界限地址暫存器中是1000,那麼程式可以訪問的記憶體地址範圍就為3000-4000。這種記憶體空間的保護是通過CPU硬體對使用者模式所產生的每一個地址與暫存器的地址進行比較來完成的,如果說使用者模式下要去訪問作業系統的記憶體和其他使用者程序的記憶體就會報錯

關於記憶體地址的訪問範圍
這裡寫圖片描述

在上述的保護模式下,只有作業系統可以通過特殊的特權指令去載入基地址暫存器和界限地址暫存器,所以使用者程序是無法改變的,只有作業系統可以去修改基地址暫存器和界限地址暫存器的值,作業系統在核心模式下執行,可以無限制的去訪問作業系統和使用者的記憶體,所以作業系統可以將使用者程式裝入使用者記憶體,在出錯的時候輸出這些程式,訪問並修改系統呼叫的引數等

通常情況下,程式以二進位制可執行檔案的形式儲存在磁碟上,為了執行,程式被調入記憶體並放在程序空間內。根據所使用的記憶體管理方案,程序在執行時可以在磁碟和記憶體之間進行移動,在磁碟上等待調入記憶體以便執行的程序形成輸入佇列

一般來說使用者程式在執行前,需要經過好幾個步驟(如下圖所示),其中有些是可選的,在這些步驟當中地址可能有不同的表示形式,源程式中的地址

這裡寫圖片描述

通常我們將指令和資料繫結到記憶體地址有以下的幾種情況

  • 編譯時:如果在編譯的時候就知道程序將在記憶體當中的駐留地址,那麼就可以生成絕對的程式碼,比如說我們事先就知道使用者程序駐留在記憶體地址1000,那麼所生成的編譯的程式碼就可以從該位置開始往後擴充套件
  • 載入的時候,如果編譯的時候並不知道程序將駐留在記憶體的什麼地方,那麼編譯器就必須去生成可重定位的程式碼,對於這種情況的話,由於源程式中的地址通常是用符號來表示的(比如a),這樣的話編譯器通常會將這些符號地址繫結在可重定位的地址(比如說從本模組開始的第14個位元組),然後載入程式再將這些可重定位的地址去繫結成絕對地址
  • 執行時,如果程序在執行時可以從一個記憶體段轉移到另一個記憶體段,那麼繫結就必須延遲到執行時才會進行,這個繫結就是指的是繫結成絕對的地址,採用這種方案是需要特定的硬體的,絕大多數通用計算機作業系統採用這種方法

邏輯地址空間與實體地址空間

CPU生成的地址通常稱為邏輯地址,而載入到記憶體地址暫存器的被稱為實體地址,執行時從虛擬地址到實體地址的對映是被稱為記憶體管理單元的硬體裝置來完成的

從虛擬地址到實體地址的對映我們可以通過去使用重定位暫存器,就是說使用者程序所生成的地址在遞交記憶體之前,都會加上重定位暫存器的值,就比如說如果說重定位暫存器當中的值為14000,然後我們使用者對使用者程序位置0的訪問就會動態地重定位為14000,對地址346的訪問就會將其對映為14345,運行於Intel 80x86系列的CPU的MS-DOS作業系統在載入和執行程序的時候,就可以使用4個重定位地址暫存器

記憶體管理單元利用重定位暫存器做的地址對映

這裡寫圖片描述