首先呢作为车载bsp开发人员,写大量的内核代码是不现实的事情,多数都是修修改改,但是要有内核代码阅读浏览理解的能力,毕竟linux kernel 还是很nb 的,所有技术人员深入研究内核代码是必须的,也毛病,而且越是资深的大佬对这方便越牛。

kernel 中内存分配的常用几种方式:

1、kmalloc: (分配连续的物理空间,最大为128K)

通用 cache

  void *kmalloc(size_t size, gfp_t flags)

  kmalloc 基于以下几种size的mem cache:32, 64, 128, 256, 512, 1,024, 2,048, 4,096,8,192, 16,384, 32,768, 65,536 和 131,072 bytes。其本质也是调用kmem_cache_alloc来分配object。所以kmalloc一次最大可分配的size为128KB。kmalloc分配速度很快,在分配时需注意gfp flag

参数:在不interrupt上下文(ISR, softirq, tasklet)及不可睡眠上下文使用GFP_ATOMIC。

     内核还增加了内存清零的分配函数:kzalloc。

专用 cache

  kmem_cache_create()

  void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)如果你需要频繁的分配和释放某个结构,建议不要采用kmalloc,而是自己在slab系统中创建memory cache。

  指定该结构的object size。分配时使用kmem_cache_alloc。同样的slab object大小也有限制,一般情况下一个MAX_OBJ_ORDER是5,也就是32个页,128KB。

2、vmalloc (非连续内存分配,可以申请的较大的连续的内存空间) 

void *vmalloc(unsigned long size)超过128KB的内存显然不能使用slab分配,并且当申请的连续内存大小不能在buddy系统中得到满足,那么就需要使用vmalloc。vmalloc为了把物理的非连续页一个个映射,从而导致比直接内存映射大的多的后援缓冲区抖动。除非需要特别大的内存,否则尽量不要使用vmalloc。

3、基于DMA 分配

  void * dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp)

  在某些arch中,可以使用dma_alloc_coherent来分配DMA专用内存。列入在arch/arm/mm/consistent.c中,该函数先分配最小可满足size的2^order内存,然后释放2^order-size多余的页给buddy。而arch/i386/kernel/pci-dma.c中,则直接分配2^order块内存。

4、__get_free_pages(分配大空间的连续物理内存,4MB)

页分配

  unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)直接从buddy系统中获得原始页。最原始的分配方式。

  slab分配器

【kernel 中内存分配那点事】相关推荐

  1. C++中内存分配、函数调用和返回值问题

    在谈述函数调用和返回值问题之前,先来看看C++中内存分配的问题. C++编译器将计算机内存分为代码区和数据区,很显然,代码区就是存放程序代码,而数据区则是存放程序编译和执行过程出现的变量和常量.数据区 ...

  2. 浅谈C++中内存分配、函数调用和返回值问题

    在谈述函数调用和返回值问题之前,先来看看C++中内存分配的问题. C++编译器将计算机内存分为代码区和数据区,很显然,代码区就是存放程序代码,而数据区则是存放程序编译和执行过程出现的变量和常量.数据区 ...

  3. C++中内存分配方式、空指针及野指针的区别

    一.C++中内存分配方式可以分为三种: (1)从静态存储区域分配: 内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在.速度快.不容易出错,因为有系统会善后.例如全局变量,static变 ...

  4. Linux内核中内存分配函数

    1.原理说明 Linux内核 中采 用了一种同时适用于32位和64位系统的内 存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表,如图2-1所示.四级页表分别为 ...

  5. Linux创建线程时 内存分配的那些事

    文章目录 问题描述 问题分析 针对问题1 的猜测: 针对问题2 的猜测: 原理追踪 总结 问题描述 事情开始于一段内存问题,通过gperf工具抓取进程运行过程中的内存占用情况. 分析结果时发现一个有趣 ...

  6. JAVA对象在JVM中内存分配

    如果你还不了解JVM内存模型的建议您先看下JVM内存模型 以一下代码为例,来分析下,java对象在内存中的空间分配. public class Student {private String name ...

  7. linux malloc命令,减少 curl 中内存分配操作(malloc)

    今天我在 libcurl 内部又做了一个小改动,使其做更少的 malloc.这一次,泛型链表函数被转换成更少的 malloc (这才是链表函数应有的方式,真的). 研究 malloc 几周前我开始研究 ...

  8. java 内存 静态_java中内存分配以及static的用法(转)

    JAVA能够实现跨平台的一个根本原因,是定义了class文件的格式标准,凡是实现该标准的JVM都能够加载并解释该class文件,据此也可以知道,为啥Java语言的执行速度比C/C++语言执行的速度要慢 ...

  9. Pytorch:数据并行和模型并行,解决训练过程中内存分配不均衡的问题

    文章目录 数据并行 单机多卡训练,即并行训练.并行训练又分为数据并行 (Data Parallelism) 和模型并行两种. 数据并行指的是,多张 GPU 使用相同的模型副本,但是使用不同的数据批进行 ...

最新文章

  1. 数据治理的理论实践与发展趋势
  2. Algorithm:C++语言实现之内排序、外排序相关算法(插入排序 、锦标赛排序、归并排序)
  3. 苹果备忘录怎么调字体大小_苹果手机备忘录误删了怎么恢复?分享几个新技能...
  4. MemCached缓存知识知多少?
  5. ES6常用知识总结(20%的知识占80%的份额)
  6. 个人计算机与手机的区别,手机与电脑的CPU是一回事吗?一共有六大区别,看看你知道多少!...
  7. LeetCode 2023. 连接后等于目标字符串的字符串对
  8. 对于python的感受_聊聊我对python的感受
  9. 74ls161中rco是什么_什么是催化燃烧?如何选择催化燃烧设备?RCO和RTO有什么关系?...
  10. RNN LSTM GRU Attention transformer公式整理总结(超详细图文公式)
  11. 万圣节html代码大全,《方舟:生存进化》万圣节更新代码大全
  12. CS229 笔记-1
  13. 小程序 - 修改头像功能
  14. 高通msm8953平台射频调试
  15. 常规操作系统Windows系统淋雨系统Unix系统netware等系统介绍分析
  16. 几种常用内存管理底层介绍
  17. html 卡片布局 怎么,卡片式格局(CardLayout)
  18. SEO优化,外链重要还是友情链接重要?
  19. cogs 997. [東方S2] 射命丸文
  20. 【python数据分析模块教程】2——pandas基础简介以及运用

热门文章

  1. Redis Streams 介绍
  2. 初学Java Web(6)——JSP学习总结
  3. Java NIO 入门
  4. 从零开始学习jQuery (二) 万能的选择器
  5. cover letter 和response letter的写法
  6. 斯坦福大学深度学习与自然语言处理第三讲:高级的词向量表示
  7. 深度学习(十六)基于2-channel network的图片相似度判别-CVPR 2015
  8. C语言面试基础知识整理
  9. 【算法编程】斐波那契数列
  10. BPM助力先声药业优化流程管理