arm linux 存儲,linux arm的存儲分布那些事

原標題:linux arm的存儲分布那些事

linux arm 內存分布總覽

ed7ad14e8933ded7ed0c119345b4fcb9.png

上圖是linux的arm的虛擬地址分布總覽,我們按從低地址到高地址的順序逐個描述,每項的描述包括如下的內容的組和:

地址范圍大小,虛擬轉物理的接口函數,各個區域對應的分配函數,該區域有什么作用,使用場合等等。

首先開始第一個區域:CPUvector page null pointer trap

該區域的大小是一個page頁的大小,對于那些不支持中斷向量重映射的cpu,該區域用來存儲對應的中斷向量表;

對于那些支持中斷向量重映射的cpu,該區域用來撲獲0地址的非法訪問,即null指針。針對arm體系,他是支持中斷向量重映射,該區域一般保留不用,用來撲獲null指針。

第二個區域:應用程序地址空間

地址大小范圍屬于[0x1000, 0xbf000000],我知道每個應用進程都有如下幾個段:text段即存儲代碼段,data段即存儲初始化的數據段,bss段即存儲未初始化的數據段,堆(malloc,free),棧(往下生長)。他們的地址分布如下:

圖1

07e834538c831364668ff8cfff81ebcd.png

在應用程序加載到內存后,會為每個段,分一個vma的內核結構體,并且為每個段都分配了虛擬地址(虛擬地址和大小都存儲在vma結構體中),當可執行程序的各個段在加載的時候,就會給其分配虛擬地址,每個段對應內核的一個vma結構,程序所有段對應的vma,都掛在程序對應的進程的struct mm結構中,但并未給他分配實際的物理地址,待cpu實際去訪問它時,才會去實際建立物理到vma指定的虛擬地址映射,并且將對應的段內容從elf文件中拷貝到相應的物理內存中。

譬如當cpu要訪問text段時,這個時候并未建立相應的映射表,所以會產生page fault異常,從而在異常處理中,linux的內存管理系統會為其分配物理內存, 并從二進制可執行程序的elf文件讀取text段到物理內存,并且為該進程對應的頁表建立該物理頁到虛擬地址的映射,這樣cpu就可以訪問該進程的text段,并且執行對應的指令了。

stack跟heap都一樣,在cpu有實際的訪問時,才會分配物理內存,并建立物理到對應的虛擬地址(在程序加載時,vma中就已經分配了虛擬地址)映射。這樣做,就可以節省程序運行時實際物理內存的使用。而不是程序一開始就建立了所有物理到虛擬的映射,從而導致物理內存被大量不必要的消耗。

第三個區域:模塊地址

該區域用來為內核模塊分配地址,譬如在insmod一個驅動模塊時,會通過如下的流程:sysinit_module-->load_module-->layout_and_allocate-->move_module-->module_alloc_update_bounds-->module_alloc來為模塊的各個段分配虛擬地址

圖2

139ae031d62f286416afc3f0ca789d77.png

line42可見:就指定了模塊的虛擬地址范圍為:[MODULES_VADDR,MODULES_END] = [0xbf000000,0xbfe00000],總計14MB。注意此時__vmalloc_node_range進行了實際的物理內存分配,并且建立了物理到虛擬地址的映射。

第四個區域:PKMAP地址段

該區域跟fixmap區域都是用來將高端物理內存頁映射到內核的線性地址范圍,以使內核能夠訪問他。但為什么還要分兩個區域呢?他們有什么異同?

kmap和fixmap驅動的地址范圍都是有限的,所以不能長久持有,最好使用完后,就盡快的釋放。

其中kmap區域的API函數為:kmap/kunmap,該函數可以休眠,在地址資源緊張的時候就會發生休眠。

fixmap區域的api函數為:kmap_atomic/__kunmap_atomic,該函數為每個cpu都保留一個地址槽,并且該函數是原子的,不會休眠。使用kmap_atomic影射高端物理內存頁,處理完后(并且該處理不應該休眠,同時kmap_atomic還會禁止搶占),就應該盡快調用__kunmap_atomic進行釋放。所以該函數可以在中斷上下文中使用

kmap地址段的開始虛擬地址和大小在trunk/arch/arm/mm/mmu.c中的kmap_init函數就指定了。

關于kmap的詳細分析,見我的另一篇blog文章。

第五個區域:內核地址空間的直接映射區,即linux內核的低端內存區

