Linux驱动开发-----内存存取

本文介绍了Linux环境下用户空间和内核空间的内存管理方法,包括malloc()、free()、kmalloc()、vmalloc()等函数的应用,并详细阐述了slab分配器的工作原理及内存池技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在用户空间动态申请内存的函数为malloc(),释放函数为free()

   对Linux内核而言,C库的malloc()函数通过brk()和mmap()两个系统调用来实现

2.内核空间内存动态申请---以页为单位

(1).kmalloc()和__get_free_pages()申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系。

(2).vmalloc()在虚拟内存空间给出一块连续的内存区,实质上,这片连续的虚拟内存在物理内存中并不一定连续,而vmalloc()申请的虚拟内存和物理内存之间也没有简单的换算关系。

3.slab

一方面--完全使用页为单元申请和释放内存容易导致内存浪费。

另一方面---在操作系统的运作过程中,经常涉及大量对象的重复生成,使用和释放内存问题。如果我们能够用合适的方法使得在对象前后两次被使用时分配在同一块内存或同一类内存空间且保留了基本的数据结构,就可以大大提高效率。

slab使用范例: 

/* 创建slab缓存 */
static kmem_cache_t *xxx_cachep;
xxx_cachep = kmem_cache_create("xxx", sizeof(struct xxx), 0, SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL, NULL);

/* 分配slab缓存 */
struct xxx *ctx;
ctx = kmem_cache_alloc(xxx_cachep, GFP_KERNEL);
.../* 使用slab缓存 */
/* 释放slab缓存 */
kmem_cache_free(xxx_cachep, ctx);
/* 回收slab缓存 */
kmem_cache_destory(xxx_cachep);

4.内存池---用于分配大量小对象的后备缓存技术


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值