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,编译无错误。
首先:
#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,编译无错误。
相关文章推荐
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响(一)
- .Linux设备驱动程序学习(0)——设备驱动介绍& Hello, world!模块 内核参数传递
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响 -zt
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响(二)
- Linux2.6内核驱动移植(与2.4模块的区别)
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响
- Linux 2.6 内核驱动模块的编译和加载
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响
- 从2.4 到2.6:Linux 内核可装载模块机制的改变对设备驱动的影响
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响
- Linux2.6内核驱动hello.c
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响
- 一个最简单的Linux 2.6内核驱动模块
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响