程序位址空間

2021-06-16 08:14:18 字數 963 閱讀 4463

這篇文章應該不能說是原創的,這裡的記錄都是我通過閱讀整理來的,並沒有太多的自己的想法。(資料:《現代作業系統》)

之所以去了解位址空間也是因為在學習dll的時候看到要將dll對映到程式的位址空間,不甚明了所以去查詢相關的資料。位址空間其實很好理解(當然針對早期的機器),早期的機器是沒有ram,rom,cache,磁碟這樣多種儲存介質的,程式要寫到rom中(大學裡就寫過這樣的rom晶元),然後處理器就到rom中去取指令,這時這個rom能被cpu訪問的空間就是位址空間。這個空間取決於兩個方面,一方面記憶體的實際物理大小,如這個rom只有512m那麼cpu最多也只能訪問到這麼大的位址空間,另一方面也取決於機器的字長,如8為的cpu能訪問的位址對多有2的8次方即256b,16位的cpu能訪問64k的記憶體,當然借助於暫存器的位址拼接能訪問更大的位址空間。

早期的程式都是將程式寫入rom中,他們乙個接著乙個,所以要實現多道程式設計很困難,程式中的跳轉指令可能會使這個程式跳到另乙個程式,使程式崩潰,更有可能跳到作業系統程式,引起系統崩潰。早期的ibm360機器採取了保護鍵的硬體機制,乙個保戶鍵就記錄乙個程式編號,當取指令時判斷暫存器中的程式編號是否和保戶鍵中的編號一樣,不同就是錯誤,而針對跳轉指令等則需要對程式重定位,可以在暫存器中加入程式的偏移量,然後和指令中的位址相加,但無疑這種做法費時費力。

隨著硬體的發展,儲存裝置也越來越豐富,現在採用的是分層策略,快速昂貴的如cache和記憶體做的小,速度慢便宜的做的體積大。同時程式也在不斷變大,現在的記憶體已經無法將所有程式全部載入記憶體之中,有兩種解決方式:

2.虛擬記憶體:這種技術被廣泛使用,他為程式邏輯上分配乙個很大的定址空間,每個程式都能擁有這樣大的邏輯位址空間,然後將這個空間對映到實際的實體地址。對映是如何實現的呢?首先將虛擬位址和實體地址分塊,塊的大小一樣,虛擬位址的一塊叫一頁,物理的叫乙個葉匡。然後有一張表存放了虛擬位址業和實際物理葉匡的對應關係,虛擬位址會被送到乙個叫mmu的地方進行位址解析,如果發現當前的頁沒有對應的頁會出現缺頁中斷,就到磁碟中將**載入到記憶體中,這裡載入也涉及到演算法。

程序位址空間

kernel筆記 程序位址空間 2013 09 03 09 53 49 分類 linux 下圖是x86 64下linux程序的預設記憶體布局形式 下面逐一分析以上各個位址段的含義。text 段 段,從虛擬記憶體位址00400000開始,使用pmap 可以檢視到,這個位址是固定的 linux pmap...

程序位址空間

程序位址空間 1.可執行檔案 的記憶體對映,稱為 段 2.可執行檔案的已初始化全域性變數的記憶體對映,稱為資料段 3.包含未初始化的全域性變數,也就是bss段的零頁的記憶體對映 4.用於程序使用者控制項棧的零頁的記憶體對映 5.任何記憶體對映檔案 6.任何共享記憶體段 7.任何匿名的記憶體對映,比如...

程序位址空間

下圖是x86 64下linux程序的預設記憶體布局形式 下面逐一分析以上各個位址段的含義。text 段 段,從虛擬記憶體位址00400000開始,使用pmap 可以檢視到,這個位址是固定的 linux pmap 27729 bash 00400000 552k 480k 260k 0k 0k r x...