Linux 驱动-第一个Helloworld

参考书籍《Linux设备驱动程序》

检查Linux内核

1
2
3
4
5
6
//检查Linux内核版本
uname -r
//检查lsb(linux standard base)显示和lsb特定版本的相关信息,会显示ubuntu
lsb_release -a
//查看相关Linux version
cat /proc/version

创建第一个helloworld内核模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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){ //注意无参数内核函数参数列表要放void,否则会出现warning并报错
printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);

内核的特殊宏:
MODULE_LICENSE,告诉内核,该模块的使用采用自由许可证,如果没有该声明,内核在生成module的时候会产生warning。

安装Linux内核库

1
2
3
4
//install linux header in ubuntu
sudo apt-get install linux-headers-$(uname -r)
//install linux kernal source in ubuntu
sudo apt-get install linux-source

使用Makefile进行编译

使用make命令,会在当前路径下查找Makefile文件名的编译文件。
注意命名,一定要是Makefile不能使makefile。

1
2
3
4
5
6
7
#Makefile
obj-m += helloworld.o
KDIR=/usr/src/linux-headers-$(shell uname -r)
all:
$(MAKE) -C $(KDIR) SUBDIRS=$(pwd) modules
clean:
rm -rf *.o *.ko *.mod.* *.sysvers *.order

利用make进行编译

![make result](/images/Linux-驱动-第一个helloworld/make result.png)

安装module

dmesg显示开机信息。显示系统运行时硬件的检测或者断开连接信息。当计算机启动时,系统内核(操作系统的核心部分)将会被加载到内存中。在加载的过程中会显示很多的信息,在这些信息中我们可以看到内核检测硬件设备。

1
2
3
4
sudo insmod helloworld.ko
dmesg
sudo rmmod helloworld.ko
dmesg

insmod

Linux内核模块相关命令

  • lsmod 列出内核已加载模块。列出/proc/modules的内容
  • depmod 分析可加载模块的依赖性,生成modules.dep文件和映射文件
  • modprobe Linux内核添加删除模块
  • modinfo 显示内核模块信息
  • insmod 向内核中插入模块
  • rmmode 从内核中删除模块