作用:内核分配连续物理内存的接口函数,在虚拟地址空间上也是连续的。

与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 函数相关推荐

  1. linux内核函数kmalloc,LINUX内核内存管理kmalloc,vmalloc

    在设备驱动程序或者内核模块中动态开辟内存,不是用malloc,而是kmalloc ,vmalloc,释放内存用的是kfree,vfree,kmalloc函数返回的是虚拟地址(线性地址). kmallo ...

  2. 内核中的kmalloc函数详解

    一.kmalloc函数详解 #include <linux/slab.h> void *kmalloc(size_t size, int flags); 给 kmalloc 的第一个参数是 ...

  3. linux内核函数出错的返回值

    linux内核函数出错的返回值 1. 函数返回指针 2. 如何通过错误信息指针来返回错误信息 3. 出错代码返回指针在(-1000,0)区间 4. 错误的判断和错误原因的打印 4.1 错误的判断 4. ...

  4. Linux系统函数之IO函数

    技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.标准C库IO函数工作流程 IO缓冲区的作用? 大部分硬盘都是机械硬盘,读取寻道时间 ...

  5. linux计时函数的使用

    linux计时函数的使用 linux下计时函数的使用目的是测量程序运行的时间 头文件 #include <sys/time.h> 计时函数 int gettimeofday(struct ...

  6. linux C函数之strdup函数分析【转】

    本文转载自:http://blog.csdn.net/tigerjibo/article/details/12784823 linux C函数之strdup函数分析 一.函数分析 1.函数原型: [c ...

  7. Linux getopt()函数 getopt_long()函数---转

    http://hi.baidu.com/scoundrelgg/item/d4083f8412eea05d26ebd97f Linux getopt()函数 getopt_long()函数 get_o ...

  8. linux shell函数

    linux shell函数

  9. linux fork函数的精辟解说

    此文原文来源于一个blog,文章的名称为:linux fork函数的精辟解说原文地址:http://blog.chinaunix.net/space.php?uid=12461657&do=b ...

最新文章

  1. Ardino基础教程 24_RGB全彩LED
  2. mysql主从同步监控小脚本(加强版)
  3. mongo基本使用方法
  4. linux安全模式改文件,嵌入式Linux的安全模式设计 - 嵌入式操作系统 - 电子发烧友网...
  5. Codeforces Round #445 div.2 D. Restoration of string 乱搞
  6. c语言错误封装,C语言实现的封装,继承,多态
  7. Idea svn 新文件自动添加到版本控制
  8. 戴尔:未来就绪的IT
  9. 从Exchange 2010 SP1高可用性环境下升级到SP2
  10. 编写java程序计算梯形面积_学习练习 java面向对象梯形面积
  11. Java PDF生成方案介绍及问题汇总
  12. 读书笔记——《别让猴子跳回背上》
  13. 怎么把视频压缩成表情包?如何把视频做成GIF动图
  14. CVPR 2019 | 「识面知心」——基于自监督学习的微表情特征表达
  15. mac m1 解决fatal: unable to access ‘https://github.com/Homebrew/homebrew-core/‘ ;同时指定intel架构的brew 版本
  16. 【紧急情况】:回宿舍放下书包的我,花了20分钟敲了一个抢购脚本
  17. JAVA中怎样把用户输入的字符串存入数组中?
  18. CentOS下连VisualSVN服务器 (windows的svn服务器)
  19. bzoj1038【ZJOI2008】瞭望塔
  20. 如何判断代理IP的匿名程度?

热门文章

  1. word 和 excel 的联动
  2. 布兰森汉姆画圆matlab,bresenham算法画直线
  3. clojure 的访问数据库操作
  4. RPC 获取BNB 余额
  5. 2019QLU.ACM集训队暑假训练须知
  6. 什么软件可以测试你适合什么颜色,朋友圈都在刷的性格测试来了,快测测你的性格颜色是否稀缺?...
  7. Java网络蜘蛛/网络爬虫 Spiderman
  8. oj 数据结构实验之图论三:判断可达性
  9. 社会心理学的六个经典实验
  10. Bcompare.exe应用程序发生错误