驱动(一)

一、驱动具体是做什么?
我不知道。

二、驱动步骤。
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(符号);
然后调用之前要确定被调用的模块要先装载进去才可以。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值