当前位置: 首页 > 科技观察

最简单的Linux驱动编译运行

时间:2023-03-18 11:00:12 科技观察

一、背景知识可加载内核模块:为了能够更灵活地扩展系统功能,Linux支持动态扩展内核,即在系统运行时向内核添加新的功能。正在运行(即模块模块)。模块:模块是一段可以动态链接的目标代码(.ko)。它可以通过insmod命令动态加载并链接到正在运行的内核。一旦链接,它就成为内核的一部分,直到使用rmmod命令取消链接和卸载。Linux驱动程序是一种特殊的可加载内核模块。说明:本代码已通过linux2.6以上版本测试运行。linux3.*也可用。我用的是ubuntu12.04,linux内核版本linux3.5。2、如何从源代码(.c文件)编译内核模块生成动态链接的目标代码(即.ko文件)?先写一个最简单的驱动源码:hello.c[html]查看plaincopy#include//声明头文件#include//模块加载函数staticinthello_init(void){printk(KERN_INFO"HelloWorldenter\n");//系统调用打印函数,类似于用户调用printfreturn0;}//模块卸载函数staticvoidhello_exit(void){printk(KERN_INFO"HelloWorldexit\n");}module_init(hello_init);//向系统注册模块加载函数module_exit(hello_exit);//向系统注册模块卸载函数MODULE_AUTHOR("BarrySong<21cnbao@gmail.com>");//模块作者等信息声明,可选MODULE_LICENSE("DualBSD/GPL");//模块许可声明MODULE_DESCRIPTION("AsimpleHelloWorldModule");//模块描述声明,可选MODULE_ALIAS("asimplestmodule");//模块别名声明,可选将本程序编译成hello.ko的步骤:1.编写makefile[html]viewplaincopyKVERS=$(shelluname-r)#变量KVERS是c当前linux版本值obj-m+=hello.odefault:make-C/lib/modules/$(KVERS)/buildM=$(CURDIR)modules-C后面是linux内核源码树目录,M=后面是源码目录2、在终端输入cd/**/**,找到hello.c源码所在目录。3.在终端输入make命令。4、如图所示,可以生成hello.ko文件。其他文件是生成的一些中间文件。3.加载加载:在终端输入insmod命令,模块加载完成。注意:如果终端没有打印printk语句,在linux系统日志文件/var/log/syslog中查看。卸载:在终端输入remmod命令。打印信息与日志文件中的信息相同。4.一些理论知识模块加载函数:由宏“module_init”指定,它返回一个整数值。初始化成功则返回0,失败则返回负值作为错误码。模块卸载函数必须用宏“module_exit”指定并且没有返回值。printk的用法:1.printk(KERN_INFO"Hello,world!/n");2.printk("<6>你好,世界!/n");最后一个参数指定输出级别:分为以下八种:1.KERN_EMERG用于紧急消息,通常是崩溃前的消息。2.KERN_ALERT用于立即行动。3、KERN_CRIT严重,往往与严重的硬件或软件故障有关。4.KERN_ERR用于报告错误情况;设备驱动程序通常使用KERN_ERR来报告硬件故障。5.KERN_WARNING针对本身不会导致严重系统问题的问题情况发出的警告。6.KERN_NOTICE正常情况,但仍值得注意。该级别的一些与安全相关的情况将报告。7.KERN_INFO信息性消息。在此级别,许多驱动程序打印有关它们在启动时找到的硬件的信息。8.KERN_DEBUG用作调试消息。