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


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.内存池---用于分配大量小对象的后备缓存技术

相关内容