中。

size参数:

内核是基于页技术分配内存,以最佳的利用系统的RAM。

linux处理内存分配的方法是:创建一系列的内存对象池,每个池的内存大小事固定的,处理分配请求时,就直接在包含足够大的内存块中传递一个整款给请求者。内核只能分配一些预定义的固定大小的字节数组。kmalloc能处理的的最小内存块是32或者64,不大于128KB。

内存区段:

linux内核把内存分为3个区段:可用于DMA的内存,常规内存以及高端内存。kmalloc不能分配高端内存。内存区段在mm/page_alloc.c中实现。区段的初始化在对应的arch树下的mm/init.c中。

后备高速缓存 (lookaside cache)

内核中普通对象进行初始化所需的时间超过了对其进行分配和释放所需的时间,因此不应该将内存释放回一个全局的内存池,而是将内存保持为针对特定目而初始化的状态。例如,如果内存被分配给了一个互斥锁,那么只需在为互斥锁首次分配内存时执行一次互斥锁初始化函数(mutex_init)即可。后续的内存分配不需要执行这个初始化函数,因为从上次释放和调用析构之后,它已经处于所需的状态中了。

linux2.6中USB和SCSI驱动程序使用了这种高速缓存,是为一些反复使用的块增加某些特殊的内存池。后背高速缓存管理也叫slab分配器,相关函数和类型在中申明。

slab分配器实现高速缓存具有kmem_cache_t类型。

kmem_cache_t * kmem_cache_create( const char *name, size_t size, size_t align,

unsigned long flags;

void (*constructor)(void*,kmem_cache_t *, unsigned long),

void (*destructor)(void*, kmem_cache_t *, unsigned long));

用于创建一个新的高速缓存对象。

constructor用于初始化新分配的对象,destructor用于清除对象。

一旦某个对象的高速缓存被创建以后,就可以调用kmem_cache_alloc从中分配内存对象。

void * kmem_cache_alloc(kmem_cache_t *cache,int flags);

释放内存对象使用kmem_cache_free

void kmem_cache_free(kmem_cache_t *cache,const void *obj);

在内存空间都被释放后,模块被卸载前,驱动程序应当释放他的高速缓存。

int kmem_cache_destory(kmem_cache_t *cache);

要检查其返回状态,如果失败,表明莫块中发生了内存泄露。

基于slab的高速缓存scullc

kmem_cache_t *scullc_cache;

scullc_cache=kmem_cache_creat("scullc",scullc_quantum,0,SLAB_HWCACHE_ALIGN,NULL,NULL);

if(!scullc_cache)

{

scullc_cleanup();

return -ENOMEM;

}

if(!dpte->data[s_pos])

{

dptr->data[s_pos]=kmem_cache_alloc(scullc_cache,GFP_KERNEL);

if(!dptr->data[s_pos])

goto nomem;

memset(dptr->data[s_pos],0,scullc_quantum);

}

for(i=0;idata[i])

kmem_cache_free(scullc_cache,dptr->data[i]);

}

if(scullc_cache)

kmem_cache_destory(scullc_cache);

内存池:

内核中有些地方的内存分配是不允许失败的,为确保能分配成功,内核建立一种称为内存池的抽象,他试图始终保持空闲状态,以便紧急情况使用。

mempool_t * mempool_creat(int min_nr,

mempool_alloc_t *alloc_fn, //对象分分配 mempool_alloc_slab

mempool_free_t *free_fn, //释放 mempool_free_slab

void *pool_data);

可以用如下代码来构造内存池

cache=kmem_cache_creat(...); //创建一个高速缓存

pool=mempool_creat(MY_POOL_MINIMUM,mempool_alloc_slab,mempool_free_slab,cache);//建立内存池对象

void *mempool_alloc(mempool_t *poll,int gfp_mask);//分配对象

void *mempool_free(void *element,mempool_t *poll);//释放对象

void mempool_destroy(mempool_t *poll);//销毁内存池

注意:mempool会分配一些内存块,空闲且不会被用到,造成内存的大量浪费。所以一般情况不要用内存池。

