今晚在研究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函数的更多相关文章

  1. (转)Linux设备驱动之HID驱动 源码分析

    //Linux设备驱动之HID驱动 源码分析 http://blog.chinaunix.net/uid-20543183-id-1930836.html HID是Human Interface De ...

  2. linux PMBus总线及设备驱动分析

    PMBus协议规范介绍 PMBus是一套对电源进行配置.控制和监控的通讯协议标准.其最新版本为1.3,该规范还在不断演进中,比如新标准中新增的zone PMBus.AVSBus等特性.在其官网上有详细 ...

  3. linux 设备驱动概述

    linux 设备驱动概述 目前,Linux软件工程师大致可分为两个层次: (1)Linux应用软件工程师(Application Software Engineer):       主要利用C库函数和 ...

  4. LINUX设备驱动模型之class

    转自 https://blog.csdn.net/qq_20678703/article/details/52754661 1.LINUX设备驱动模型中的bus.device.driver,.其中bu ...

  5. Linux spi驱动分析(二)----SPI核心(bus、device_driver和device)

    一.spi总线注册 这里所说的SPI核心,就是指/drivers/spi/目录下spi.c文件中提供给其他文件的函数,首先看下spi核心的初始化函数spi_init(void).程序如下: 点击(此处 ...

  6. Linux I2C驱动分析(三)----i2c_dev驱动和应用层分析 【转】

    本文转载自:http://blog.chinaunix.net/uid-21558711-id-3959287.html 分类: LINUX 原文地址:Linux I2C驱动分析(三)----i2c_ ...

  7. Linux 设备驱动 Edition 3

    原文网址:http://oss.org.cn/kernel-book/ldd3/index.html Linux 设备驱动 Edition 3 By Jonathan Corbet, Alessand ...

  8. Linux设备驱动中的阻塞和非阻塞I/O

    [基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到 ...

  9. Linux设备驱动模型之platform(平台)总线详解

    /********************************************************/ 内核版本:2.6.35.7 运行平台:三星s5pv210 /*********** ...

随机推荐

  1. E20180422-hm

    tint n. 浅色; 色彩,色泽; 气息,迹象,痕迹 vt. 染色; 着色于…; 染(发) introduce vt. 介绍; 引进; 提出; 作为…的开头; variation  n. 变化,变动 ...

  2. poj1163 【记忆化搜索·水】

    题意: 一个这样的三角形,他可以往下的左或者往下的右走.求一个在最后一行的最大. 思路: 额...就是搜一下..记录一下...肯定有重合的情况. code- //#include <bits/s ...

  3. PTA 模拟【string以及字母->数组下标】

    假设有九宫格输入法键盘布局如下: [ 1,.?! ] [ 2ABC ] [ 3DEF ] [ 4GHI ] [ 5JKL ] [ 6MNO ] [ 7PQRS ] [ 8TUV ] [ 9WXYZ ] ...

  4. hdoj1001【智障了。。。】

    我不得不写这样一发,来提醒自己,本来是想在xixi面前1minAC,然后: 我没有用long long. wa一发 他告诉我每个案例后都要再加一个空行,没看见PE一 #include<iostr ...

  5. Linux 问题 卸载setup.py方式安装的python包

    python ./setup.py install --record install.txt  cat install.txt | xargs rm -rf

  6. Swoole和Workerman到底选谁?

    Swoole:面向生产环境的 PHP 异步网络通信引擎 使 PHP 开发人员可以编写高性能的异步并发 TCP.UDP.Unix Socket.HTTP,WebSocket 服务.Swoole 可以广泛 ...

  7. 双端队列 HDOJ 3530 Subsequence

    题目传送门 题意:问最长子序列,满足区间最大值 - 最小值在[m, k]之间 分析:用双端队列维护最大值和最小值,保存的是位置.当满足条件时,更新最大值. /********************* ...

  8. sql 语句操作,修改字段中字符串的一部分

    update 表名 set 字段=replace(字段,‘替换的部分’,‘替换后的字符串’): update 表名 set A=replace( A, '海淀', '朝阳') where A like ...

  9. Clone a Pluggable Database – 12c Edition

    1. 1.Tnsnames when connecting to either Container or Pluggable instance The tnsnames.ora should be c ...

  10. 洛谷P1251 餐巾计划问题(最小费用最大流)

    题意 一家餐厅,第$i$天需要$r_i$块餐巾,每天获取餐巾有三种途径 1.以$p$的费用买 2.以$f$的费用送到快洗部,并在$m$天后取出 3.以$s$的费用送到慢洗部,并在$n$天后取出 问满足 ...