linux kmalloc 函数
作用:内核分配连续物理内存的接口函数,在虚拟地址空间上也是连续的。
与vmalloc的比较:
相同点:都是用于内核空间内存分配,对应的虚拟地址空间连续,且按字节为单位。
异同点:kmalloc分配的物理内存是连续的,vmalloc分配的物理内存可以不连续,但是虚拟地址空间连续。kmalloc分配的物理内存受限于页面最高阶数及页面大小,vmalloc则只受限于系统内存大小。kmalloc既支持大块内存分配也支持小块内存分配,大块内存使用页面分配器,小内存使用slab分配器,而vmalloc用于大块内存分配器,并且最好分配内存大小是整页级的,否则会导致内存空间浪费。
一次分配的最大内存数量,不能超过系统页面最高阶数,比如页面最高阶数MAX_ORDER为11,那么最大的分配内存数量为 2^10 * 4K = 4M,在__alloc_pages里限制。调用栈如下:
kmalloc|-> kmalloc_large # 分配内存大于一个页面| |-> kmalloc_order_trace| |-> kmalloc_order| |-> alloc_pages # 调用物理页面分配器分配内存| |-> alloc_pages_node| |-> __alloc_pages_node| |-> __alloc_pages # 检查分配页面阶数是否大于等于最高阶| |||-> __kmalloc # 分配内存小于一个页面,通过slab分配器分配内存|-> __do_kmalloc|-> kmalloc_slab| |-> kmalloc_caches |-> slab_alloc|-> slab_pre_alloc_hook|-> kfence_alloc|-> cache_alloc_debugcheck_before|-> __do_cache_alloc|-> cache_alloc_debugcheck_after|-> prefetchw|-> slab_want_init_on_alloc|-> slab_post_alloc_hook
测试代码kmalloc_test.c
// kmalloc_test.c#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>static int *p = NULL;static int __init kmalloc_test_init(void)
{p = kmalloc(4 * 1024 * 1024, GFP_KERNEL); printk(KERN_INFO "address: %p\n", p);return 0;
}static void __exit kmalloc_test_exit(void)
{printk("exit\n");if (p != NULL)kfree(p);
}module_init(kmalloc_test_init);
module_exit(kmalloc_test_exit);
MODULE_LICENSE("GPL");
Makefile如下:
obj-m+=kmalloc_test.o
CONFIG_MODULE_SIG=n
all:make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean
测试结果如下图所示,插入内核模块分配一块4M(阶数为10)大小的物理内存块,对应的阶数为10,阶数为10的内存块从548减少为547,删除内核模块回收内存块,阶数为10的内存块数量增加一,变为548。
kmalloc提供的分配内存接口:
// 头文件 <linux/slab.h>kmalloc:分配连续物理内存空间,内存地址上的内容随机。
kzalloc:分配连续物理内存,并将所分配内存空间设置为0。
kmalloc_node:指定的numa节点上分配连续物理内存空间。
kzalloc_node:指定的numa节点上分配连续的物理内存空间,并设置为0。上述分配接口对应的释放内存接口:kfreekvmalloc:根据分配内存大小调用kmalloc,或vmalloc,防止内存分配失败。
kvzalloc:根据分配内存大小调用kmalloc或vmalloc分配物理内存。
kvmalloc_node:指定的numa节点上根据分配内存大小调用kmalloc或vmalloc分配物理内存,防止内存分配失败。
kvmalloc_array:同kvzalloc,一次性分配多个,并返回数组。
kvcalloc:同kvmalloc_array,并将分配的内存空间设置为0.对应的释放内存接口:kvfree
linux kmalloc 函数相关推荐
- linux内核函数kmalloc,LINUX内核内存管理kmalloc,vmalloc
在设备驱动程序或者内核模块中动态开辟内存,不是用malloc,而是kmalloc ,vmalloc,释放内存用的是kfree,vfree,kmalloc函数返回的是虚拟地址(线性地址). kmallo ...
- 内核中的kmalloc函数详解
一.kmalloc函数详解 #include <linux/slab.h> void *kmalloc(size_t size, int flags); 给 kmalloc 的第一个参数是 ...
- linux内核函数出错的返回值
linux内核函数出错的返回值 1. 函数返回指针 2. 如何通过错误信息指针来返回错误信息 3. 出错代码返回指针在(-1000,0)区间 4. 错误的判断和错误原因的打印 4.1 错误的判断 4. ...
- Linux系统函数之IO函数
技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.标准C库IO函数工作流程 IO缓冲区的作用? 大部分硬盘都是机械硬盘,读取寻道时间 ...
- linux计时函数的使用
linux计时函数的使用 linux下计时函数的使用目的是测量程序运行的时间 头文件 #include <sys/time.h> 计时函数 int gettimeofday(struct ...
- linux C函数之strdup函数分析【转】
本文转载自:http://blog.csdn.net/tigerjibo/article/details/12784823 linux C函数之strdup函数分析 一.函数分析 1.函数原型: [c ...
- Linux getopt()函数 getopt_long()函数---转
http://hi.baidu.com/scoundrelgg/item/d4083f8412eea05d26ebd97f Linux getopt()函数 getopt_long()函数 get_o ...
- linux shell函数
linux shell函数
- linux fork函数的精辟解说
此文原文来源于一个blog,文章的名称为:linux fork函数的精辟解说原文地址:http://blog.chinaunix.net/space.php?uid=12461657&do=b ...
最新文章
- Ardino基础教程 24_RGB全彩LED
- mysql主从同步监控小脚本(加强版)
- mongo基本使用方法
- linux安全模式改文件,嵌入式Linux的安全模式设计 - 嵌入式操作系统 - 电子发烧友网...
- Codeforces Round #445 div.2 D. Restoration of string 乱搞
- c语言错误封装,C语言实现的封装,继承,多态
- Idea svn 新文件自动添加到版本控制
- 戴尔:未来就绪的IT
- 从Exchange 2010 SP1高可用性环境下升级到SP2
- 编写java程序计算梯形面积_学习练习 java面向对象梯形面积
- Java PDF生成方案介绍及问题汇总
- 读书笔记——《别让猴子跳回背上》
- 怎么把视频压缩成表情包?如何把视频做成GIF动图
- CVPR 2019 | 「识面知心」——基于自监督学习的微表情特征表达
- mac m1 解决fatal: unable to access ‘https://github.com/Homebrew/homebrew-core/‘ ;同时指定intel架构的brew 版本
- 【紧急情况】:回宿舍放下书包的我,花了20分钟敲了一个抢购脚本
- JAVA中怎样把用户输入的字符串存入数组中?
- CentOS下连VisualSVN服务器 (windows的svn服务器)
- bzoj1038【ZJOI2008】瞭望塔
- 如何判断代理IP的匿名程度?