初学Android底层驱动和初学C一样都是从helloworld模块开始
首先在目录下面新建一个hello.c的文件,文件内容如下所示:
1、源程序
// 申明头文件
#include<linux/init.h>
#include<linux/module.h>
#include<linux/kernel.h>
// 申明需要遵守的license
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void){
printk(KERN_ALERT "\n\nhello driver init\n\n");
return 0;
}
static hello_exit(void){
printk(KERN_ALERT "hello driver exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
现在回头来看,感觉这真是最基本上最简单的驱动程序了
然后我们需要做的是联合linux kernel对我们写的驱动程序进行编译,其实就像是我们使用gcc编译器来对文件来进行编译是一样的。
在同目录下生成一个Makefile的文件,文件的具体含义我已经注释得很清楚了
2、编译
# 编译hello模块 文件要从hello.o目标文件开始建立
obj-m +=hello.o
# 获取当前的目录
CURRENT_PATH :=$(shell pwd)
# 获取内核文件夹所在目录
LINUX_KERNEL :=$(shell uname -r)
# 文件的目录和版本不一致时 自行查看相应的内核版本
LINUX_KERNEL_PATH :=/usr/src/linux-headers-3.2.0-29-generic
all:
# 编译模块
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
# 卸载模块
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
使用make命令进行编译,编译之后生成hello.ko的文件,安装编译好的模块insmod hello.ko
安装好了之后使用dmesg在缓冲区查看输入到缓冲区的初始化的数据,
使用rmmod卸载模块,再使用dmesg可以看到在缓冲区中的多出了一段数据.
Dmesg | 查看内存缓冲区的内容 |
Sudo insmod hello.ko | 安装hello模块 |
Dmesg |
|
Sudo rmmod hello | 卸载hello模块 |
Sudo是升级到更高的权限上去,输入密码之后如果出现没有出现在sudor这个文件夹下面,就需要root账户来开通权限了,但是一般在公司里面这个是不会被允许的所以自己安装一个虚拟机,自己来搞吧。
上面的Makefile文件也可以直接写一个obj-m +=hello.o
的命令后面再链接内核。只是后面的
3、
主要遇到的问题
实际上make -c指令后面的M=``实际上是分号,值esc键下面的那个键,所以不要搞成引号去了。
主要遇到的是Linux内核源码树的构建的问题。一般在安装系统的时候就安装了源码的具体的源码的目录位置在这个地方,cd /usr/src下面使用ls命令就可以查看到源码了