Linux设备驱动程序(第三版)之helloWorld模块

1. 建立内核树

下载内核源码

在装载内核之前,需要在自己的文件系统中建立内核树。在命令行中输入#uname -a命令查看本机的内核版本(4.4),然后到kernel.org上下载对应的版本的内核源码。内核源码的主次设备号与本机内核版本保持一致。将源码下载到本地目录/home/wlf/linux/下。

解压

#tar -xzvf linux-4.4.176.tar.xz,解压后生成linux-4.4.176目录。

配置

进入目录linux-4.4.176,将当前系统的.config文件拷贝到本目录下:

#cp /boot/config-4.4-142-generic ./.config

编译内核

#make//(时间较长,1-2个小时,make命令实际分为两个阶段:stage1,stage2,第一个阶段生成了内核镜像文件bzImage,第二个阶段编译模块,相当于make = make bzImage + make modules).

安装模块

#make modules_install

新内核启动配置

将生成的内核文件拷贝至系统启动目录:#cp /home/wlf/linux/linux-4.4.176/arch/x86/boot/bzImage /boot/vmlinuz-4.4.176;
制作initrd镜像文件:mkinitramfs 4.4.176 -o initrd.img-4.4.176(本机为ubuntu系统,不同操作系统该命令可能不同,执行后会在/boot/目录下生成initrd.img-4.4.176文件)
升级grub:#updates grub2,该命令会自动修改grub配置文件

启动新内核

重启操作系统,在grub页面会出现新安装的内核选项,启动即可,若启动失败,还可以在grub中选择之前的内核启动。

2. 测试模块

前面都是准备工作,下面开始编写模块。

1.hello.c:

在合适的地方新建/deviceDriver/helloWolrd目录,在目录下创建文件:hello.c

#include  //初始换函数
#include  //内核头文件
#include  //模块的头文件
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);

2.Makefile:

再创建Makefile文件:

obj-m := hello.o
KVERSION = $(shell uname -r)
all:
	make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
	make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean
3.执行 #make

会在目录下生成hello.ko,这就是我们得到的模块。

4.安装模块:sudo insmod hello.ko
5.查看打印信息

#tail -f /var/log/kern.log

6.卸载模块

#sodu rmmod hello.ko
参考链接

你可能感兴趣的:(linux设备驱动程序)