該區域也稱為內核邏輯地址空間 是指從PAGE_OFFSET(3G)到high_memory之間的線性地址空間,是系統物理內存映射區,它映射了全部或部分(如果系統包含高端內存)物理內存。內核邏輯地址空間與系統RAM內存物理地址空間是一一對應的,內核邏輯地址空間中的地址與RAM內存物理地址空間中對應的地址只差一個固定偏移量(3G),如果RAM內存物理地址空間從0x00000000地址編址,那么這個偏移量就是PAGE_OFFSET(0xc0000000)。

系統初始化過程中將低端內存永久映射到了內核邏輯地址空間,為低端內存建立了虛擬映射頁表。低端內存內物理內存的物理地址與線性地址之間的轉換可以通過__pa(x)和__va(x)兩個宏來進行:

#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) __pa(x)將內核邏輯地址空間的地址x轉換成對應的物理地址,相當于__virt_to_phys((unsigned long)(x)),

__va(x)則相反,把低端物理內存空間的地址轉換成對應的內核邏輯地址,相當于((void *)__phys_to_virt((unsigned long)(x)))

該區域的內存分配函數:kmalloc/kfree和__get_free_page都是從低端內存來分配內存

第六個區域:高端內存vmalloc區

該區域是屬于linux內核的高端內存地址,該區域分配的虛擬地址是連續的,但對應的物理地址則可能是不連續的。該區域的內存分配api函數為:vmalloc/vfree, 該區域的api可以用來分配大片內存,但對應的物理內存可能是不連續的。該函數會修改頁目錄映射表,因為要為對應的虛擬地址和物理地址建立映射關系。

另外vmalloc區域跟高端內核(high_memory)有一個8MB的保留區域。端內存的物理地址與線性地址之間的轉換不能使用上面的__pa(x)和__va(x)宏,關于該區域linux內核的文檔:arm/memmory.txt有如下的描述:

vmalloc() / ioremap() space.

Memory returned by vmalloc/ioremap will

be dynamically placed in this region.

Machine specific static mappings are also

located here through iotable_init().

VMALLOC_START is based upon the value

of the high_memory variable, and VMALLOC_END

is equal to 0xff000000.

第七個區域:DMA內存映射區

該區域是為DMA分配內存的,該段區域的開始地址和大小在

trunk/arch/arm/mm/dma-mapping.c中已經指定了。

分別由consistent_base,DEFAULT_CONSISTENT_DMA_SIZE,

CONSISTENT_END指定該區域的開始地址,大小,結束地址。

該區域的內存分配api函數為:dma_alloc_coherent/dma_free_coherent,

該分配函數會建立映射表,并且分配出來的物理地址是連續的。

dma_alloc_coherent的核心函數為:__dma_alloc。具體詳細的流程,

請見我的另外一篇blog。在調用這個api進行dma內存分配時,

虛擬地址是從CONSISTENT_END高地址往consistent_base低地址方向分配的,

即第一次dma_alloc_coherent調用的返回值>第二次dma_alloc_coherent

調用的返回值。請看圖3一個實際的系統dma分配的內存情況

9e5d4caacf0c5743c2e26406b572b732.png

另外dma分配函數分配的物理頁是屬于低端內存,但他會通過__dma_alloc_remap函數,將該物理頁重新映射到dma所屬的地址范圍。所以同一個物理頁存在兩個虛擬地址映射,因為該物理頁對應的低端內存地址在內核初始化的時候,就已經映射建立好了。

第八個區域:Fixmap映射區

該區域的開始地址和大小在trunk/arch/arm/include/asm/fixmap.h文件中指定了,

該區域的地址范圍:[0xfff00000,0xfffe0000],該區域是屬于最頂部的pte頁表中

(set_top_pte),他為系統中的每個cpu都保留了16個page頁的虛擬地址。

該區域有兩個特殊函數:

fix_to_virt/virt_to_fix

#define __virt_to_fix(x)(((x) - FIXADDR_START) >> PAGE_SHIFT)

表示虛擬地址相對FIXADDR_START偏移的頁框數,該返回值應該屬于

[0,15]之間。

第九個區域:CPUvector page

該區域是用來映射cpu的中斷向量表,因為linux arm使用的高端向量,即cpu中斷產生時,pc指針會自動跳轉到0xffff0000+4*vector_num的地方。

圖4

13679b9f59be34f18901dc7b8ea0997c.png

line1107分配一個低端的物理內存頁框,line1109 early_trap_init將中斷向量表的內容拷貝到這個新分配的物理頁框中。

圖5

90cfbc0863bedb390e802de79f6e22e4.png

