日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Linux地址映射--线性映射与非线性映射

發布時間:2023/11/27 生活经验 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux地址映射--线性映射与非线性映射 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一,線性映射與非線性映射

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()實現,子進程的PGDPTE是父進程的拷貝此時會把內核進程的頁表拷貝到每個進程中。在各個進程的運行過程中,他們的頁表可能會發生變化,比如發生缺頁異常。如果是進程頁表發生改變,則只要改變進程的頁表項(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分配給了低端內存區,如果是1Glinxu系統,分配的就更少了。

MemTotal???1547MB

HighTotal?????825MB

LowTotal?????721MB

申請高端內存時,如果高端內存不夠了,linux也會去低端內存區申請,反之則不行。

?

4.???????linux管理之外的物理地址空間(other Addr

理論上,32位系統可管理的物理地址空間為4Gx86架構多一些io空間。計算機系統中的每個設備都是要占用一定的物理地址空間的,如PCI設備,所以不會把4G都給內存,這也意味著32位系統無法支持4G內存。

對于這部分物理內存之外的物理地址空間,這段空間不知道應該怎么稱呼,這里暫時稱為Device Zone

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

http://blog.chinaunix.net/uid-20528014-id-314322.html

總結

以上是生活随笔為你收集整理的Linux地址映射--线性映射与非线性映射的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。