原创 頁面鎖

lock_page 可以佔用這個頁面,這樣其他進程要使用這個頁時只能在睡眠中等待 static inline void lock_page(struct page *page) { #這裏提示在使用lock_page這個函數時會等待

原创 handle_mm_fault執行流程

__handle_mm_fault() handle_pte_fault()

原创 線程被IO卡住的原因之一

在內存trace中經常遇到線程uninterruptable sleep,而打出來的trace可以看到是如下: wait_on_page_bit_killable+0xb0/0xcc __lock_page_or_retry+0xb8/0

原创 do_swap_page函數

前面已經講過,當pte所對應的page不在內存中,且pte對應的內容不爲0時,表示此時pte的內容所對應的頁面在swap空間中,缺頁異常時會通過do_swap_page()函數來分配頁面: static int do_swap_page

原创 kernel-4.4 slab(三)

前面已經講了slab描述符的初始化以及slab對象的創建,下面是slab對象的回收: slab對象的回收通過kmem_cache_free來完成: void kmem_cache_free(struct kmem_cache *cach

原创 list_entry通俗理解方法

大家都知道list_entry時kernel裏面經常遇到的一個函數,其定義爲: #define list_entry(ptr, type, member) \ container_of(ptr, type, member) #def

原创 vmalloc

前面說到kmalloc時基於slab分配器來實現的,其分配的物理內存時連續的,但是kmalloc一次分配的內存不能太大,現在說vmalloc,vmalloc分配的虛擬內存時連續的,其分配的區間爲內存初始化時分配的從VMALLOC_STAR

原创 ARM32 進程的virtual memory佈局圖

ps:上圖最右邊的start_code, end_code, start_data, end_data……表示進程描述符中mm_struct結構體對應成員所代表的意思。

原创 kernel-4.4 slab(二)

slab對象的分配: slab對象的分配使用kmem_cache_alloc(): void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags) { void *ret

原创 進程地址空間VMA以及malloc

進程空間的VMA結構體中由兩個成員,紅黑樹以及鏈表,表示其組織方式由兩種: 紅黑樹:   鏈表類型: 有了上面的圖例,下面簡單講一下malloc的分配原理: 首先malloc是通過系統調用brk來完成內存分配的: SYSCALL_D

原创 幾個內存分配API的區別

內存分配的API有:alloc_pages, kmalloc, slab分配,vmalloc, malloc,下面簡單說明一下以上幾個函數的差別: alloc_pages:主要用來從buddy系統中分配內存,以頁爲單位分配區域需要通過gf

原创 ARM64頁表映射過程

參考wowotech關於此topic的講解: http://www.wowotech.net/memory_management/mem_init_3.html 內存初始化代碼分析(三):創建系統內存地址映射 作者:linuxer 發佈於

原创 Linux memory的初始化(二)

今天接着講memory的初始化函數arm_memblock_init,在上面完成了memory size的初始化,將整個memory添加以memory type的方式添加到了memory block中,下面是memory reserve部

原创 內存映射圖

我理解的ARM64虛擬地址到物理地址的映射關係: 其中在PTE table addr+PTE欄中不僅包含pfn,還包含page的一些屬性