一、环境及版本
主机:vmware虚拟 ubuntu 14.04 64bit
内核版本:3.16.0-30-generic
二、思路介绍
linux下驱动以模块的方式挂载,进而让程序调用。本文也就是一步步生成这个被挂载的模块。此模块以.ko结尾。
三、实现步骤
a、构造内核源码树
先得查看本机的内核版本号,然后下载对应版本的源代码,构造源码树,否则模块无法挂载
1.查看本机版本
$uname -r
2.下载相应内核源码包
$sudo apt-get install linux-source-3.13.0
上图左侧两个为系统原有文件夹,*.tar.bz2为下载后的源码包
3.解压源码包
$tar jxvf linux-source-3.13.0.tar.bz2
解压完成后将生成上图中
/usr/src/linux-source-3.13.0目录
4.编译配置
$sudo make oldconfig
中间选项随意,反正本次hello world都是用不上的
5.编译生成
$ sudo make bzImage
执行后,应有文件
6.生成module【可不执行】
$ sudo make modules
7. 生成module_install【可不执行】
$ sudo make modules_install
至此源码树构建完成
b、编写驱动文件
8.hello.c
可以在本用户目录下创建文件,位置无关
$ vim hello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT"Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
c、编写Makefile
9.Makefile
在与hello.c同目录下创建Makefile
$ vim Makefile
obj-m := hello.o
#KERNELDIR := /lib/modules/3.13.11-ckt36/build
KERNELDIR := /lib/modules/3.16.0-30-generic/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
d、测试
10.生成模块
在hello.c目录下执行
$ sudo make
同目录下应有如下文件
11.挂载模块
$ sudo insmod ./hello.ko
无返回信息输出则说明正常
12.查看模块
$ lsmod |grep hello
$ cat /var/log/syslog | grep world
将返回相关结果
13.卸载模块
$ sudo rmmod hello
此时再使用lsmod | grep hello将不再有返回
日志中将记录hello模块退出信息
到此hello world全程完成
四、参考文章
基于linux2.6【http://blog.csdn.net/xiao229404041/article/details/6956099】
基于linux3.13 【http://blog.csdn.net/damotiansheng/article/details/44463193】
相关原理介绍【http://blog.chinaunix.net/uid-26833883-id-4366882.html】
五、相关书籍
1.【Linux设备驱动开发详解-宋宝华】
2.【跟我一起写Makefile】
3.【Linux1.0核心游记】