Ubuntu 16.04下Linux驱动编写第一步
源码环境的搭建
-
- Install源码
>sudo apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
linux-source-4.4.0 - Linux kernel source for version 4.4.0 with Ubuntu patches
因差异这个略有不同,选择linux-source-4.4.0即可。按照你显示的版本号而定。
>sudo apt-get install linux-source-4.4.0
安装完成后,在/usr/src/ 目录下会出现两个新文件,一个为linux-source-4.4.0文件夹,另外一个为 linux-source-4.4.0.tar.bz2。
>tar jxvf linux-source-4.4.0.tar.bz2 -C /home/yourdir/Kernel
解压到你的文件夹下 或者解压到当前目录下也行。
在解压出来的的linux-source-4.4.0目录下执行配置内核的工作
>sudo make oldconfig //配置内核
>sudo make //编译内核 此处时间花费较长 若出现类似openssl/opensslv.h No such file or directory 这样的 错误则表明需要安装 libssl-dev 执行sudo apt-get install libssl-dev //此处将占用13GB的空间。使用虚拟机的最好把硬盘整大点!
>sudo make modules //编译模块
>sudo make modules_install //安装模块
第一个.c文件与Makefile文件
- 在自己工作目录下新建一个文件夹并在此下建立hello.c与Makefile文件
- Makefile文件可以直接用vim Makefile建立,注意M为大写。
hello.c代码
1 #include <linux/init.h> 2 #include <linux/module.h> 3 MODULE_LICENSE("Dual BSD/GPL"); 4 static int hello_init(void) 5 { 6 printk(KERN_ALERT "Hello, world\n"); 7 return 0; 8 } 9 static void hello_exit(void) 10 { 11 printk(KERN_ALERT "Goodbye, cruel world\n"); 12 } 13 14 module_init(hello_init); 15 module_exit(hello_exit);
Makefile文件。//注意空格与Tab
obj-m :=hello.o hellomodule-objs :=module #可以把hello这个改成你的命名 KERNELDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
保存后执行 >sudo make
即可生成hello.ko文件。既可以利用此文件来装载到内核中去了。
装载命令 >sudo insmod ./hello.ko
装载完成后可以使用 > lsmod //查看当前安装的驱动模块。
> cat /var/log/syslog 中可以直接看到输出的 hello 与Goodbye // 或者使用 >dmesg | tail 此条命令更简洁
卸载命令 > sudo rmmod ./hello.ko
第一次配置环境及编写Makefile的过程中遇到了很多坑,关于驱动的进一步学习还需要参考相关的Linxu驱动开发的相关书籍及教程。
关于文中的hello.c以及Makefile文件中的各种内容为什么这样子写,相信你查看相关的资料之后即可了然于胸了。