以hello world模块为例

#include <linux/init.h>
#include <linux/module.h> //在执行 insmod hlello 的时候会被调用
static int hello_init(void)
{ printk(KERN_ALERT"hello_init\n");
return ;
} //在执行 rmmod hlello 的时候会被调用
static void hello_exit(void)
{
printk(KERN_ALERT"hello_exit\n");
} MODULE_LICENSE("GPL");//添加自由许可证
module_init(hello_init);
module_exit(hello_exit);
KERN_ALERT:是用来定义这条消息的优先级的。声明在:kernel.h  include\linux\kernel.h中声明
#define    KERN_EMERG    "<0>"    /* system is unusable    (紧急情况,系统可能会崩溃)        */
#define KERN_ALERT "<1>" /* action must be taken immediately(必须立即响应) */
#define KERN_CRIT "<2>" /* critical conditions (临界情况) */
#define KERN_ERR "<3>" /* error conditions (错误信息) */
#define KERN_WARNING "<4>" /* warning conditions (警告信息) */
#define KERN_NOTICE "<5>" /* normal but significant condition( 普通的但可能需要注意的信息) */
#define KERN_INFO "<6>" /* informational (提示性信息) */
#define KERN_DEBUG "<7>" /* debug-level messages (调试信息) */

Makfile:

KERN_DIR = /work/system/linux-2.6.22.6   //内核路径

all:
make -C $(KERN_DIR) M=`pwd` modules clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order obj-m += helloworld.o //编译成helloworld.o

make输出信息:

make -C /work/system/linux-2.6.22.6 M=`pwd` modules
make[]: Entering directory `/work/system/linux-2.6.22.6'
CC [M] /home/book/work/nfs_root/first_fs/work/helloworld/helloworld.o
Building modules, stage .
MODPOST modules
CC /home/book/work/nfs_root/first_fs/work/helloworld/helloworld.mod.o
LD [M] /home/book/work/nfs_root/first_fs/work/helloworld/helloworld.ko
make[]: Leaving directory `/work/system/linux-2.6.22.6'

从输出信息中可以看出 ,最终的目的是生成了  helloworld.ko 这个文件

运行结果:

为什么需要使用printk 函数来打印了?

  在模块运行过程中,不能依赖于c库,模块能够调用printk是因为在 insmod函数装入模块后,模块就链接到了内核中。所以就能访问公用的符号(printk)

为什么模块需要初始化?

  模块初始化的目的就是为了以后调用模块中的函数做准备。

设备驱动程序如何引用当前进程?

  在设备驱动程序中只需要包含<linux/sched.h>头文件即可引用当前进程。例如  通过访问  Staruc task_staruct  成员变量答应当前的命令名称。和进程ID

  分别在装载和卸载调用中添加两条打印语句:printk(KERN_INFO"The process is \"%s\"(pid %i)\n",current->comm,current->pid)

  打印出当前命令名称与进程ID

//在执行  insmod hlello 的时候会被调用
static int hello_init(void)
{ printk(KERN_ALERT"hello_init\n");
printk(KERN_INFO"The process is \"%s\"(pid %i)\n",current->comm,current->pid);
return ;
} //在执行 rmmod hlello 的时候会被调用
static void hello_exit(void)
{
printk(KERN_ALERT"hello_exit\n");
printk(KERN_INFO"The process is \"%s\"(pid %i)\n",current->comm,current->pid);
}

运行状态如下:

模块参数:

由于系统不同,所以驱动程序需要的参数也会发生变化,其中包括设备编号以及其他一些用来控制驱动程序操作方式的参数。

  为了满足这个需求,内核允许对驱动程序指定参数,而这些参数可在装载驱动模块是发生改变。

在insmod改变模块参数之前,模块必须让这些参数对insmod命令可见(可操作)。必须使用module_param 宏来声明,在moduleparm.h中定义

module_param 需要三个参数: 变量名称      类型    用于sysfs入口项的访问许可掩码。

代码如下:

static char *param_string = "hello";//一个名字为param_string 的指针变量
static int print_cont =; //int 型变量 module_param(param_string, charp, S_IRUGO);//使用module_param宏来让param_string变量对insmod 命令可见
module_param(print_cont, int, S_IRUGO);//同上 //在执行 insmod hlello 的时候会被调用
static int hello_init(void)
{
int i;
printk(KERN_ALERT"hello_init\n");
printk(KERN_INFO"The process is \"%s\"(pid %i)\n",current->comm,current->pid);
for(i= ;i < print_cont; i++) //根据变量打印对应的次数
printk(KERN_ALERT"%s\n",param_string); //打印
return ;
} //在执行 rmmod hlello 的时候会被调用
static void hello_exit(void)
{
printk(KERN_ALERT"hello_exit\n");
printk(KERN_INFO"The process is \"%s\"(pid %i)\n",current->comm,current->pid);
} MODULE_LICENSE("GPL");//添加自由许可证
module_init(hello_init);
module_exit(hello_exit);

运行结果:

内核模块支持参数类型:

bool

invbool(反转其值,true变为false  false 变为true)

charp  字符指针值,内核会给字符串分配内存,并相应设置指针。

int

long

short

uint

ulong

ushort

