作为驱动的开始,我们来看一看:
|
app(c)
|
驱动模块
|
入口函数 |
main
|
加载函数
|
库
|
应用层的库(usr/lib)
|
内核API |
运行空间 |
用户空间(高3G的内存)
|
内核空间(低1G)
|
释放资源
|
要求释放
|
必须释放
|
在linux端的命令如下:
添加一个Makefile文件,文件内容如下:
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
#KERNELDIR ?= ~/wor_lip/linux-3.4.112
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions modules* Module*
.PHONY: modules modules_install clean
else
obj-m := hello.o
endif
KERNELDIR :内核所在路径,如果想要模块在开发板上运行,需要添加制作开发板上的linux内核源码所在路径,就是上边注释掉的部分,如果是要在自己的ubuntu中运行,未注释掉的部分就是。
obj-m:你要生成的xxx.ko ,就要改成 xxx.o
默认模式
自定义模式
基本数据类型包括 bool/invbool/short/int/long/uint/ushort/ulong
module_param(mystring, bool/invbool/short/int/long/uint/ushort/ulong, 0000); 声明可以从命令行取得参数,括号中的参数一次表示:变量名,变量类型,权限
0000 的介绍:
数字的大小表示的是 读写权限 , r w x,分别代表可读,可写,可执行,最大数字是 6,模块没有可执行的权限
module_param(mystring, charp, 0000);
对基本数据传参,在insmod的时候,变量名=数据,多个参数空格隔开
对数组传参,在insmod的时候,数组名=数组成员1的数据,数组成员2的参数。用的是逗号隔开