【kernel 中内存分配那点事】
首先呢作为车载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 中内存分配那点事】相关推荐
- C++中内存分配、函数调用和返回值问题
在谈述函数调用和返回值问题之前,先来看看C++中内存分配的问题. C++编译器将计算机内存分为代码区和数据区,很显然,代码区就是存放程序代码,而数据区则是存放程序编译和执行过程出现的变量和常量.数据区 ...
- 浅谈C++中内存分配、函数调用和返回值问题
在谈述函数调用和返回值问题之前,先来看看C++中内存分配的问题. C++编译器将计算机内存分为代码区和数据区,很显然,代码区就是存放程序代码,而数据区则是存放程序编译和执行过程出现的变量和常量.数据区 ...
- C++中内存分配方式、空指针及野指针的区别
一.C++中内存分配方式可以分为三种: (1)从静态存储区域分配: 内存在程序编译时就已经分配好,这块内存在程序的整个运行期间都存在.速度快.不容易出错,因为有系统会善后.例如全局变量,static变 ...
- Linux内核中内存分配函数
1.原理说明 Linux内核 中采 用了一种同时适用于32位和64位系统的内 存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表,如图2-1所示.四级页表分别为 ...
- Linux创建线程时 内存分配的那些事
文章目录 问题描述 问题分析 针对问题1 的猜测: 针对问题2 的猜测: 原理追踪 总结 问题描述 事情开始于一段内存问题,通过gperf工具抓取进程运行过程中的内存占用情况. 分析结果时发现一个有趣 ...
- JAVA对象在JVM中内存分配
如果你还不了解JVM内存模型的建议您先看下JVM内存模型 以一下代码为例,来分析下,java对象在内存中的空间分配. public class Student {private String name ...
- linux malloc命令,减少 curl 中内存分配操作(malloc)
今天我在 libcurl 内部又做了一个小改动,使其做更少的 malloc.这一次,泛型链表函数被转换成更少的 malloc (这才是链表函数应有的方式,真的). 研究 malloc 几周前我开始研究 ...
- java 内存 静态_java中内存分配以及static的用法(转)
JAVA能够实现跨平台的一个根本原因,是定义了class文件的格式标准,凡是实现该标准的JVM都能够加载并解释该class文件,据此也可以知道,为啥Java语言的执行速度比C/C++语言执行的速度要慢 ...
- Pytorch:数据并行和模型并行,解决训练过程中内存分配不均衡的问题
文章目录 数据并行 单机多卡训练,即并行训练.并行训练又分为数据并行 (Data Parallelism) 和模型并行两种. 数据并行指的是,多张 GPU 使用相同的模型副本,但是使用不同的数据批进行 ...
最新文章
- 数据治理的理论实践与发展趋势
- Algorithm:C++语言实现之内排序、外排序相关算法(插入排序 、锦标赛排序、归并排序)
- 苹果备忘录怎么调字体大小_苹果手机备忘录误删了怎么恢复?分享几个新技能...
- MemCached缓存知识知多少?
- ES6常用知识总结(20%的知识占80%的份额)
- 个人计算机与手机的区别,手机与电脑的CPU是一回事吗?一共有六大区别,看看你知道多少!...
- LeetCode 2023. 连接后等于目标字符串的字符串对
- 对于python的感受_聊聊我对python的感受
- 74ls161中rco是什么_什么是催化燃烧?如何选择催化燃烧设备?RCO和RTO有什么关系?...
- RNN LSTM GRU Attention transformer公式整理总结(超详细图文公式)
- 万圣节html代码大全,《方舟:生存进化》万圣节更新代码大全
- CS229 笔记-1
- 小程序 - 修改头像功能
- 高通msm8953平台射频调试
- 常规操作系统Windows系统淋雨系统Unix系统netware等系统介绍分析
- 几种常用内存管理底层介绍
- html 卡片布局 怎么,卡片式格局(CardLayout)
- SEO优化,外链重要还是友情链接重要?
- cogs 997. [東方S2] 射命丸文
- 【python数据分析模块教程】2——pandas基础简介以及运用