linux 内存管理 --- kmalloc 和 vmalloc
kmalloc
kmalloc会根据申请的内存大小来决定来决定使用块分配器(slab/slub/slob)或页分配器(buddy)进行物理内存分配,只能分配几个固定大小的内存,申请值不在这些固定值之内时,会按向上对齐的原则,分配最接近申请值的内存块。
static __always_inline void *kmalloc(size_t size, gfp_t flags)
flags 可以指定从哪个物理内存区域申请内存,不指定就是低端内存,也可以指定高端内存等
kmalloc最大可分配内存大小:等于伙伴系统最大能申请的单块最大内存,即2^10页
kmalloc申请的物理地址是连续的
kmalloc如果申请高端物理内存,使用的虚拟地址是 PKMAP_BASE ~ PAGE_OFFSET-1 (永久内核映射区),所以最多能申请的高端物理内存大小受永久内核映射区大小限制
疑问:申请高端物理内存,在哪里实现物理地址和虚拟地址的映射
vmalloc
vmalloc申请的物理地址不一定是连续的,所以可以申请非常大的物理内存
vmalloc通过伙伴系统进行物理内存分配
使用的虚拟地址是 VMALLOC_START VMALLOC_END-1
标签:
linux 内核
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
2018-07-19 摇臂开关
2016-07-19 Altium Designer 15 设置阻焊桥