Linux系統下記憶體申請應用的方法原理總結

2021-05-13 05:36:29 字數 863 閱讀 2019

1. 位址空間的管理

實體地址都是有核心管理的, node-->zone-->mem_map-->page, 所有的物理頁面都在mem_map陣列中的頁幀對應, 然後不同的page有分為dma,normal,highmem三個zone。

核心線性位址空間, 實際上只是低端記憶體才有線性位址,0---896mb部分。

核心虛擬位址, 低端記憶體的虛擬位址與線性位址是一樣的。 高階記憶體只有在映**以後才有虛擬位址

使用者空間位址, tast_struct ---> mmap --> mm_struct ---> vm_area_struct

2.記憶體的申請或使用

物理記憶體的分配, 在核心中最終都要呼叫__alloc_pages().它是最核心的分配函式,申請大小最大不超過2的max_order次冪,在現在好像最大定義為4mb。

線性位址, kmalloc和get_free_pages,線性位址, 對應的物理記憶體就是低端記憶體,kmalloc是基於slab的分配技術, 最大不能超過128kb。

虛擬位址, vmalloc申請, 他只是在核心中建立類似與使用者空間的vm_area的乙個虛擬記憶體空間到vmlist中, 最終的物理記憶體分配還是基於缺頁的。

使用者空間的虛擬記憶體, malloc之類的, 最終在核心中都是do_map()和do_brk()。實際上也只是建立了一塊虛擬空間,最終的物理記憶體還是在缺頁異常時分配的。

3. 記憶體的交換問題

在page結構和使用者層的vm_area_struct結構中, 都包含locked和reserved標誌。通過合適的途徑設定這些標誌, 可以是頁面鎖存在物理記憶體中, 不被交換出去。

4. 裝置記憶體可以通過ioremap對映到核心虛擬位址空間, 也可以通過mmap方法對映到使用者空間。

Linux核心下記憶體空間的申請

2020 05 23 關鍵字 kmalloc kzalloc kcalloc kmalloc 是linux核心開發中最常使用的申請記憶體的函式。它的原型如下所示 include void kmalloc size t size,int flags 函式的返回值通常就指向所申請到的記憶體空間的起始位址...

關於linux 申請大記憶體

最近需要在linux系統上申請大記憶體,使用的伺服器是64位32g記憶體,但是在申請大記憶體空間時出錯,程式總是半途中斷,目測是在申請記憶體時遇到了問題。故從網上蒐集了相關的資料貼在這裡 每個程序會有4g的虛擬位址空間,malloc得到的的位址都是虛擬位址,並且當malloc的時候,作業系統並不會將...

linux下獲取系統記憶體資訊

之前在一家公司做linux嵌入式,有乙個需求就是獲取當前裝置的總記憶體大小以及剩餘記憶體大小。我們知道我們可以從 proc meminfo檔案中檢視這兩個資訊大小,執行如下命令 上面記憶體的資訊量很多,我們並不需要這麼多資訊,我們要的也就其中的一行,為此我們可以再進行一些過濾,再使用下grep命令,...