Linux驱动开发(最简单的驱动模块,内核printk函数)

1.最简单的驱动模块源码

#include 		// module_init  module_exit
#include 			// __init   __exit

// 模块安装函数
static int __init chrdev_init(void)
{	
	printk(KERN_INFO "chrdev_init helloworld init\n");
	return 0;
}

// 模块卸载函数
static void __exit chrdev_exit(void)
{
	printk(KERN_INFO "chrdev_exit helloworld exit\n");
}

module_init(chrdev_init);   //执行这个宏就相当于进到模块安装函数里面执行函数
module_exit(chrdev_exit);   //执行这个宏就相当于进到模块卸载函数里面执行函数

// MODULE_xxx这种宏作用是用来添加模块描述信息
MODULE_LICENSE("GPL");				// 描述模块的许可证
MODULE_AUTHOR("aston");				// 描述模块的作者
MODULE_DESCRIPTION("module test");	// 描述模块的介绍信息
MODULE_ALIAS("alias xxx");			// 描述模块的别名信息

(1)模块的安装:先lsmod再insmod看安装前后系统内模块记录

lsmod(list module,将模块列表显示) 功能是打印出当前内核中已经安装的模块列表
insmod(install module,安装模块) 功能是向当前内核中去安装一个模块,用法是insmod xxx.ko

(2)模块的版本信息:

modinfo(module information,模块信息) 功能是打印出一个内核模块的自带信息,用法是modinfo xxx.ko

(3)模块卸载:

rmmod(remove module,卸载模块) 功能是从当前内核中卸载一个已经安装了的模块,用法是rmmod xxx(注意卸载模块时只需要输入模块名即可,不能加.ko后缀)

(4)模块中常用宏:

MODULE_LICENSE(“GPL”) 描述模块的许可证
MODULE_AUTHOR(“aston”) 描述模块的作者
MODULE_DESCRIPTION(“module test”) 描述模块的介绍信息
MODULE_ALIAS(“alias xxx”) 描述模块的别名信息


2.内核printk函数


printk是内核态信息打印函数,功能和比准C库的printf类似。
函数原型:int printk(const char *fmt, ...)

消息打印级别:fmt----消息级别:不同级别使用不同字符串表示,数字越小,级别越高

#define KERN_EMERG    "<0>"			用于紧急消息, 常常是那些崩溃前的消息.

#define KERN_ALERT    "<1>"			需要立刻动作的情形.

#define KERN_CRIT     "<2>"			严重情况, 常常与严重的硬件或者软件失效有关.

#define KERN_ERR      "<3>"         用来报告错误情况; 设备驱动常常使用 KERN_ERR 来报告硬件故障.

#define KERN_WARNING  "<4>"			有问题的情况的警告, 这些情况自己不会引起系统的严重问题.

#define KERN_NOTICE   "<5>" 		正常情况, 但是仍然值得注意. 在这个级别一些安全相关的情况会报告.

#define KERN_INFO     "<6>" 		 信息型消息. 在这个级别, 很多驱动在启动时打印它们发现的硬件的信息.

#define KERN_DEBUG    "<7>"          用作调试消息.

(1)printk在内核源码中用来打印信息的函数,用法和printf非常相似。

(2)printk和printf最大的差别:printf是C库函数,是在应用层编程中使用的,不能在linux内核源代码中使用;printk是linux内核源代码中自己封装出来的一个打印函数,是内核源码中的一个普通函数,只能在内核源码范围内使用,不能在应用编程中使用

(3)printk相比printf来说还多了个:打印级别的设置。printk的打印级别是用来控制printk打印的这条信息是否在终端上显示的

(4)在内核中,因为内核非常庞大,打印信息非常多,有时候整体调试内核时打印信息要么太多找不到想要的要么一个没有没法调试。所以才有了打印级别这个概念,操作系统的命令行中也有一个打印信息级别属性,值为0-7

你可能感兴趣的:(Linux驱动)