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

与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. leetcode 454 四数相加
  2. 思考问题的“六顶帽子”
  3. redistemplate怎么修改数据_如何使用RedisTemplate访问Redis数据结构?
  4. XML学习(二)————属性还是标签?
  5. JQuery实现ajax跨域
  6. php xml 实例教程,php解析xml方法实例详解,解析xml实例详解_PHP教程
  7. php防撞库,基于单片机的倒车防撞预警系统设计和实现
  8. AP6212 蓝牙调试步骤
  9. 三极管放大电路驱动蜂鸣器
  10. php jion用法,ThinkPHP关于JOIN使用方法详细说明
  11. 刷题记录(NC235611 牛牛国的战争,NC23803 DongDong认亲戚,NC235622 叠积木)
  12. 微信小程序web-view显示html页面
  13. 操作系统实验四——使用命名管道实现进程通信
  14. html怎么去除广告,无需外力 巧妙去除Vagaa哇嘎界面广告
  15. vscode使用技巧
  16. Shift-JIS字符集判断
  17. C语言中图片处理函数,怎么用C语言中的fopen函数打开bmp格式的图像文件?
  18. wsl安装gpu版mindspore(一)
  19. 2022-1-19 C++ STL —— adapters
  20. 矩阵求导的本质与分子布局、分母布局的本质(一)

热门文章

  1. 图形学-中点Bresenham算法
  2. 逃离象牙塔――辍学游戏人面面观
  3. APM飞控学习之路:4 源码裁剪与下载
  4. 求生技能必备:如何从被困水中的车里逃生
  5. 让vscode的c++补全if的花括号在同一行
  6. nginx设置目录白名单、ip白名单
  7. python颜色识别_颜色检测python
  8. 数据分析思维学习1:业务指标、数据获取、数据仓库、数据治理、数据分析方法
  9. 向上转型和向下转型的区别
  10. Viewpager 小于3张图片滑动时 左滑 出现 背景 白屏