在做uboot移植的時候對**的重定向產生乙個疑問,不理解為什麼把uboot讀到以鏈結位址作為起始位址的sdarm記憶體空間。對鏈結位址、虛擬位址、實體地址也傻傻分不清,後來學習計算機組成原理中的虛擬儲存器時了解到虛位址(邏輯位址)、實位址(實體地址)以後我就認為鏈結位址就是虛擬位址。在學習了作業系統中儲存器管理和虛擬儲存器之後,我堅信我的猜測是正確的,只不過虛擬位址和實體地址的關係取決於儲存管理的方式。
虛擬儲存器:主存和輔存之外附加的硬體和軟體的實現,也是用來提高輔存到主存的訪問效率的一種機制。
虛擬位址應該可以有兩個解釋,對於計算機虛擬位址就是虛擬儲存空間中位址,對於程式設計師虛擬位址就是編寫程式時指定的位址。
鏈結位址也是cpu執行位址,即cpu所能看到的位址,實際的實體地址需要mmu的轉換。
由於現在各種整合開發工具(ide)的使用,讓很多程式設計師(尤其是應用程式設計師)對鏈結位址感到很陌生。現在ide會幫助我們完成所有的編譯、鏈結工作。我認為鏈結位址可以從兩個角度來看,從cpu的角度來看是執行位址,從程式設計師的角度來看鏈結位址也是虛擬位址的一部分。
我個人理解在虛擬位址概念引入後,在編寫程式時所有位址都可以說是虛擬位址(邏輯位址),因為它們可以無限的大。指令位址也是資料,鏈結位址就是指出去哪個位址單元取出指令執行,cpu得到的始終時鏈結位址,然後轉換得到實際指令的實體地址。
儲存管理有單一連續分配、動態可重定位分割槽分配、分頁式儲存管理方式、分段是儲存管理方式、段頁式儲存管理方式。
單一連續分配,就是把使用者程式讀到和邏輯位址相同的實體地址,此時只能執行乙個作業。單一連續分配需要程式設計師非常熟悉記憶體的分布。(邏輯位址、鏈結位址和實體地址相同)
動態可重定位分割槽分配,用於多道程式設計中,能夠根據程序的實際需求動態的分配記憶體空間。(邏輯位址 != 實體地址)
分頁儲存管理方式,將程式劃分為若干個大小固定的區域(頁),也把物理記憶體劃分為大小和頁相等的塊,通過頁表完成頁到塊的對映。(邏輯位址!=實體地址)
分段是儲存管理方式,把使用者程式按照位址空間劃分為不同的段,每段可以定義完整的資訊。在儲存分配時以段為單位,段的物理位置可以不同,從而實現了離散化分配。(
邏輯位址!=實體地址
)段頁式儲存管理方式,同時具有前兩者優點的儲存管理方式。(
邏輯位址!=實體地址)
邏輯位址和實體地址的關係由儲存管理的方式有關。
uboot的重定位可以使用單一連續分配的方式來完成,因為uboot是上電後執行的第乙個程式,它獨佔cpu。從nand flash讀到sdarm的起始位址就是鏈結位址,此時虛擬位址和實體地址相同。
在做mmu驗證實驗時發現windows和ubuntu的列印結果不同,這個問題讓我感到十分的困惑。
(1)windows下的**:
(2)windows下的結果
(3) ubuntu下的**
(4)ubuntu下的結果
由此可見在windows下同時執行的兩個程序的變數位址相同,在ubuntu下同時執行的兩個程序的結果不同。經過一番終於查詢終於知道了其中的原因。現在的作業系統採用了棧空間隨機化技術(alsr),防止被黑客使用
ret2libc
攻擊,然而這種技術需要軟體和硬體的支援。我在windows下使用code::block編譯的**,生成的可執行檔案沒有支援這種技術,所以棧位址不變為且始終為a變數的虛擬位址。我使用visual studio 2015編譯的**就可以支援棧空間隨機化技術(alsr)。同樣ubuntu也可以禁止棧空間隨機化技術(alsr)技術,禁止後兩個程序的列印結果是相同的,如圖6。
禁用(alsr): sudo echo 0 > /proc/sys/kernel/randomize_va_space
啟用(alsr): sudo
(1)虛擬儲存,乙個程式調入主存前在虛擬儲存中進行分頁,提高主存輔存的訪問速度。
(2)現在作業系統中程序在記憶體中是離散化的分布。以分頁儲存管理方式來說,每個程序中有乙個頁表,記錄著其在記憶體的位置。當cpu發出訪問位址請求時,通過位址轉換機構(mmu)來得到實體地址,然後通過儲存管理器訪問記憶體,實現資料的讀寫。
(3)如果訪問主存時資料沒有在主存中將產生缺頁中斷,這是需要把虛擬儲存器中相應的頁調入主存中。
(1)資料執行保護,在記憶體上執行額外檢查以幫助防止在系統上執行惡意**,其基本原理是將資料所在記憶體頁標識為不可執行。
《dep原理及關閉》
(2)棧位址隨機化aslr技術。 《
使用ret2libc攻擊方法繞過資料執行保護》
《棧隨機化》
作業系統 儲存器管理
程式的裝入和鏈結 連續分配方式 基本分頁儲存管理方式 基本分段儲存管理方式 虛擬儲存器的基本概念 請求分頁儲存管理方式 頁面置換演算法 請求分段儲存管理方式 使用者程式要在系統中執行,必須先將它裝入記憶體,然後由編譯程式 compiler 對使用者源程式進行編譯,形成若干個目標模組 object m...
作業系統 儲存器管理
第四章 儲存器管理 儲存器的層次結構 儲存器的三層結構,cpu暫存器 暫存器 主存 快取記憶體,主儲存器,磁碟快取 輔存 固定磁碟,可移動儲存介質 處理機都是從主儲存器中取得指令和資料,將取得指令放入指令暫存器中,資料放入資料暫存器中 暫存器存放運算元,作位址暫存器加快位址轉換速度 快取記憶體用以緩...
作業系統 儲存器管理
使用者程式要在系統中執行的話,就必須裝入記憶體,然偶後將其轉變為乙個可執行的程式。程式的鏈結 程式的裝入 程式裝入記憶體的問題解決了,但是記憶體又是怎麼為程式分配記憶體的?連續分配 分配演算法 基於索引搜尋 分配操作 事先規定最小的剩餘分割槽大小size,當需要分配u.size大小記憶體的時候,從空...