用户态库

112 阅读2分钟

前言

前一段时间,主要在忙着给一个设备驱动设计并开发一个用户态库,并且在项目组里评审。期间,比较系统的学习了华为KAE加速库、Intel的QAT加速库的代码,时间很快两三周就过去了。

软件架构

用户态库,顾名思义就是在用户空间的调用的库。相对于内核模块而已,运行在用户态的,相对比较安全可控,修改调试更方便。用户态库直接对上层的应用提供接口,就比如我们经常使用的libc、sqlite之类的库。在物理形态上,用户态库包含头文件和一个静态库(或者动态库),我使用cmake编译安装到/usr/local目录下,同时创建一个pc文件到/usr/lib/pkgconfig目录下使得pkg-config可以找到这个库。

arch_userlib.png

接口设计

用户态库向应用提供基础的API,应用通过API的调用实现功能。

API分为管理API、功能API:

  • 管理API主要就是资源的申请释放接口,相关数据结构的初始化接口等
  • 功能API就是实现了具体功能的API

接口根据特定的粒度提供,也可以提供便捷的聚合接口(软件设计模式中的门面模式)。

接口实现

在具体实现上面,接口除了通过读写映射内存实现功能外,主要的功能就是参数校验,并根据硬件的特性进行特殊的适配操作。

具体到代码上的实现,就是要做到尽量的简洁高效了。例如,使用数组的形式替换冗长的Switch-case和if-else。结构的定义尽量使得数据以2的幂次大小对齐,多用位操作替换模、除等操作。

另外就是要易于使用、易于调试了。

通过cmake工具直接将编译后库和头文件安装到系统中,使得应用开发者可以很容易的集成使用。

易于调试,就需要有方便的日志工具,我就是把之前写的clog日志文件集成进去了。

另外需要考虑的就是整个流程的连贯,并考虑另外的一些功能性需求了(支持多进程、资源互斥等)。


行动,才不会被动!

欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。

博客地址: fishmwei.github.io

掘金主页: juejin.cn/user/208432…