Linux驱动开发-----内存存取
2013-06-16 23:27
246 查看
1.在用户空间动态申请内存的函数为malloc(),释放函数为free()
对Linux内核而言,C库的malloc()函数通过brk()和mmap()两个系统调用来实现
2.内核空间内存动态申请---以页为单位
(1).kmalloc()和__get_free_pages()申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系。
(2).vmalloc()在虚拟内存空间给出一块连续的内存区,实质上,这片连续的虚拟内存在物理内存中并不一定连续,而vmalloc()申请的虚拟内存和物理内存之间也没有简单的换算关系。
3.slab
一方面--完全使用页为单元申请和释放内存容易导致内存浪费。
另一方面---在操作系统的运作过程中,经常涉及大量对象的重复生成,使用和释放内存问题。如果我们能够用合适的方法使得在对象前后两次被使用时分配在同一块内存或同一类内存空间且保留了基本的数据结构,就可以大大提高效率。
slab使用范例:
4.内存池---用于分配大量小对象的后备缓存技术
对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.内存池---用于分配大量小对象的后备缓存技术
相关文章推荐
- Linux 字符设备驱动开发--内存读写操作
- Linux 驱动开发中常用的内存分配方法浅析
- Linux驱动开发常用调试工具---之内存读写工具devmem和devkmem
- Linux驱动开发常用调试工具---之内存读写工具devmem和devkmem
- Linux-2.6驱动开发 6 内存映射,DMA
- Linux驱动开发常用内存调试工具 memtool and devmem
- Linux驱动开发常用调试工具---之内存读写工具devmem
- Linux驱动开发常用调试工具---之内存读写工具devmem和devkmem
- Linux驱动开发----块设备驱动(内存模拟)Tiny6410
- linux驱动开发--I/O内存的访问流程
- Linux驱动开发(六)——内存使用
- linux驱动开发--内核空间中内存的申请与释放
- Linux-2.6驱动开发 4 内存分配
- 嵌入式Linux之我行——S3C2440上 ADC驱动实例开发讲解 .
- linux驱动开发 主设备号与次设备号
- Linux 网络设备驱动开发(二) —— Linux 网络栈剖析
- 嵌入式Linux驱动开发实战视频教程
- linux驱动开发 主设备号与次设备号
- 【Linux开发】linux设备驱动归纳总结(五):1.在内核空间分配内存
- FS_S5PC100平台上Linux Camera驱动开发详解(二)