您的位置:首页 > 运维架构 > Linux

Linux 2.6内核驱动之hello模块

2012-12-02 21:35 267 查看
终于开始在钟爱的Linux上学习写驱动程序了。本来以为写一个hello模块是异常简单的事情,结果折腾了几天才编译通过。首先为了测试安装了虚拟机(内核程序是很危险滴,我可不想让自己的爱本频繁崩溃),装fedora17(fedora18的live版在虚拟机上始终跑不起来),来回来去几次也装不上VirtualBox的Guest Additions。看了log,发现问题出在Guest Additions的源代码中,貌似当前版本的Guest Additions跟fedora17的内核不甚兼容(fedora更新果然快呀~,次乃个人看法,如有高手安装成功请赐教,吾当不甚感激)。于是乎决定换个稳定些的分版,想到手里有Ubuntu12,果断换之。然后建立内核开发环境。

首先:

#sudo apt-get update

其次:

#sudo apt-get install kernel-package libncurses5-dev build-essential linux-headers-$(uname -r)

如果没有“apt-get update”则容易提示找不到“kernel-package”等。

然后安装Guest Additions还是失败,看了下报错,问题变成了“The headers for the current running kernel were not found”。查下资料,需要安装dkms,于是:

# sudo apt-get install dkms

再安装。。。等啊等。。。等啊等。。。等了好长时间,通过了,全部是“Done”。关闭虚拟机,设置共享文件夹,"Name"为hostshare,启动后建立文件夹为挂载共享文件夹做准备:

#sudo mkdir /mnt/myshare

这里建立的文件夹最好不要与共享文件夹的“Name”项相同,否则容易挂载失败(我没尝试,不过好多人这么说,有兴趣的朋友可以尝试下)。

然后挂载共享文件夹:

#sudo mount -t vboxsf hostshare /mnt/myshare

成功。

之后是示例代码了,hello.c内容如下

#include <linux/module.h> // 所有模块都需要的头文件

#include <linux/sched.h>

#include <linux/kernel.h>

#include <linux/init.h> // init和exit相关宏

MODULE_LICENSE("GPL");

int text_init(void)

{

printk("<0>Hello World!"); // 内核打印输出函数,级别为0,printk()函数共有0~7之间的8个级别

return 0;

}

void text_cleanup(void)

{

printk("<0>Goodbye World!");

}

module_init(text_init); // 注册加载时执行的函数

module_exit(text_cleanup); // 注册卸载时执行的函数

这段程序网上资料好多,所以不进行太详细的说明了。关键是Makefile,还是直接上代码:

obj-m := hello.o

PWD := $(shell pwd)

KDIR := /lib/modules/$(shell uname -r)/build

all:

make -C $(KDIR) M=$(PWD)

clean:

make -C $(KDIR) M=$(PWD) clean

我参考的资料中说“首先将目录改变到-C选项指定的位置(即内核源代码目录,其中有内核的顶层makefile文件),M=选项让该makefile在构造modules目标之前返回到当前目录”(hello.c和Makefile均来自于:http://blog.csdn.net/pingxing2534/article/details/7277536#,感谢这位大侠)。以上Makefile对原文资料中的代码进行了简单修改。而原文中所指的“内核源代码目录”中不一定是内核源代码,只要你的/usr/src/目录下有对应的内核头文件也是可以开发第三方驱动的(据说源码中有这样的说明,参考:http://www.linuxidc.com/Linux/2010-07/27223.htm)。

之后直接make,编译无错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