liunx驱动----构造和运行模块的更多相关文章

  1. linux设备驱动第二篇:构造和运行模块

      上一篇介绍了Linux驱动的概念,以及linux下设备驱动的基本分类情况及其各个分类的依据和差异,这一篇我们来描述如何写一个类似hello world的简单测试驱动程序.而这个驱动的唯一功能就是输 ...

  2. 【Linux设备驱动程序】Chapter 2 - 构造和运行模块

    Hello World 模块 #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("Du ...

  3. ldd3-2 构造和运行模块:环境搭建2

    之前搭建了Ubuntu10.04驱动开发环境,但是那儿的内核版本是2.6.32.27,总感觉无从下手的感觉,因为书上的内核版本是2.6.10,作为初学者不知道差异在哪里,或许不应该纠结这个问题吧. 昨 ...

  4. 2018-05-17-OAA-一种mermaid脚本驱动的软件项目模块图形化表述思路

    layout: post title: 2018-05-17-OAA-一种mermaid脚本驱动的软件项目模块图形化表述思路 key: 20180517 tags: OAA flow chart se ...

  5. Angular——配置模块与运行模块

    配置模块 通过config方法实现对模块的配置,AngularJS中的服务大部分都对应一个“provider”,用来执行与对应服务相同的功能或对其进行配置.比如$log.$http.$location ...

  6. Appium学习之驱动真机运行

    一.Appium工具的简单原理 Appium工具可以分为:客户端(appium-client).服务端(appium-server)和移动设备端(模拟器或者真机).客户端支持多语言,如:python- ...

  7. Linux驱动入门——构建和运行模块

    Hello world模块 本文介绍如何向内核中添加一个hello模块.该模块的功能是在模块加载时,向系统日志输出"hello world\n" 在模块卸载时输出"Goo ...

  8. 【linux驱动笔记】linux模块机制浅析

      1.   模块module 操作系统分微内核和宏内核,微内核优点,可以使操作系统仅作很少的事,其它事情如网络处理等都作为应用程序来实现,微内核精简的同时,必然带来性能的下降.而linux的宏内核设 ...

  9. liunx驱动之字符设备的注册

    上一篇文章学习了如何编写linux驱动,通过能否正常加载模块进行验证是否成功,有做过liunx应用开发的小伙伴都知道驱动会在'/dev'目录下以文件的形式展现出来,所以只是能加载驱动模块不能算是完成驱 ...

随机推荐

  1. JavaFile I/O

    Java流类图结构: 流的概念和作用: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.及数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将抽象为各种类,方便更直观 ...

  2. 201771010126王燕《面向对象程序设计(Java)》第三周学习总结

    实验三 Java基本程序设计(2) 实验时间 2018-9-13 1.实验目的与要求 (1)进一步掌握Eclipse集成开发环境下java程序开发基本步骤: (2)熟悉PTA平台线上测试环境: (3) ...

  3. react_app 项目开发 (9)_数据可视化 ECharts

    数据可视化 ECharts yarn add echarts echarts-for-react

  4. poj 1375

    一道解析几何么,,, 其实就是求直线与圆的切线. 看到方法有很多,比如根据角度之类的. 这里主要用到了初中的几何知识. 考虑这幅图. 首先可以根据相似三角形知道b的长度,同时圆心与点的方向也知道. 那 ...

  5. 剑指offer——python【第39题】平衡二叉树

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树.   解题思路 平衡二叉树首先是二叉搜索树,且它每个节点的左子树和右子树高度差至多等于1:只要从根节点,依次递归判断每个节点是否满足如上条件即可 ...

  6. Charles 使用

    一.设置域名焦点 View->Focused Hosts…-> 二.抓包https:配置证书 1. 电脑安装SSL证书 选择 “Help” -> “SSL Proxying” -&g ...

  7. 安晓辉大神的感悟:如果你发现了自己的学习模式,愿意学并且能坚持,我觉得没什么能阻挡你征服软件世界的脚步(对于开发人员来讲,最大的风险是:在职业规划上没有延续性地乱跳槽。时刻要牢记在心的:培养自己的稀缺性) good

    从技术支持中途转战软件开发,如今从事编程工作已十多有余,2014年CSDN博文大赛编程语言组冠军.CSDN Qt论坛的版主安晓辉老师从今天开始,坐镇CSDN社区问答栏目的 第十四期,届时会接受广大网友 ...

  8. 建立live555海思编码推流服务

    因项目需要,这一周弄了一下live555.需求:海思编码——>RTSP server,使用VLC可以访问,类似于网络摄像机的需求.看了一下,live555的架构太复杂了,半桶水的C++水平还真的 ...

  9. 2016(4)数据库系统,ER模型,规范化理论,并发控制

    试题四(共25分) 阅读以下关于数据库设计的叙述,在答题纸上回答问题1至问题3. 某航空公司要开发一个订票信息处理系统,以方便各个代理商销售机票.开发小组经过设计,给出该系统的部分关系模式如下: 航班 ...

  10. 简单的linux使用命令

    1 查看日志异常 tail -f 实时查看日志文件 tail -f 日志文件logtail - 100f 实时查看日志文件 后一百行tail -f -n 100 catalina.out linux查 ...