10.9、驅動開發 -- 內存

在這裏插入圖片描述

  • MMU內存管理單元
    memory manage unit內存 管理 單元內核/用戶看到的都是虛擬地址, 物理RAM使用的是 物理地址.

  • 內核中空間分配:
    1、usr
    void *malloc(int size)
    當系統無法滿足你的請求大小的時候, 進程會在 malloc內部睡眠.當資源滿足的時候,進程被喚醒.
    2、kernel

void *kmalloc(size_t size,gfp_t flags)
	flags:
		GFP_KERNEL: 告訴內核,當前環境可以睡眠, 如果你申請的空間系統暫時不能滿足, kmalloc函數 會睡眠等待. 當資源滿足,則被喚醒.
		GFP_ATOMIC:告訴內核,當前環境是不能睡眠. 如果你申請的空間系統暫時不能滿足kmalloc 會返回 NULL,表示失敗.
	
	kmalloc注意:
		1.kmalloc 只能申請 32B-128KB的空間
		2.kmalloc給你的空間,可能大於你需要的
		3.kmalloc申請的空間 物理地址是連續的.   
	    
void kfree(void *args);  
    
void *vmalloc(int size);
如果你申請的空間系統暫時不能滿足,vmalloc函數 會睡眠等待. 當資源滿足,則被喚醒.      

void vfee(void *args);

kmalloc 32B-128KB 物理上是連續的 訪問效率高 90%
vmalloc 1M-2M… 物理上不一定連續 訪問效率低 10%

devm_kzalloc是具有資源管理的 kzalloc() ,使用資源管理(resource-managed)函數分配的內存,是會與所屬設備相關聯。當設備從系統中分離或者設備驅動被卸載,該內存會被自動釋放,也可以通過 devm_kfree() 來釋放內存。同理 socket_kzalloc() 等等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章