-
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() 等等