前言
本周突然在聊天群里被合作方@了,需要我们提供一般适配linux6.6内核版本的驱动,客户是上帝,马上响应~
驱动适配
第一步就是从官网下个6.6版本的内核,然后在机器上编译替换内核,这个比较简单~;
然后就是基于6.6内核的build路径,修改驱动Makefile后编译,后面就是遇水搭桥了,有问题解决问题。
最后,就基于修改后的代码跑一下测试用例。最终打包发布版本。
主要问题
主要解决了4个问题,都是内核接口变更导致的。
Class_create 参数变化
在linux6.4.0之后,Class_create删除了module参数,编译时报错如下:
1 | In file included from ./include/linux/device.h:31, |
使用LINUX_VERSION_CODE判断版本大小,作一下适配就好了。
非对称结构struct akcipher_alg成员变更
编译时报错信息如下:
1 | /root/xxx/rsa.c:1234:3: 错误:‘struct akcipher_alg’没有名为‘reqsize’的成员 |
reqsize成员挪动了位置,需要在算法init函数中set_reqsize。
内存映射结构体struct vm_area_struct成员属性变更
编译时报错信息如下:
1 | 错误:向只读成员‘vm_flags’赋值 |
不允许设置vma->vm_flags了,直接注释掉。
注册算法的时候,直接挂死了
这个主要是在计算结束时,不能直接调用req->base.complete了,complete的参数变更了,需要使用相应的接口替换 如aead_request_complete。
注册xts模式时,额外测试失败了
这个属于与内核软算法不一致的处理,导致extra tests返回失败。参考xts模式处理,当req->cryptlen < 16时返回值与默认的不一致, 改为-EINVAL
解密错误时 返回-EINVAL。
更多
刚开始接到需求的时候,以为跟之前的5.x版本一样,只需要稍微编译一下就可以解决了,没料到6.x一开始编译就有几个问题,以为要花费一周以上来修改了。最终3天就搞定了,进度还是提前了。
加上前面对checkpatch的格式修订一起,这回发布的版本改动还是蛮大的。总之,开发遇到问题解决问题就是了,就怕那些遇到问题就卡住不动了的。
四五月这两个月的业余时间都花在软考系统分析师上面了,平均每天下班都花1~2个小时学习,越是临近考试发现准备的越不充分了,硬着头皮去考了,感觉有点悬啊,坐等6月底或者七月初的成绩,不行就要备战下半年了。6月这段时间就补一下工作用得到的基础吧!
今年软考又改革了,系统分析师和架构师可以一年考两次,说实话,虽然这个学习有点儿纯粹为了应试,但还是可以系统的学到许多知识,包括计算机综合知识、数据库、软件工程、需求工程及新技术等各个方面。
活到老学到老,加油吧,先提升自己,摆脱焦虑!
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。
博客地址: https://fishmwei.github.io
掘金主页: https://juejin.cn/user/2084329776486919