EAL是什么
环境抽象层(EAL)负责获得对底层资源(如硬件和内存空间)的访问。对于应用程序和其他库来说,使用这个通用接口可以不用关系具体操作系统的环境细节。rte_eal_init初始化例程负责决定如何分配操作系统的这些资源(即内存空间、设备、定时器、控制台等等)。
EAL提供的典型服务是:
- DPDK加载和启动:DPDK及其提供的应用程序是被链接为单个应用程序,因此必须由某种方式加载。
- 核心绑定/分配过程:EAL提供用于将执行单元分配给特定核心的机制以及创建其执行实例。
- 系统内存预留:EAL便于预留不同的存储区,例如,用于设备交互的物理内存区域。
- 跟踪和调试功能:日志,打印栈信息,类似于printf函数功能等。
- 实用功能:标准c中未提供的旋转锁和原子锁功能。
- CPU功能标识:确定运行时的一些CPU特性,以确定该CPU是否支持DPDK功能
- 中断处理:提供注册/取消注册的一系列接口,用于出现中断源时调用
- 报警功能:提供注册/取消注册的一系列接口,在特定时间或事件时调用
EAL涉及的专业名词
__atomic_compare_exchange_n
Built-in Function:bool__atomic_compare_exchange_n(type*ptr,type*expected,typedesired, bool weak, int success_memorder, int failure_memorder)
此内置功能是C++11用于多线程中对共享变量的原子比较和交换操作。
This compares the contents of*ptr
with the contents of*expected
. If equal, the operation is aread-modify-writeoperation that writesdesiredinto*ptr
. If they are not equal, the operation is areadand the current contents of*ptr
are written into*expected
.
If desiredis written into*ptr
then true is returned,Otherwise, false is returned.
mmap映射
mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。如下图所示:
总结来说,常规文件操作为了提高读写效率和保护磁盘,使用了页缓存机制。这样造成读文件时需要先将文件页从磁盘拷贝到页缓存中,由于页缓存处在内核空间,不能被用户进程直接寻址,所以还需要将页缓存中数据页再次拷贝到内存对应的用户空间中。这样,通过了两次数据拷贝过程,才能完成进程对文件内容的获取任务。写操作也是一样,待写入的buffer在内核空间不能直接访问,必须要先拷贝至内核空间对应的主存,再写回磁盘中(延迟写回),也是需要两次数据拷贝。
而使用mmap操作文件中,创建新的虚拟内存区域和建立文件磁盘地址和虚拟内存区域映射这两步,没有任何文件拷贝操作。而之后访问数据时发现内存中并无数据而发起的缺页异常过程,可以通过已经建立好的映射关系,只使用一次数据拷贝,就从磁盘中将数据传入内存的用户空间中,供进程使用。
总而言之,常规文件操作需要从磁盘到页缓存再到用户主存的两次数据拷贝。而mmap操控文件,只需要从磁盘到用户主存的一次数据拷贝过程。
(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂
runtime
应用程序运行过程中的环境参数
uio device
UIO出现的原因是,对于标准的硬件设备如PCI设备,USB设备等。它们被不同的内核子系统支持。这些标准的设备的驱动编写较为容易而且容易维护。很容易加入主内核源码树,但是有一些设备如I/O卡,现场总线接口或者定制的FPGA。通常这些非标准设备的驱动被实现为字符驱动。这些驱动使用了很多内核内部函数和宏。而这些内部函数和宏是变化的。这样驱动的编写者必须编写一个完全的内核驱动,而且一直维护这些代码。像这种设备如果把驱动放入Linux内核,不但增大了内核的负担而且还很少使用,所以UIO框架应运而生。
一个设备驱动的主要任务有两个:1. 存取设备的内存 2. 处理设备产生的中断
对于第一个任务,UIO 核心实现了mmap()可以处理物理内存(physical memory),虚拟内存(virtual memory)。第二个任务,如果用户空间要等待一个设备中断,它只需要简单的阻塞在对 /dev/uioX的read()操作上。当设备产生中断时,read()操作立即返回。UIO 也实现了poll()系统调用,你可以使用select()来等待中断的发生。其次,对设备的控制还可以通过/sys/class/uio下的各个文件的读写来完成。你注册的uio设备将会出现在该目录下。假如你的uio设备是uio0那么映射的设备内存文件出现/sys/class/uio/u