开启辅助访问 切换到窄版

打印 上一主题 下一主题

用户态驱动程序开发技术之老码农学习杂记

[复制链接]
作者:汇源A原阳 
版块:
嵌入式操作系统 linux 发布时间:2020-9-13 01:03:36
13600
楼主
跳转到指定楼层
| 只看该作者 回帖奖励 |倒序浏览 |阅读模式

驱动程序

  • What?
通常驱动程序和OS内核一起运行在内核态!如Linux这种宏内核的OS更是如此!所以驱动程序一旦实现的有问题,则直接导致OS挂掉!所以Linux对于驱动程序的开发技术、规范、运行等都有严格的限制!从而导致内核态驱动程序难以编写和调试!Linux的哲学一切皆是文件!所以Linux将硬件的读写和管理抽象为统一的API, 主要形式就是对于文件的读写和管理。
传统的OS如Linux/Windows等一般都会将硬件抽象封装起来,屏蔽其细节,统一其接口!从而使之易用!一般网络应用程序需要和网卡硬件交互则调用OS提供的统一接口,如socket等,同时从用户态切换到内核态,并且需要将应用读写硬件的data在内核态和用户态之间复制! 还要经过网络协议栈逐层处理,然后到达网卡buffer, 最后网卡执行实际的data收发和中断的触发!
如果每秒并发connection比较少的情况下,一般几千个时,也就是C10K级别以下,性能还可以的!可以一旦上升到一万,十万,百万,千万级并发connection时,操作系统首先就扛不住了!所以国外大牛写了一篇文章主要观点就是:对于C10M级别下的并发connection处理,操作系统内核并不是解决方案,反而是性能瓶颈所在!
所以User Space Driver技术就被提出!思想很单纯和直接, 如果这个硬件就为你一个应用程序服务,比如网卡, 那么最好由应用程序自己在User Space 模式下直接管理和读写硬件!最好无需OS参与!当然让OS完全不参与也未必好!比如可以让OS只担任介绍人, 剩下的事你俩自己搞定,OS乐得清闲自在!应用程序与硬件直接交互,硬件中断也由应用程序自己处理,避免了无谓的上下文切换和data复制!对于网卡硬件而言, 网络应用程序可以根据应用需要只运行定制的最小化最单一的网络协议栈!最大限度避免做无用功和过多的层级!而且编写用户态驱动程序可不像编写内核态驱动程序有那么多技术限制,可以充分自由发挥利用各种技术,最大化开发利用硬件的速率潜力!好啰嗦呀,我说清楚了吧。

  • Which?
DPDK、Snabb、ixy等用户态驱动开发框架。

  • 用户态Driver实现核心方法归类

  • Mapping memory to user space(将OS内核态的内存map到user space中供App直接读写)
  • UIO drivers
  • VFIO drivers
  • User-space network drivers(将硬件的寄存器和buffer等直接map到user space态的内存区域中直接供App读写操控,相比较上面123而言最彻底撇开OS)当然它也有难点:硬件中断处理、应用重启或崩溃时硬件如何管理、没有形成统一的硬件访问接口、硬件如何共享、管理各种硬件内存buffers、运行自己的网络协议栈,如:TCP/IP 。优点那就是快!撇开了OS这个性能瓶颈后,User Space Driver可以最大化开发利用硬件速率!


  • 实现用户态Driver的核心原理
我参阅了一些资料, 妄自揣测,如有谬误,希望指教。
目标:将硬件的各种寄存器和data buffer等直接map(映射)到应用程序所在的User Space模式下的内存区域,从而实现应用程序只需读写相应的内存区域,就可以配置管理读写硬件!同时还要将硬件中断map(映射)给此应用程序,由应程序自己处理硬件中断,事件通知和dispatch等。所以如DPDK等User Space Driver 开发工具包就是帮助我们实现此目标!同时降低复杂度!所以明白了关键点后,我们就可以从容地学习各种开发工具包!因为万变不离其宗!

  • 实现难点
主要难点有二, 第一就是硬件中断如何处理,第 二就是如何将硬件,如网卡的各种寄存器和buffer映射到用户态应用程序的内存下?我着重谈一下第二点:
内核态driver和OS内核一起都运行在内核态, 人家活在真实的世界, 内存地址就是真实物理地址, 不是虚拟地址!而每个应用程序活在虚拟的世界里, 好似独占内存,可那个内存是OS给它虚拟出来的!所以是虚拟内存地址!所以需要经过MMU和OS配合才能转换成真实的内存地址,才能读写data!
问题来了, 以前硬件都归OS内核统一管理,人家是体制内的人, 现在要下海单干脱离体制, 难点在于应用程序如何为这个硬件分配指定真实的物理内存地址!应用程序有这个能力和权利吗?学过操作系统虚拟内存的朋友应该了解, OS分配给应用程序的虚拟内存实际对应到那块真实物理内存是动态变化的!完全由OS决定, OS不高兴的话也可以把你直接swap到硬盘上去!反正你手里拿着饭票,而饭在哪里完全由OS说了算!哈哈!
既然硬件,如网卡需要真实的物理内存地址才能实现映射!同时还要保证那块真实的物理内存区域一直不变,始终分配给应用程序和硬件使用!那么用户态的应用程序如何满足呢?! 不同的开发包,如DPDK等都有自己的trick(黑科技) 。
所以知道了核心原理、目标、难点后,再去学习各种User Space Driver技术开发包就不容易晕乎了!

  • OS瓶颈
传统的操作系统,诸如Unix/Linux封装了所有硬件并充当其代理,对外提供统一的API, 好处是易于使用和共享硬件!缺点就是会成为制约硬件性能的瓶颈!因为做什么都需要通过OS的转接调度!比如:负责用户态缓冲区向内核态缓冲区的复制, 反之亦然等。
OS的核心任务在于掌控CPU和内存,从而可以公平高效地调度线程运行!其他的任务可以适当地下放给应用自己搞定。
老码农水平有限,精力有限, 仓促成文,难免谬误,望诸君谅解!
老于爱聊天, 聊聊技术、观点、风景, 喜欢军事、登山、旅游!老于内涵丰富,不会局限在某一个领域,谈天说地,侃大山,人生本就不易,别太苛责别人,也别难为自己,聊一聊,笑一笑就过去了!
我是老于,希望大家支持我!
本篇文章之前我写好放到git , hub上了,今天拿出来丢丑,哈哈!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表