hello world 驱动程序编写
操作系统课程设计选题 驱动程序的编写和安装。
经过一天多的努力,终于把我的第一个驱动程序模块成功编写并实现插入内核和移除,在这里把过程记录下来方便以后查看,也给其他为之困扰的朋友一个建议。
环境: windows 7 下 VMware 9.0 中装 Ubuntu12.04 内核版本为3.5.0-32-generic
搭建驱动开发环境:
相应版本的 gcc、gdb、make 。 内核源代码树。在Ubuntu 下内核源代码一般存放在 /usr/src/ 下。 我的Ubuntu /usr/src/下有两个文件夹 linux-headers-3.5.0-23 , linux-header-3.5.0-23-general 。从名字看这两个文件夹中的东西应该不是系统全部的源代码,打开看里面的东西也很少,一开始我以为这不是系统的全部源代码,没法使用。所以就到www.kernel.org上下载了linux-3.5的内核源代码,(为什么下载Linux3.5 而不是 3.5.0 ,因为网站上没找到)并编译配置。
编写hello world 模块
#include "linux/init.h"
#include "linux/module.h"
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void){
printk(KERN_ALERT "hello , world !");
return 0;
}
static void hello_exit(void){
printk(KERN_ALERT "goodbye , cruel world \n");
}
module_init(hello_init);
module_exit(hello_exit);
然后写GNU扩展的Makefile,为了简单Makefile文件中只写了一行
obj-m := hello.o
编译:
在命令行下:
make -C /usr/src/linux-header-3.5.0-23-general M=/root/Desktop modules
各个参数的意义 : -C 后面的是与当前运行的内核版本相同的内核源代码树目录。 M后面的是内核代码和Makefile所在的文件夹 。 modules 表示编译的目标文件,是必须的。 编译完成后会在当前目录下生成一个hello.ko 模块文件。
插入到内核模块:
insmod hello.ko (执行这一步时系统会输出上面定义的hello_init()函数中的内容)
移除模块:
rmmod hello.ko(执行这一条语句时系统会输出上面定义的hello_exit()函数中的内容)
可能出现的错误:
1. printk(KERN_ALERT "goodbye , cruel world \n");
注意这一串大写字符代表的是优先权的设定,后面不能有逗号。否者会出现 参数过多的错误。
2. -C 后面的参数所指定的目录一定是与当前运行系统内核版本相同的内核源代码树所在目录。我一开始用的是我下载的Linux-3.5 的内核源代码树,结果卡了老半天都是 insmod: error inserting 'hello.ko': -1 Invalid module format。的错误。最后我把这个目录改成 /usr/src/linux-header-3.5.0-23-general 就行了。这个目录是安装系统时就有的。
下面截个图秀一下:
有很多的东西我也没搞明白,正在努力学习中~~~~~