
最小Linux驱动

** 必备的头文件**
- 头文件的位置
类似#include<linux/module.h>的头文件,它们是在Linux源码目录下的include/linux/module.h
2. #include<linux/module.h>
所有的Linux代码必须遵循GPL协议。
1 2
| MODULE_LICENSE(_license) MODULE_AUTHOR(_author)
|
3. #include<linux/init.h>
包含初始化宏定义的头文件,代码中的函数module_init
和module_exit
在此文件中
modlule_init(x)
入口函数
**module_exit(x)**
出口函数
实例 hello驱动
[源码][]
[源码]: :https://github.com/vivatakethat/Embedded-System
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>
#include<linux/module.h>
MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("takethat");
static int hello_init(void) { printk(KERN_EMERG "HELLO WORLD ,Enter that!\n"); 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
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 -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] [ 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
- ‘/lib/modules’: No such file or directory
1 2
| [root@iTOP-4412] rmmod: can't change directory to '/lib/modules': No such file or directory
|
解决方法
- ‘3.0.15’: No such file or directory
解决方法1
| mkdir /lib/modules/3.0.15
|