linux内存分配 连续 足够,linux内存池能分配连续物理内存吗相关推荐

  1. windows进程管理器_面向Windows,Linux,Mac ,安卓, 木马,密码破解内存提取基于KPCR结构的技术研究...

    Windows内存分析原理 内存镜像存储的是二进制数据,内存取证分析的任务就是从这些貌似毫无意义的二进制数据中找到系统的运行信息.这些二进制数据从根本上说,其来源都是操作系统的内存分配.为何分配.如何 ...

  2. 内存优化 · 基础论 · 初识 Android 内存优化

    [小木箱成长营]内存优化系列文章: 内存优化 · 工具论 · 常见的 Android 内存优化工具和框架 内存优化 · 方法论 · 揭开内存优化神秘面纱 内存优化 · 实战论 · 内存优化实践与应用 ...

  3. (转)linux内存管理之伙伴系统(内存分配)

     一.Linux伙伴系统分配器 伙伴系统分配器大体上分为两类.__get_free_pages()类函数返回分配的第一个页面的线性地址:alloc_pages()类函数返回页面描述符地址.不管以哪种函 ...

  4. linux ion 分配地址,Android ION内存分配

    ION设计的目标 为了避免内存碎片化,或者为一些有着特殊内存需求的硬件,比如GPUs.display controller以及camera等,在系统启动的时候,会为他们预留一些memory pools ...

  5. linux map内存在哪里分配,brk  mmap  madvise 内存分配以及共享内存

    mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进程空间), ...

  6. linux系统堆、栈及内存分配、CPU寄存器

    堆和栈: 栈主要用来存放局部变量, 传递参数, 存放函数的返回地址.esp 始终指向栈顶, 栈中的数据越多, esp的值越小. 堆用于存放动态分配的对象, 当你使用 malloc , new 等进行分 ...

  7. linux内核中分配4M以上大内存的方法

    在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数,     "if (unlikely(order >= ...

  8. linux 内存占用_分享Linux内存占用几个案例

    案例一 问题 最近一台 CentOS 服务器,发现内存无端损失了许多,free 和 ps 统计的结果相差十几个G,非常奇怪,后来Google了许久才搞明白. 分析 1.linux系统内存消耗主要有三个 ...

  9. Java 内存 关系_JVM和Linux之间的详细内存关系

    JVM和Linux之间的详细内存关系 在一些具有8g物理内存的服务器上,主要运行Java服务.系统内存分配如下:Java服务的JVM堆大小设置为6g,监视过程大约需要600m,Linux本身使用大约8 ...

最新文章

  1. 基于 OpenCV 的人脸识别
  2. 常见的面向对象的面试题(附答案)
  3. 面试必问:CPU 占用高,如何一击即中!
  4. sam格式的结构和意义_SAM格式的学习
  5. HDU - 2457 DNA repair(AC自动机+dp)
  6. NotificationManagerService使用详解与原理分析(一)
  7. java内部格式_详解java内部类的访问格式和规则
  8. 如何制定客户留存策略_商客通:办理石家庄400电话如何留存客户
  9. Scala学习第一篇
  10. android activity从新打开,【Android开发-8】生命周期,Activity中打开另一个Activity
  11. 思考…求知(double和Double的区别)
  12. Linux内核 eBPF基础:Tracepoint原理源码分析
  13. Refactoring之——代码的坏味道(一)过长方法
  14. Android 中文字体的设置方法和使用技巧
  15. PTA(BasicLevel)-1009 说反话
  16. 微信小程序记账报表小程序
  17. 关于NI CompactRIO自定义模块中FPGA与Labview FPGA中编程的一点理解
  18. 首次参加齐鲁软件设计大赛经验(及总结出的划水要点)
  19. 电脑 桌面图标上多了一个白色的文档图标 怎么去掉?
  20. 神马笔记 版本1.8.0——删除笔记/文件夹·技术细节篇

热门文章

  1. 显卡不够时,如何训练大型网络
  2. python:Json模块dumps、loads、dump、load介绍
  3. GPU版TensorFlow怎么指定让CPU运行
  4. LeetCode简单题之图片平滑器
  5. 服务化部署框架Paddle Serving
  6. TorchScript神经网络集成技术
  7. 深度学习模型训练过程
  8. 2021年大数据Kafka(十一):❤️Kafka的消费者负载均衡机制和数据积压问题❤️
  9. 2021年大数据基础(五):​​​​​​​​​​​​​​​​​​​​​分布式技术
  10. Java基础Switch和循环控制