文章目录
  1. 1. 最小Linux驱动
    1. 1.1. ** 必备的头文件**
    2. 1.2. 实例 hello驱动
    3. 1.3. bug

Bastion

最小Linux驱动

最小驱动模块

** 必备的头文件**

  • 头文件的位置

    类似#include的头文件,它们是在Linux源码目录下的include/linux/module.h

2. #include<linux/module.h>

所有的Linux代码必须遵循GPL协议。

1
2
MODULE_LICENSE(_license)  //添加遵循GPL协议,必须
MODULE_AUTHOR(_author) //代码作者

3. #include<linux/init.h>

包含初始化宏定义的头文件,代码中的函数module_initmodule_exit在此文件中

modlule_init(x)   入口函数
**module_exit(x)**   出口函数

实例 hello驱动

源码

first_linux_driver.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<linux/init.h>
/*包含初始化宏定义的头文件,代码中的Module_init和module_exit在此文件中*/
#include<linux/module.h>
/*包含初始化加载模块的头文件,代码中的MODULE_LICENSE在此头文件中*/

MODULE_LICENSE("Dual BSD/GPL"); //GPL:声明开源; Dual BSD:没有版本限制
MODULE_AUTHOR("takethat"); //声明作者信息


static int hello_init(void)
{

printk(KERN_EMERG "HELLO WORLD ,Enter that!\n"); //KERN_EMERG 表示紧急的信息,无论你是什么权限都可以打印出来.
return 0;
}

static void hello_exit(void)
{

printk(KERN_EMERG "So,let's exit !Good bye~\n");
}
module_init(hello_init);
/* 初始化函数 */
module_exit(hello_exit);
/* 卸载函数 */

Makefile文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

obj-m +=first_linux_driver.o
# obj-m 意思是将后面跟的东东编译成内核模块。相对应还有:
# obj-y 编译进内核
# obj-n 不编译

KDIR := /root/iTop4412_Kernel_3.0

PWD ?= $(shell pwd)

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


clean:
rm -rf *.o

执行make

1
2
3
4
5
6
7
8
9
root@ubuntu:~/mini_linux_module# make
make -C /root/iTop4412_Kernel_3.0 M=/root/mini_linux_module modules
make[1]: Entering directory `/root/iTop4412_Kernel_3.0'
CC [M] /root/mini_linux_module/first_linux_driver.o
Building modules, stage 2.
MODPOST 1 modules
CC /root/mini_linux_module/first_linux_driver.mod.o
LD [M] /root/mini_linux_module/first_linux_driver.ko
make[1]: Leaving directory `/root/iTop4412_Kernel_3.0'

在4412目标板子上加载模块

1
2
[root@iTOP-4412]# insmod first_linux_driver.ko 
[ 607.854481] HELLO WORLD ,Enter that!

查看模块

1
2
[root@iTOP-4412]# lsmod
first_linux_driver 716 0 - Live 0xbf000000

卸载modules

1
2
[root@iTOP-4412]# rmmod first_linux_driver
[ 7691.052385] So,let's exit !Good bye~

bug

无法卸载modules

  • 报错
  1. ‘/lib/modules’: No such file or directory
    1
    2
    [root@iTOP-4412]# rmmod first_linux_driver
    rmmod: can't change directory to '/lib/modules': No such file or directory

解决方法

1
mkdir /lib/modules

  1. ‘3.0.15’: No such file or directory
    解决方法
    1
    mkdir /lib/modules/3.0.15

文章目录
  1. 1. 最小Linux驱动
    1. 1.1. ** 必备的头文件**
    2. 1.2. 实例 hello驱动
    3. 1.3. bug