本文將主要以x86架構為例來介紹linux記憶體管理的段機制。
段的保護屬性:表示段的特性。例如該段是否可以被讀出或寫入。或者該段是否可以作為乙個程式來執行,以及段的特權等級
圖 段描述符的一般格式
圖 段描述符表(段表)
索引描述虛擬位址空間段的編號;基位址是線性位址空間段的起始位址
補充:保護模式下段描述符表分為:
全域性描述符表(gdt)
中斷描述符表(idt)
區域性描述符表(ldt)
注:為加快對如上描述符表的訪問,intel為之設計了專門的暫存器,存放描述符表的基位址及表的長度界限
段暫存器存放段描述符表的索引(段號,也叫選擇符),即從段描述符表中選擇某個段.其中:索引(13位指明段號);
ti(table index)指明使用全域性描述符表還是區域性描述符表;
rpl(requestor previlege level):2位指定4種特權級,用來決定核心態還是使用者態
圖 保護模式下的段暫存器
保護模式提供了四個特權級,用0~3四個數字表示linux將整個虛擬位址空間劃分為乙個段,段的基位址為0,段的界限為4g。一般作業系統只使用了其中最低和最高兩個,即0表示最高特權級,核心態;3表示最低特權級,使用者態
保護模式規定高特權級可隨意訪問低特權級,低特權級不能隨便訪問高特權級
圖 位址轉換
(1)在段暫存器(16位選擇器)中裝入段選擇符,同時把32位位址偏移量裝入某個暫存器(比如esi、edi等)中。
(2)根據選擇符中的索引值、ti及rpl值,再根據相應描述符表中的段基位址和段界限,進行一系列合法性檢查(如特權級檢查、界限檢查),如果該段無問題,就取出相應的描述符放入段描述符高速緩衝暫存器中。
(3)將描述符中的32位段基位址和放在esi、edi等中的32位有效位址(偏移量)相加,就形成了32位線性位址。
(1) 在乙個段內,如果偏移量大於段界限,虛擬位址將沒有意義,系統將產生異常。
(2) 如果要對乙個段進行訪問,系統會根據段的保護屬性檢查訪問者是否具有訪問許可權,如果沒有,則產生異常。例如,如果要在唯讀段中進行寫入,系統將根據該段的屬性檢測到這是一種違規操作,則產生異常。
由於很多體系結構並不要求段機制必選,因此這樣處理即使用了段機制又巧妙的化解了段機制
在ia32上任意給出的位址都是乙個虛擬位址,即任意乙個位址都是通過「選擇符:偏移量」的方式給出的,這是段機制存訪問模式的基本特點所以在ia32上設計作業系統時無法迴避使用段機制,ia32規定段機制是不可禁止的,因此不可能繞過它直接給出線性位址空間的位址
乙個虛擬位址最終會通過「段基位址+偏移量」的方式轉化為乙個線性位址
由於絕大多數硬體平台都不支援段機制,只支援分頁機制,所以為了讓linux具有更好的可移植性,我們需要去掉段機制而只使用分頁機制
linux的設計人員乾脆讓段的基位址為0,而段的界限為4gb,這時任意給出乙個偏移量,則等式為「0+偏移量=線性位址」,也就是說「偏移量=線性位址」。另外由於段機制規定「偏移量 <4gb」,所以偏移量的範圍為0h~ffffffffh,這恰好是線性位址空間範圍,也就是說虛擬位址直接對映到了線性位址,
我們以後所提到的虛擬位址和線性位址指的也就是同一位址。
看來,linux在沒有迴避段機制的情況下巧妙地把段機制給繞過去了。
由於ia32段機制還規定,必須為**段和資料段建立不同的段,所以linux必須為**段和資料段分別建立乙個基位址為0,段界限為4gb的段描述符。可以設想,如果不使用分頁的話,線性位址空間直接被對映到物理空間,則你修改任何乙個段的資料,都會同時修改其它段的資料不僅如此,由於linux核心執行在特權級0,而使用者程式執行在特權級別3,根據ia32的段保護機制規定,特權級3的程式是無法訪問特權級為0的段的,所以linux必須為核心和使用者程式分別建立其**段和資料段。
這就意味著linux必須建立4個段描述符——特權級0的**段和資料段,特權級3的**段和資料段。
那麼,這是不是意味著使用者可以隨意修改核心資料?顯然不是的,這是因為,一方面使用者段和核心段具有不同的特權級別,另一方面,linux之所以這麼定義段,正是為了實現乙個純的分頁,而分頁機制會提供給我們所需要的保護。
[1] linux記憶體管理講座ppt-陳莉君
Linux記憶體管理機制
經常遇到一些剛接觸linux 的新手會問記憶體占用怎麼那麼多?在linux中經常發現空閒記憶體很少,似乎所有的記憶體都被系統占用了,表面感覺是記憶體不夠用了,其實不然。這是linux記憶體管理的乙個優秀特性,在這方 面,區別於windows的記憶體管理。主要特點是,無論物理記憶體有多大,linux ...
linux記憶體管理機制
linux系統的 物理記憶體就是實際記憶體 虛擬記憶體是為了避免物理記憶體不足而產生的概念,其是磁碟空間虛擬出來的一塊邏輯記憶體,即交換空間 swap space 將不經常使用的資料放在虛擬空間,這樣物理空間有足夠的空閒空間放經常使用的資料。交換空間的大小一般是物理記憶體的幾倍。使用命令free m...
linux 程序記憶體管理 資料段
所有程序 執行的程式 都必須占用一定數量的記憶體,它或是用來存放從磁碟載入的程式 或是存放取自使用者輸入的資料等等。對任何乙個普通程序來講,它都會涉及到5種不同的資料段。段 這個區域儲存著被裝入執行的二進位制機器 處理器會到這個區域取指並執行。段需要防止在執行時被非法修改,所以只准許讀取操作,而不允...