新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux系統(tǒng)下內(nèi)存申請(qǐng)應(yīng)用的方法原理總結(jié)

Linux系統(tǒng)下內(nèi)存申請(qǐng)應(yīng)用的方法原理總結(jié)

作者: 時(shí)間:2016-10-08 來(lái)源:網(wǎng)絡(luò) 收藏

1. 地址空間的管理

本文引用地址:http://2s4d.com/article/201610/305763.htm

物理地址都是有內(nèi)核管理的, node-->zone-->mem_map-->page, 所有的物理頁(yè)面都在mem_map數(shù)組中的頁(yè)幀對(duì)應(yīng), 然后不同的page有分為DMA,normal,highmem三個(gè)zone。

內(nèi)核線性地址空間, 實(shí)際上只是低端內(nèi)存才有線性地址,0---896MB部分。

內(nèi)核虛擬地址, 低端內(nèi)存的虛擬地址與線性地址是一樣的。 高端內(nèi)存只有在映射了以后才有虛擬地址

用戶空間地址, tast_struct ---> mmap --> mm_struct ---> vm_area_struct

2.內(nèi)存的申請(qǐng)或使用

物理內(nèi)存的分配, 在內(nèi)核中最終都要調(diào)用__alloc_pages().它是最核心的分配函數(shù),申請(qǐng)大小最大不超過2的MAX_ORDER次冪,在現(xiàn)在好像最大定義為4MB。

線性地址, kmalloc和get_free_pages,線性地址, 對(duì)應(yīng)的物理內(nèi)存就是低端內(nèi)存,kmalloc是基于slab的分配技術(shù), 最大不能超過128KB。

虛擬地址, vmalloc申請(qǐng), 他只是在內(nèi)核中建立類似與用戶空間的vm_area的一個(gè)虛擬內(nèi)存空間到vmlist中, 最終的物理內(nèi)存分配還是基于缺頁(yè)的。

用戶空間的虛擬內(nèi)存, malloc之類的, 最終在內(nèi)核中都是do_map()和do_brk()。實(shí)際上也只是建立了一塊虛擬空間,最終的物理內(nèi)存還是在缺頁(yè)異常時(shí)分配的。

3. 內(nèi)存的交換問題

在page結(jié)構(gòu)和用戶層的vm_area_struct結(jié)構(gòu)中, 都包含locked和reserved標(biāo)志。通過合適的途徑設(shè)置這些標(biāo)志, 可以是頁(yè)面鎖存在物理內(nèi)存中, 不被交換出去。

4. 設(shè)備內(nèi)存可以通過ioremap映射到內(nèi)核虛擬地址空間, 也可以通過mmap方法映射到用戶空間。



關(guān)鍵詞:

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