LInux设备驱动分析—— kmalloc和kzalloc函数
今晚在研究EVM5728开发板上面Linux系统的IIC设备驱动程序,偶然之间看到驱动程序中有一处使用了kzalloc函数,本人之前都是使用Linux内核提供的kmalloc / kfree函数来给设备相关结构体分配 / 释放内存的,第一次看到kzalloc函数的使用,因此觉得很好奇,于是乎google了一下这个函数的用法,并与kmalloc函数进行了对比,顺便记录一下,方便以后学习查询。
首先,先看下面这个驱动程序的设备检测函数,在该函数的第10行调用了一个kzalloc函数给yyy_data这个结构体分配了内存,并返回一个yyy_data类型的指针并赋值给data变量,那么这个函数的工作原理是怎么样的呢?

我查询了网上资料,找到了kzalloc函数的原型和定义,如下图所示:

从函数定义我们可以看出,该函数接收了两个参数,第一个参数size表示需要分配多少字节的内存,该参数由调用者提供,而第二个参数是gtp_t 类型的参数,用于控制内存的分配策略,该参数与kmalloc函数的第二个参数是相同的,用户通过设置该参数可以控制内核的内存分配策略。关于该参数的使用后面再作具体分析。
我们从函数定义还可以看出,kzalloc函数实际上是调用了kmalloc函数,只不过在传递参数时将接收的flags 与GFP_ZERO标志相或再传给kmalloc函数。通过这一点,我们可以得知kzalloc函数的作用是调用kmalloc函数分配内存并将获得的内存进行清零(调用memset函数初始化为0),本质上是对kmalloc的封装,通过该函数分配的内存是已经初始化的,程序中可以直接使用,而直接调用kmalloc函数分配的内存块并没有初始化,里面的数据是不可用的。kzalloc函数的使用与kmalloc类似,都需要包含<linux/slab.h> 头文件。
另外,需要说明一下,__GFP_ZERO标志是定义在 <linux/gfp.h> 头文件中的宏定义,该标志表示给分配的内存块清零,在该文件中还定义了其他的宏,都可以用于控制kzalloc和kmalloc函数的内存分配行为。
第二个参数的说明
关于kzalloc和kmalloc函数的第二个参数,根据Linux内核文档的说明,该参数可以用来控制内核分配内存的行为,如是否睡眠等,也可以控制内核从哪里分配内存,需要使用定义在 <linux/gfp.h>的宏,有兴趣的同学可以看看以下的参考资料:
https://blog.csdn.net/u010709783/article/details/77712311
下面是我正在看的驱动程序,从程序就可以看出kzalloc函数的使用:

参考资料
1. 《Linux内核设计与实现》第三版
2. https://blog.csdn.net/xujianqun/article/details/6715243
LInux设备驱动分析—— kmalloc和kzalloc函数的更多相关文章
- (转)Linux设备驱动之HID驱动 源码分析
//Linux设备驱动之HID驱动 源码分析 http://blog.chinaunix.net/uid-20543183-id-1930836.html HID是Human Interface De ...
- linux PMBus总线及设备驱动分析
PMBus协议规范介绍 PMBus是一套对电源进行配置.控制和监控的通讯协议标准.其最新版本为1.3,该规范还在不断演进中,比如新标准中新增的zone PMBus.AVSBus等特性.在其官网上有详细 ...
- linux 设备驱动概述
linux 设备驱动概述 目前,Linux软件工程师大致可分为两个层次: (1)Linux应用软件工程师(Application Software Engineer): 主要利用C库函数和 ...
- LINUX设备驱动模型之class
转自 https://blog.csdn.net/qq_20678703/article/details/52754661 1.LINUX设备驱动模型中的bus.device.driver,.其中bu ...
- Linux spi驱动分析(二)----SPI核心(bus、device_driver和device)
一.spi总线注册 这里所说的SPI核心,就是指/drivers/spi/目录下spi.c文件中提供给其他文件的函数,首先看下spi核心的初始化函数spi_init(void).程序如下: 点击(此处 ...
- Linux I2C驱动分析(三)----i2c_dev驱动和应用层分析 【转】
本文转载自:http://blog.chinaunix.net/uid-21558711-id-3959287.html 分类: LINUX 原文地址:Linux I2C驱动分析(三)----i2c_ ...
- Linux 设备驱动 Edition 3
原文网址:http://oss.org.cn/kernel-book/ldd3/index.html Linux 设备驱动 Edition 3 By Jonathan Corbet, Alessand ...
- Linux设备驱动中的阻塞和非阻塞I/O
[基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到 ...
- Linux设备驱动模型之platform(平台)总线详解
/********************************************************/ 内核版本:2.6.35.7 运行平台:三星s5pv210 /*********** ...
随机推荐
- sql server编写一个语句脚本自动清空各表数据以初始化数据库
问题:有时已有项目要移植,例如原来在广州地区使用的某系统,突然说惠州那边也要用这套一样的系统.或者,在demo环境下弄了一些测试数据.然后要清空全部表数据.如果表比较多的话,逐个表手工编写脚本就太麻烦 ...
- c# dynamic 无法创建 泛型变量的问题
IMyClass<T> FunctionA<T>( object arg_obj) { dynamic dyObj = arg_obj; return new MyClass& ...
- 《编译原理》-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法
<编译原理>-用例题理解-自顶向下语法分析及 FIRST,FOLLOW,SELECT集,LL(1)文法 此编译原理确定某高级程序设计语言编译原理,理论基础,学习笔记 本笔记是对教材< ...
- AJPFX总结string类和简单问题
String表示字符串,所谓字符串,就是一连串的字符;String是不可变类,一旦String对象被创建,包含在对象中的字符序列(内容)是不可变的,直到对象被销毁://一个String对象的内容不能变 ...
- logging模块进阶
python利用logging模块来记录日志主要涉及四个类 logger提供了应用程序可以直接使用的接口 handler将logger创建的日志提供的输出发送到指定目的地. filter起到过滤作用, ...
- hihocoder offer收割编程练习赛8 C 数组分拆
思路:(引自bfsoyc的回答:http://hihocoder.com/discuss/question/4160) 动态规划.状态dp[i]表示 前i个数的合法的方案数,转移是 dp[i] = s ...
- The Performance Manifesto
Manifesto For Performance Testing And Engineering We choose to support others in their quest for bet ...
- dataTables去掉搜索框和每页多少条框体,解决Cannot reinitialise DataTable问题
$('#example').DataTable({ searching:false, //去掉搜索框 bLengthChange:false,//去掉每页多少条框体 "language&qu ...
- jmeter的JVM参数设置
JMeter用户可根据运行的计算机配置,来适当调整JMeter.bat中的JVM调优设置,如下所示: set HEAP=-Xms512m -Xmx512m set NEW=-XX:NewSize=12 ...
- AIX 11203 ASM RAC安装
1:查看系统版本 [rac1:root:/hacmp/hacmp5.4/ha5.4/installp/ppc] oslevel -s 6100-06-06-1140 lslpp -al bos.adt ...