Yuhang Zheng

第一节、Linux第一个驱动Helloworld

N 人看过

本节用于书写我们的在Linux上的第一个驱动Helloworld



驱动分为四个部分:

  1. 头文件
  2. 驱动模块的入口和出口
  3. 声明信息
  4. 功能实现

第一步,包含头文件

1
2
#include <linux/init.h>         //包含宏定义的头文件,包含了module_init,module_exit等
#include <linux/module.h> //包含初始化加载模块的头文件

第二步,驱动模块的入口和出口

1
2
module_init();
module_exit();

第三步,声明模块拥有开源许可证

1
MODULE_LICENSE("GPL")

第四步,功能实现

1
2
3
4
5
6
7
8
9
10
11
static int hello_init(void)			//函数返回类型是int
{
printk("hello world\n");
return 0;
}

static void hello_exit(void) //函数返回类型是void
{
printk("byb bye\n");
}

注意:内核打印函数不能用printf,因为内核没有办法使用C语言库。


第一步,将模块编译成内核模块的Makefile

1
2
3
4
5
6
7
obj-m += helloworld.o

KDIR:=/home/zyh/workspace/SOURCE/OK10xx-linux-kernel/
PWD?=$(shell pwd)

all:
make -C $(KDIR) M=$(PWD) modules

第二步,编译驱动

编译驱动之前注意的问题:

  1. 内核源码一定要先编译通过
  2. 编译驱动模块用的内核源码一定要和实际使用的镜像是同一套的
  3. 设置好开发环境,export ARCH和CROSS_COMPILE

加载模块驱动:insmod

查看模块加载列表:lsmod

卸载模块驱动:rmmod