Linux位址對映 1 線性對映與非線性對映

2021-08-04 12:58:54 字數 2300 閱讀 7049

部落格:fireaxe.blog.chinaunix.net

一,線性對映與非線性對映

1.       記憶體管理

物理記憶體管理:

linux記憶體最小管理單位為頁(page),通常一頁為4k。初始化時,linux會為每個物理記憶體也建立乙個page的管理結構,操作物理記憶體時實際上就是操作page頁。某些裝置會對映在物理記憶體位址外,這些位址會在使用時建立page結構。

程序記憶體管理:

linux程序通過vma進行管理,每個程序都有乙個task_struct結構體進行維護,其中的mm_struct結構體管理這程序的所有記憶體。mm_struct中維護者乙個vma鍊錶,其中的每乙個vma節點對應著一段連續的程序記憶體。這裡的連續是指在程序空間中連續,物理空間中不一定連續。如果使用malloc等申請一段記憶體,則核心會給程序增加vma節點。

2.       為何核心與程序空間不重合

程序:0~3g

核心:3g~4g

程序與核心合起來使用了4g的位址空間,而不是各自使用4g空間,獲得的好處是程序進入核心是不需要切換頁表,降低了進出核心的消耗。

在2.6核心中,所有程序的核心空間(3g~4g)都是共享的。

linux啟動後,第乙個程序是init程序,它的頁表與核心頁表是一致的,系統中的其他所有程序都是init程序的兒子或後代。linux中程序建立通過fork()實現,子程序的pgd與pte是父程序的拷貝此時會把核心程序的頁表拷貝到每個程序中。在各個程序的執行過程中,他們的頁表可能會發生變化,比如發生缺頁異常。如果是程序頁表發生改變,則只要改變程序的頁表項(0g~3g)就夠了,如果是核心頁表發生變化,則必須通知到所有程序改變各自維護的乙份核心頁表(3g~4g)。最簡單的方法是每次核心頁表改變後,遍歷所有程序去改變他們維護的核心頁表,顯然效率很低。linux核心通過page fault機制實現核心頁表的一致。核心頁表改變時,只改變init程序的核心頁表。當程序訪問該頁時,會發生乙個缺頁異常,異常處理中通過init程序更新當前程序的核心頁表。

3.       非線性區域

非線性區與線性區是核心位址空間中的概念。

對於非線性區存在,可以做如下的解釋。

linux物理記憶體空間分為dma記憶體區(dma zone)、低端記憶體區(normal zone)與高階記憶體區(highmem zone)三部分。dma zone通常很小,只有幾十m。低端記憶體區與高階記憶體區的劃分源於linux核心空間大小的限制。

linux核心只有1g的空間,通常核心把物理記憶體與其位址空間做了線性對映,也就是一一映,這樣可以提高記憶體訪問速度。

當記憶體超過1g時,線性訪問機制就不夠用了,只能有1g的記憶體可以被對映,剩餘的記憶體無法被核心使用。當然無法忍受。

為了解決這一問題,linux把核心分為線性區與非線性區兩部分。線性區規定最大為896m,剩下的為非線性區。與線性區不同,非線性區不會提前進行記憶體對映,而是在使用時動態對映。線性區對映的物理記憶體成為低端記憶體,剩下的記憶體被稱為高階記憶體。

假設物理記憶體為2g,則地段的896m為低端記憶體,通過線性對映給核心使用。其他的1128m記憶體為高階記憶體,可以被核心的非線性區使用。由於要使用128m非線性區來管理超過1g的高階記憶體,所以通常都不會對映,只有使用時才使kmap對映,使用完後要盡快用kunmap釋放。

使用128m管理1g的記憶體是不是有點小馬拉大車的感覺?其實不會,因為高階記憶體的大部分要程序使用。

對於物理記憶體為1g的核心,系統不會真的分配896m給線性空間,896m最大限制。下面是乙個1.5g物理記憶體linux系統的真實分配情況,只有721m分配給了低端記憶體區,如果是1g的linxu系統,分配的就更少了。

memtotal   1547mb

hightotal     825mb

lowtotal     721mb

申請高階記憶體時,如果高階記憶體不夠了,linux也會去低端記憶體區申請,反之則不行。

4.linux管理之外的實體地址空間(other addr)

理論上,32位系統可管理的實體地址空間為4g。x86架構多一些io空間。計算機系統中的每個裝置都是要占用一定的實體地址空間的,如pci裝置,所以不會把4g都給記憶體,這也意味著32位系統無法支援4g記憶體。

對於這部分物理記憶體之外的實體地址空間,這段空間不知道應該怎麼稱呼,這裡暫時稱為device zone。

由於device zone沒有被linux管理,也就不會為它建立page結構來管理,因此linux中使用該段記憶體時都是直接使用其實體地址,而使用物理記憶體則是通過向linux申請free page來實現。同樣道理,這塊肯定也不會對映到線性區,而是使用ioremap對映到非線性區域,或直接用mmap對映到程序空間。

固定對映的線性位址

核心位址空間 核心線性位址空間 3gb,3gb 896mb 線性對映 實體地址空間 0,896m 核心線性位址空間 3gb 896mb,4gb 用來實現 非連續記憶體分配 和 固定對映 固定對映 固定對映的線性位址以 任意方式 與前896mb線性對映方式相比 對映任何實體地址空間 固定對映使用的線性...

位址對映,儲存器對映

學習乙個事項的時候,注意三點 是什麼,有什麼用 功能 如何配置 實現 操作 1,為了保證 cpu執行指令時可正確訪問 儲存單元 需將使用者程式 中的邏輯 位址轉換 為執行時由機器 直接定址 的實體地址,這一過程稱為位址對映。2,位址對映結構 在tornado target h vmlib.h檔案中 ...

Linux位址對映 位址轉換 mmap,vma

一,線性對映與非線性對映 1.記憶體管理 物理記憶體管理 linux 記憶體最小管理單位為頁 page 通常一頁為 4k。初始化時,linux 會為每個物理記憶體也建立乙個 page 的管理結構,操作物理記憶體時實際上就是操作 page 頁。某些裝置會對映在物理記憶體位址外,這些位址會在使用時建立 ...