Linux驱动学习笔记3:编写第一个Linux模块

Linux内核树创建完成后,就可以编写Linux驱动模块了,编写了一个简单的hello模块,在模块加载到内核或从内核卸载时输出字符串信息。

gedit hello.c

这个模块什么也不干,只是在模块加载时打印一条信息,卸载时也打印一条信息。麻雀虽小,但五脏具全,MODULE_LICENSE()指明认证方式,现在支持的有:”GPL” “GPL v2” “GPL and additional rights” “Dual BSD/GPL” “Dual MIT/GPL” “Dual MPL/GPL” “Proprietary”,这是内核2.6里新添加的,实验发现它不是必需的。module_init()指明模块的入口,这是必需的;module_exit()指明模块的出口,这也是必需的。

编写makefile文件
gedit Makefile

其中KERNELDIR指明了引用头文件的位置,请根据具体情况修改该文件。不过有几点要说明,模块的编译需要有一个内核源码的目录结构,如果有内核源码当然更好,直接把 KERNELDIR 改为源码的路径就OK了。当然只有一个内核目录结构也就可以了,毕竟需要的只是头文件,及一些编译脚本,在Linux各发行版的/usr/src/下是有这样一个目录结构的。(切记:Makefile每个命令的第一个字符必须是制表符[tab]即KERNELDIR,make前不是四个空格空格开头而是一个[tab],不要想当然的随便认为只是个空格。否则会在编译是报出***missing seperater .stop. 的错误 )

编译模块

make

安装模块(要以root身份)

insmod hello.ko

若提示:insmod: error inserting ‘hello.ko’: -1 Operation not permitted 则说明没有以root身份执行insmod

安装模块后,会执行hello_init函数,但是并不会在终端上显示,需要使用dmesg命令查看,或者在/var/log/messages中查看

dmesg

或者

cat /var/log/messages

查看已经装载的模块

lsmod

卸载模块

rmmod hello.ko

查看输出信息

dmesg


使用 insmod ./hello.ko来加载模块,如果你遇到insmod: error inserting ‘hello.o’ :-l invalid module format这样的错误,不用惊慌,并不是你的模块有问题,而是你当前运行的内核版本与你编译链接的头文件版本不一致,所以会出现格式不对的问题。此时,你可以更换系统内核,也可以下载一个与系统版本一致的内核源码重新编译该模块。如果你没有遇到任何问题,也没有打印出任何信息,那么恭喜你,你的内核加载成功了,你可以使用lsmod命令来罗列出当前你系统加载的所有模块,相信你在列表中会找到hello的。你可能会疑惑,为什么没有如我们想像中的那样,打印出”Hello, ydea.net”?呵呵,这是因为printk并不会把打印内容打印到你当面的终端,要知道模块是运行在内核态的,而你所能面对的是用户态,内核态的打印信息需要通过log或者dmesg命令来查看,想看到打印結果,最简单的方法是敲入dmesg命令,你就可以看到你所希望看到的信息了,同时,你也可以打开 /var/log/message这个文件进行查看。

One Comment

  1. 韩国创意设计用品网站

    谢谢你的访问,如果不满意,请告诉我们。

    Reply

Leave a Reply

*