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 /*********** ...
随机推荐
- 【WEB基础】HTML & CSS 基础入门(3)段落及文本
写在前面:CSS选择器 网页要显示很多内容,想要为每个内容设置不同的样式,我们就得首先选中要设置样式的内容,CSS选择器就是指明该样式是针对HTML里哪一个元素的.简单的例子,网页上有几段文字,我们想 ...
- float以后设置的小细节
先看看下面这段css代码,是不是很完美?没错? #pageBodyMain .articleList a: after { content: ""; clear: both; di ...
- UILabel和UIButton添加下划线
关于UILabel和UIButton有的时候需要添加下划线,一般有两种方式通过默认的 NSMutableAttributedString设置,第二种就是在drawRect中画一条下划线,本文就简单的选 ...
- influxdb数据库的安装部署(windows)二
1.把下载好的文件解压到目录中 2.以管理员身份运行cmd进入influxdb-1.7.6-1文件夹 3.生成influxdb数据的默认配置Config文件 4.修改Config配置信息 5.用配置好 ...
- HTML5中div,article,section的区别
最近正在学习html5,刚接触html5,感觉有点不适应,因为有一些标签改变了,特别是div, section article这三个标签,查了一些资料,也试着用html5和css3布局网页,稍微有点头 ...
- the little schemer 笔记(4)
第四章 numbers games 14 是原子吗 是的,数都是原子 (atom? n) 是真还是假,其中n是14 真,14 是原子 -3是数吗 是的,不过我们暂不考虑负数 3.14159是数吗 是的 ...
- JAVA学习笔记(一)配置环境
java语言的两种机制: Java 的虚拟机机制(JVM):虚拟机机制保证Java程序的跨平台特性. Java 的垃圾回收机制:垃圾回收机制保证Java程序更安全.更高效. 环境搭配:安装JDK和JR ...
- vue+typescript入门学习
最近想要结合vue学习typescript,了解到vue2.5之后开始支持typescript,就像拿vue学习一下,首先要解决的就是环境的搭建,略微麻烦,如果想要自己体验一把,可以参考这篇文章htt ...
- bash 变量传递方法
###1.sh ##(该sh 目的是 将变量env传入env.sh, 同时让env.sh在当前事物生效,最后执行env.sh 定义的变量envs) export ENV=prepareecho ...
- 162 Find Peak Element 寻找峰值
峰值元素是指其值大于左右相邻值的元素.给定一个输入数组,其中 num[i] ≠ num[i+1],找到峰值元素并返回其索引.数组可能包含多个峰值,在这种情况下,返回到任何一个峰值所在位置都可以.你可以 ...