line1149-1153:將line1107行分配的物理頁映射到虛擬地址0xffff0000,為cpu中斷產生時,做好準備(對應的地址有各自的跳轉代碼,來處理各自的中斷異常)。在這里這個物理頁同樣是存在兩個虛擬地址的映射,一個是低端虛擬地址的影射,一個是高端虛擬地址的映射

最后附一個我們實際使用中的contexA9雙核,ram為1GB大小的系統的linux內存分布情況圖:

圖6

8112eb934feb408d33594e9bb9b024e5.png

可以結合圖1和圖6一起分析來加深對linux的內存分布情況的理解,至于圖1是怎么來的,就需要看上面每個段的具體分析。

166327167_777180

166327167_777180

責任編輯:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532994.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532994.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532994.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux恢復終端默認配置,以gnome-terminal為例,修改gnome3 的默認配置,

以gnome-terminal為例,修改gnome3 的默認配置,gnome連續幾個版本的terminal默認配置文件都是同一個配置文件“b1dcc9dd-5262-4d8d-a863-c897e6d979b9”。這是因為gnome的developers編輯了這個配置文件并作為gnome-terminal的默認配置文件,用來…

c語言字符串文庫總結,C語言程序設計入門:字符串函數

版權聲明:以上文章中所選用的圖片及文字來源于網絡以及用戶投稿,由于未聯系到知識產權人或未發現有關知識產權的登記,如有知識產權人并不愿意我們使用,如果有侵權請立即聯系:55525090qq.com,我們立即下架或…

vs寫c語言能用scanf,【PAT編寫代碼時遇到的問題】vs中使用scanf(%c,x);

首先,為了在VS中使用scanf,可以在程序開頭加上#pragma warning(disable:4996)昨天在編寫程序的時候,突然發現在循環中使用scanf("%c",&x);的時候,發現結果很奇怪,只能讀入和輸出我所輸入的數據的一半。后…

大數計算器概念c語言,用C語言求兩個超大整數的和

用C語言求兩個超大整數的和在生活中,我們經常需要計算非常大的數,但是任何一種計算器都有計算范圍,一旦超過計算范圍就會有精度的損失。或許有同學認為我們可以通過程序來解決,比如對于C語言來說,我們定義一個long lon…

3 5的二維數組C語言程序,C語言及程序設計提高例程-33 二維數組元素的引用

賀老師教學鏈接 C語言及程序設計提高 本課講解輸入輸出二維數組元素#include int main(){int s[3][5], i, j;printf("Input 3*5 numbers\n");for (i0; i<3; i)for(j0; j<5; j)scanf("%d", &s[i][j]);for (i0; i<3; i){for(j0; j<5; j)pri…

android程序 幻燈片,Android:ViewPager制作幻燈片

