嵌入式八股之内核篇1





2️⃣ 内核里怎么申请内存?三大函数!
kmalloc() – 物理连续小能手
✅ 申请物理地址连续的内存 (对DMA设备超重要!)
✅ 虚拟地址也连续。
⚠️ 大小有限制:最大128KB (实际可用约112KB)。
常用flags:
GFP_ATOMIC:原子操作!中断上下文救命稻草!
GFP_KERNEL:常规操作,可睡眠。
GFP_DMA:专供DMA控制器。
️ 释放用kfree()。
kzalloc() – 洁癖版kmalloc
✅ 本质是kmalloc + __GFP_ZERO标志。
✅ 申请物理连续内存,并自动清零内容!防脏数据神器!
️ 释放也用kfree()。
vmalloc() – 虚拟连续大仓库
✅ 申请虚拟地址连续的内存。
❌ 物理地址不一定连续。
✅ 大小无硬性限制,大型模块加载救星!
⚠️ 会睡眠!中断上下文禁用!
️ 释放用vfree()。
3️⃣ 内核申请内存 vs 应用程序申请内存?大不同!
内核层: (kmalloc, kzalloc, vmalloc)
kmalloc/kzalloc:直接拿到物理+虚拟都连续的内存块!
vmalloc:拿到虚拟连续的内存,物理内存也立刻分配了(但分散),只是页表映射稍后同步。
应用层: (malloc)
拿到虚拟地址连续的内存块。
❌ 分配时不给实际物理页!
✅ 访问时触发缺页中断 (do_page_fault),才分配物理页并映射。
一句话总结差异:
内核kmalloc:一步到位拿物理块(小快递)。
内核vmalloc:虚拟仓库立刻备货(大仓库️)。
应用malloc:先开地址空头支票,用的时候才提货 (等缺页中断)。