Linux系統(tǒng)下內(nèi)存申請應(yīng)用的方法原理總結(jié)
1. 地址空間的管理
物理地址都是有內(nèi)核管理的, node-->zone-->mem_map-->page, 所有的物理頁面都在mem_map數(shù)組中的頁幀對應(yīng), 然后不同的page有分為DMA,normal,highmem三個zone。
內(nèi)核線性地址空間, 實際上只是低端內(nèi)存才有線性地址,0---896MB部分。
內(nèi)核虛擬地址, 低端內(nèi)存的虛擬地址與線性地址是一樣的。 高端內(nèi)存只有在映射了以后才有虛擬地址
用戶空間地址, tast_struct ---> mmap --> mm_struct ---> vm_area_struct
2.內(nèi)存的申請或使用
物理內(nèi)存的分配, 在內(nèi)核中最終都要調(diào)用__alloc_pages().它是最核心的分配函數(shù),申請大小最大不超過2的MAX_ORDER次冪,在現(xiàn)在好像最大定義為4MB。
線性地址, kmalloc和get_free_pages,線性地址, 對應(yīng)的物理內(nèi)存就是低端內(nèi)存,kmalloc是基于slab的分配技術(shù), 最大不能超過128KB。
虛擬地址, vmalloc申請, 他只是在內(nèi)核中建立類似與用戶空間的vm_area的一個虛擬內(nèi)存空間到vmlist中, 最終的物理內(nèi)存分配還是基于缺頁的。
用戶空間的虛擬內(nèi)存, malloc之類的, 最終在內(nèi)核中都是do_map()和do_brk()。實際上也只是建立了一塊虛擬空間,最終的物理內(nèi)存還是在缺頁異常時分配的。
3. 內(nèi)存的交換問題
在page結(jié)構(gòu)和用戶層的vm_area_struct結(jié)構(gòu)中, 都包含locked和reserved標志。通過合適的途徑設(shè)置這些標志, 可以是頁面鎖存在物理內(nèi)存中, 不被交換出去。
4. 設(shè)備內(nèi)存可以通過ioremap映射到內(nèi)核虛擬地址空間, 也可以通過mmap方法映射到用戶空間。