public class MainActivity extendsActivity {//ViewPagerprivateViewPager viewpager;//幻燈片圖片資源private int [] imgArray{R.drawable.view1,R.drawable.view2,R.drawable.view3};//圖片數組private ArrayListviewlist;privateImageView imageView;//點點privateViewGro…

android獲取圖片方向并旋轉,Android 判斷imageview角度并旋轉

/*** 讀取照片exif信息中的旋轉角度** return角度 獲取從相冊中選中圖片的角度*/public static float readPictureDegree(String path) {int degree 0;try {ExifInterface exifInterface new ExifInterface(path);int orientation exifInterface.getAttributeInt(ExifInterf…

android鍵盤移動光標,在Android鍵盤上完成鍵

Jos Silva..12代替ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));嘗試ic.performEditorAction(EditorInfo.IME_ACTION_GO);執行的操作應該是在EditorInfo上定義的操作,它將在方法onStartInputView上傳遞給您要在操作之間切換,請使用:(sEditorI…

android 遠程桌面連接閃退,遠程桌面一點連接就閃退,不能彈出輸入賬號密碼窗口...

您好&#xff0c;感謝您在我們論壇發帖。首先&#xff0c;按照您的描述&#xff0c;正常情況下&#xff0c;您的客戶端可以遠程連接您的服務器&#xff0c;輸入IP和端口之后&#xff0c;會彈出驗證框&#xff0c;輸入賬戶密碼之后即可進入服務器的桌面。當出現問題時&#xff0…

com.sec.android.app.smartclipservice,EPR Aerospace News

The World Cup Ball And Its Astonishing Effects Can Be Easily Explained Through TheTheory Of Dynamic Interactions, Which Also Applies To The Flight Of The Boomerang.The official World Cup ball, the so called “Jabulani”, which has been object of a lot of c…

signature=5bcdc11c0d509d82e0d44c544cfad97b,江蘇省職稱計算機考試新職稱光盤試卷

試卷一1、世界上第一臺電子數字計算機采用的主要邏輯部件是(D)A光電管 B繼電器 C晶體管 D電子管2、世界上首次提出存儲程序計算機體系結構的是(D)A艾倫〃圖靈 B莫奇萊 C喬治〃布爾 D馮〃諾依曼3、計算機最主要的工作特點是(A)A存儲程序與自動控制 B高速度與高精度C可靠性與可用…

html表格內文字置頂,css如何讓table里的字居中?

css如何讓table里的字居中&#xff1f;下面本篇文章就來給大家介紹一下使用CSS讓table里字居中的方法。有一定的參考價值&#xff0c;有需要的朋友可以參考一下&#xff0c;希望對大家有所幫助。在CSS中&#xff0c;可以通過設置text-align: center;和vertical-align:middle;來…

你是怎么理解HTML語義化,HTML語義化標簽理解

1&#xff1a;語義化標簽是什么&#xff1f;語義化標簽&#xff0c;目的是讓標簽有自己的含義語義化非語義化如上代碼&#xff0c;p標簽含義就是段落&#xff0c;而span標簽毫無意義。2&#xff1a;語義化標簽好處方便用戶閱讀&#xff0c;頁面更加清晰。更好的SEO&#xff0c;…

html5離開網頁自動暫停,通過html5代碼在網頁中實現播放和暫停音樂mp3,mav等文

介紹通過html5代碼在網頁中實現播放和暫停音樂mp3,mav等文件的具體操作方法。這樣對于用戶來說&#xff0c;在線可播放功能能大大提高站內效率也可帶來一定的流量。希望對有需要的朋友有所幫助。這里我們需要先了解下&#xff0c;在html5中的兩個個重要標簽。阿里西西web開發網…

android開發屏幕橫放,android-即使從橫向旋轉到垂直,細節片段也會...

在一個Activity中,我們稱其為MasterActivity,我只想在橫向模式下加載媒體播放的細節片段.準備就緒后,媒體將自動啟動.主從流程設置&#xff1a;我有兩個xml,activity_master和activity_master.xml(land).標識為“ detail_container”的容器視圖僅位于景觀xml中.具有細節容器的l…

android insmod命令,android的啟動腳本(init.rc)文件的語法

android的啟動腳本(init.rc)文件的語法&#xff0c;參考資料&#xff1a;Android 初始化語言(Android Init Language)Android初始化腳本語言包含四種類型的語句&#xff1a;動作(Actions)指令(Commands)服務(Services)選項(Options)該語言的語法包括下列約定&#xff1a;所有類…

android digest 認證,探究 Android 簽名機制和原理

背景最近在調研一個測試工具的使用&#xff0c;在使用中發現被測試工具處理過的apk文件經安裝后打開就會崩潰&#xff0c;分析崩潰日志后原因是簽名不一致導致的。說到Android中的簽名&#xff0c;可能大家都知道簽名的目的就是為了保護apk文件的安全&#xff0c;如果apk被惡意…

html圖片拼接出現留白,關于img標簽周圍留白的問題

在進行頁面的DIV CSS排版時&#xff0c;遇到IE6瀏覽器中的圖片元素img下出現多余空白的問題絕對是常見的&#xff0c;對于該問題的解決方法也是“見機行事”。1、將圖片轉換為塊級對象即&#xff0c;設置img為“display:block;”。在本例中添加一組CSS代碼&#xff1a;“#sub i…

html5中的行高元素,詳解HTML元素的height、offsetHeight、clientHeight、scrollTop等梳理

關于元素的一些屬性在前端的日常開發中&#xff0c;我們經常無可避免的需要獲取或者監聽一些頁面的屬性&#xff0c;那么我們需要經常了解一些屬性代表的含義才能更好地使用這些屬性。特別是一下這些&#xff1a;尺寸相關&#xff1a;offsetHeight、clientHeight、scrollHeight…

pm2 start 帶參數_3款有海景天窗的國產SUV,最適合帶女朋友看星星,首付3萬拿下...

夏天就這么緩緩地來了&#xff0c;在某一個周末的晚上&#xff0c;約上心愛的女朋友&#xff0c;開上車子&#xff0c;一路上馳騁在無人的大橋上&#xff0c;放上音樂&#xff0c;開到目的地&#xff0c;打開天窗&#xff0c;看看星星&#xff0c;從詩詞歌賦談到人生哲學&#…