前言
前一段时间,主要在忙着给一个设备驱动设计并开发一个用户态库,并且在项目组里评审。期间,比较系统的学习了华为KAE加速库、Intel的QAT加速库的代码,时间很快两三周就过去了。
软件架构
用户态库,顾名思义就是在用户空间的调用的库。相对于内核模块而已,运行在用户态的,相对比较安全可控,修改调试更方便。用户态库直接对上层的应用提供接口,就比如我们经常使用的libc、sqlite之类的库。在物理形态上,用户态库包含头文件和一个静态库(或者动态库),我使用cmake编译安装到/usr/local目录下,同时创建一个pc文件到/usr/lib/pkgconfig目录下使得pkg-config可以找到这个库。
接口设计
用户态库向应用提供基础的API,应用通过API的调用实现功能。
API分为管理API、功能API:
- 管理API主要就是资源的申请释放接口,相关数据结构的初始化接口等
- 功能API就是实现了具体功能的API
接口根据特定的粒度提供,也可以提供便捷的聚合接口(软件设计模式中的门面模式)。
接口实现
在具体实现上面,接口除了通过读写映射内存实现功能外,主要的功能就是参数校验,并根据硬件的特性进行特殊的适配操作。
具体到代码上的实现,就是要做到尽量的简洁高效了。例如,使用数组的形式替换冗长的Switch-case和if-else。结构的定义尽量使得数据以2的幂次大小对齐,多用位操作替换模、除等操作。
另外就是要易于使用、易于调试了。
通过cmake工具直接将编译后库和头文件安装到系统中,使得应用开发者可以很容易的集成使用。
易于调试,就需要有方便的日志工具,我就是把之前写的clog日志文件集成进去了。
另外需要考虑的就是整个流程的连贯,并考虑另外的一些功能性需求了(支持多进程、资源互斥等)。
更多
除了工作任务外,领导还安排了两个新人让我带。都是不省油的灯啊, 一个刚毕业一年多的A,一个工作了4年的B。前面他们两个在另外的同事指导下,结果没有什么产出,领导感觉他们的能力没有得到发挥,然后就换给我带了。下面分别聊聊这两人的情况。
刚工作一年的A呢,属于要躺平的类型了,每天来的挺早的,下班也很准点。是对技术没有什么追求的一个人,就只想做和尚敲钟的。前面在同事的指导下,主要任务就是学习。学习完了呢,没有任务就在摸鱼了。问他业余有没有看些技术书的,答曰:“上班都没事干,回家更不会去搞技术了,有任务了再学习吧,反正技术都够用,需要的时候再学啊”。然而,在做工作汇报(就是新人在组内讲讲自己做了什么工作)的时候,讲的也不好,就是抓不到重点,不懂得总结提炼,光贴了一堆代码在那儿讲。可爱的是,遇到问题竟然还说不知道那些是问题。同事让其验证个功能,然后代码在某个版本的内核系统上面编译不了了,就不去解决了,没有去找到具体的解决方案,然后就放那儿不管了,验证的活就卡在那了。不是一个死磕技术的主。
工作四年的B呢,前面也安排学习一个项目的代码和材料。然后,领导让他设计一个方案,后面拖拖拉拉的难产了,做工作汇报时,很多内容也不能讲个所以然来。前面带的同事觉得他技术是不行的,我现在是深有同感了。
苦逼的事情就来了,我安排A去看个小模块,后面找他了解进展的时候很有自信的都学完了,结果问了几个问题都答不上来,结果说是只看了一个文件,然后就去问那个文件的内容,又是很多不知道的,只知道流程,细节都没深入。再安排A去给一个测试程序加个选项,然后换个接口测试下功能,卡了一两天硬是没进展。
B呢,更糟糕,让他看数据手册验证一个功能,脑袋就是不开窍,没看明白是什么东西。我就耐心给他的画了图,讲了一遍,说是理解了。过了两天去看,写出来的代码还是错误的,完全不搭边。更可怕的是,我发现他连简单的C语言的变量和指针都搞不清楚。给一个变量赋值之后,又从另外的地方拷贝内存到这个变量中去,哎,不知道他写的什么东西。代码不符合基础的编码规范,还在头文件里面放变量定义,放一些static的函数声明,真的是毁了我的三观。不知道他这工作四年是怎么混过来的。后面我自己写了一个函数,让他照着改改其他函数,结果还是写的一塌糊涂,真的是基础不行啊,没救了。
跟领导反应了这些问题,哎,让我把他们当应届生看吧。但是,他们的水平真的还不如应届生啊,A的态度也不如应届生!
没办法了,毕竟是领导招的人嘛,总不会裁掉打自己脸吧~
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。
博客地址: https://fishmwei.github.io
掘金主页: https://juejin.cn/user/2084329776486919