一、驱动具体是做什么?
我不知道。
二、驱动步骤。
1)在内核源码的目录下,编写驱动代码,生成.ko文件,并装载或卸载我们写的模块。
三、具体实现
1)驱动代码
驱动代码和我们平常写的代码不一样,他有固定的格式。
驱动代码所需的四个部分。
1)头文件
2)驱动模块装载和卸载入口的声明。
3)实现模块装载和卸载函数入口
4)GPL申明
一般的格式就是这样,这里注意的是,
实现模块的装载和卸载的入口 ,这个函数原型只能是
int 型加函数名加(void)
2)编译的规则
我们使用自己编写的Makefile进行编译。
1)定义变量ROOTFS_DIR为指定路径(我们使用nfs挂载根文件系统的路径)
2)ifeq:kernelrelease 为 0 则执行下面程序,否则执行ELSE的程序
3)定义变量为我们存放的kernel的路径
4)定义变量为我们当前路径
5)all:执=执行make就执行all里的代码:
6)make -C是编译模块 $(kernel_dir)表示我们编译内核的路径 M代表要编译的模块 变量是当前目录的模块。
7)执行make clean 则执行以下程序
8)执行make install :则把当前文件下所有的.ko文件都复制到nfs的文件里面。
9)else:make:开始执行all里面的程序,后面在不到。。。会到链接kernel的makefiel这样ifeq就不为0,则执行
ELSE程序,把工程编译成对应的.o文件。
执行make之后会生成以下文件
执行make install把hello.ko文件放到nfs文件里面。
4)装载模块。
:装载卸载都是在root超级用户才可以使用:sudo su root
在ubunt下面就提供了装载的卸载的命令
insmod + xxx.ko :
这样就实现了模块的装载。(模块装载在根文件系统?内核加载完成再把模块装载进去?)
lsmod:
查看装载的模块
rmmod + xxx :(注意不要加.ko)
卸载模块。
5)模块ko参数的传递
我们要给模块传递参数怎么办?直接在insmod XXXXXX.ko 加上要传递的名称+参数
eg: insmod parameter.ko myname=“wzf” myage=23 mysex=“man”
这就是传参的方法
可是你只是传参数,你还没有处理啊。不处理别人怎么知道你的参数是干嘛的?
每一个参数都需要一条处理函数,0644代表参数权限;
我们还需要默认参数,就是你不传参的时候他缺省状态的默认参数
我们试着打印这段话
这样,在模块装载的时候就会打印出这段话了。
5)符号导出。
我们会装载很多模块,那么在这个模块想要调用另一个模块的东西就会用到符号导出。
我们想在另一个模块用my_sub这个函数
那么只需要将My_sub这个符号导出就可以了。
用:EXPORT_SYMBOL(符号);
然后调用之前要确定被调用的模块要先装载进去才可以。