今晚在研究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. 【WEB基础】HTML & CSS 基础入门(3)段落及文本

    写在前面:CSS选择器 网页要显示很多内容,想要为每个内容设置不同的样式,我们就得首先选中要设置样式的内容,CSS选择器就是指明该样式是针对HTML里哪一个元素的.简单的例子,网页上有几段文字,我们想 ...

  2. IntentService使用以及源码分析

    一 概述 我们知道,在Android开发中,遇到耗时的任务操作时,都是放到子线程去做,或者放到Service中去做,在Service中开一个子线程来执行耗时操作. 那么,在Service里面我们需要自 ...

  3. 从ao神处偷取的头文件

    #include<bits/stdc++.h> using namespace std; #define ll long long #define ull unsigned long lo ...

  4. asp.net实现服务器文件下载到本地

    1.说明 通过文件下载框实现将服务器上的文件下载到本地指定位置.这里需要指定服务器文件路径 try { string strFilePath = Server.MapPath("~" ...

  5. JVM的参数详解

    今天就整理下JVM的参数!相对而已JVM有很多参数,但对于一般开发人员执行知道和堆栈大小,GC.远程调试的参数即可. JVM Parameters 首先需要说明的是JVM的参数形式: -X 开头的参数 ...

  6. 【POJ - 2664】Prerequisites? (排序+查找)

    Prerequisites? 原文是English,这里直接就写中文吧 题意简述 k:已经选择的科目数:m:选择的科目类别:c:能够选择的科目数.r:要求最少选择的科目数量 在输入的k和m以下的一行是 ...

  7. Robotframework自动化系列:筛选结果数量统计

    Robotframework自动化系统:筛选结果数量统计 上一个节点已经可以随机选中某一个下拉框的值,我们在使用evaluate随机数的时候需要计算下拉选项总数,这时候我们是手工计算输入的:这时候如果 ...

  8. ssh密钥分发之二:使用sshpass配合ssh-kopy-id编写脚本批量分发密钥:

    使用sshpass配合ssh-kopy-id编写脚本批量分发密钥: 首先sshpass是一个ssh连接时的免交互工具,首先要安装一下: yum install sshpass -y 接下来我们就可以使 ...

  9. linux软件的安装。使用rpm、yum或wget下载软件

    介绍 在linux中安装软件一般有一下几种方式: a.通过rpm包安装 b.通过yum在线安装(联网) c.weget url 在线下载软件(只负责下载,不安装) 1.通过rpm包来进行软件的安装和卸 ...

  10. req.getParameter()无法获取参数(附前端json序列化)

    问题:前端用Ajax的post方式想servlet传递参数,servlet的getParameter()方法无法获取参数. 前端代码: $.ajax({ url: '/TestWeb/addBook' ...