DPDK源码分析之rte_eal_init

news2024/11/27 22:35:16

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*ptrwith 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*ptrare written into*expected.

If desiredis written into*ptrthen 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/uio0/maps/mapX,对该文件的读写就是对设备内存的读写。

内核操作:1. - 使能设备 2. - 申请资源 3. - 读取并记录配置信息 4. - 注册uio设备// uio_register_device()

用户态操作:5. 判断是否产生了硬件中断 6. 响应硬件中断

Sysfs

Sysfs是Linux 2.6所提供的一种虚拟文件系统。这个文件系统不仅可以把设备(devices)和驱动程序(drivers)的信息从内核输出到用户空间,也可以用来对设备和驱动程序做设置。

epoll

在高并发场景,随epoll使用了内核文件级别的回调机制O(1)。它有两种触发机制,水平触发(level-triggeredsocke),即t接收缓冲区不为空 有数据可读,读事件一直触发,和边沿触发(edge-triggered),即socket的接收缓冲区状态变化时触发读事件,即空的接收缓冲区刚接收到数据时触发读事件,边沿触发仅触发一次,水平触发会一直触发。

具体原理如下:

调用epoll_create时,内核除了帮我们在epoll文件系统里建了个file结点,在内核cache里建了个 红黑树 用于存储以后epoll_ctl传来的socket外,还会再建立一个list链表,用于存储准备就绪的事件.

epoll_wait调用时,仅仅观察这个list链表里有没有数据即可。有数据就返回,没有数据就sleep,等到timeout时间到后即使链表没数据也返回。所以,epoll_wait非常高效。而且,通常情况下即使我们要监控百万计的句柄,大多一次也只返回很少量的准备就绪句柄而已,所以,epoll_wait仅需要从内核态copy少量的句柄到用户态而已.

当我们执行epoll_ctl时,除了把socket放到epoll文件系统里file对象对应的红黑树上之外,还会给内核中断处理程序注册一个回调函数,告诉内核,如果这个句柄的中断到了,就把它放到准备就绪list链表里。所以,当一个socket上有数据到了,内核在把网卡上的数据copy到内核中后就来把socket插入到准备就绪链表里了

创建pipe

pipe用于实现进程间的通信,工作原理如下:1)父进程创建管道,得到两个⽂件描述符指向管道的两端2)父进程fork出子进程,⼦进程也有两个⽂件描述符指向同⼀管道。3)父进程关闭fd[0],子进程关闭fd[1],即⽗进程关闭管道读端,⼦进程关闭管道写端(因为管道只支持单向通信,父进程关闭fd[1]子进程关闭fd[0]也可以)。

⽗进程可以往管道⾥写,⼦进程可以从管道⾥读,管道是⽤环形队列实现的,数据从写端流⼊从读端流出,这样就实现了进程间通信。

管道的特点如下:1.管道只允许具有血缘关系的进程间通信,如父子进程间的通信。 2.管道只允许单向通信。 3.管道内部保证同步机制,从而保证访问数据的一致性。 4.面向字节流 5.管道随进程,进程在管道在,进程消失管道对应的端口也关闭,两个进程都消失管道也消失。

bus设备

总线(bus)是linux发展过程中抽象出来的一种设备模型,为了统一管理所有的设备,内核中每个设备都会被挂载在总线上,这个bus可以是对应硬件的bus(i2c bus、spi bus)、可以是虚拟bus(platform bus)。

驱动程序对应driver、需要的具体型号的硬件资源对应device,将其挂在bus上。将driver注册到bus上,当用户需要使用AT24C01时,以AT24C01的参数构建一个对应device,注册到bus中,bus的match函数匹配上之后,调用probe函数,即可完成AT24C01的初始化,完成在用户空间的文件接口注册。

以此类推,添加所有的AT24CXX设备都可以以这样的形式实现,只需要构建一份device,而不用为每个设备重写一份驱动,提高了复用性,节省了内存空间。

linux将设备挂在总线上,对应设备的注册和匹配流程由总线进行管理,在linux内核中,每一个bus,都由struct bus_type来描述:

struct bus_type {
    const char	*name;
    const char	*dev_name;
    struct device *dev_root;
    ...
    int (*match)(struct device *dev, struct device_driver *drv);
    int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
    int (*probe)(struct device *dev);
    int (*remove)(struct device *dev);
    void (*shutdown)(struct device *dev);
    struct subsys_private *p;
    ...
};
name : 该bus的名字,这个名字是这个bus在sysfs文件系统中的体现,对应/sys/bus/$name.
dev_name : 这个dev_name并不对应bus的名称,而是对应bus所包含的struct device的名字,即对应dev_root。
dev_root:bus对应的device结构,每个设备都需要对应一个相应的struct device.
match:bus的device链表和driver链表进行匹配的实际执行回调函数,每当有device或者driver添加到bus中时,调用match函数,为device(driver)寻找匹配的driver(device)。
uevent:bus时间回调函数,当属于这个bus的设备发生添加、删除、修改等行为时,都将出发uvent事件。
probe:当device和driver经由match匹配成功时,将会调用总线的probe函数实现具体driver的初始化。事实上每个driver也会提供相应的probe函数,先调用总线的probe函数,在总线probe函数中调用driver的probe函数。
remove:移除挂载在设备上的driver,bus上的driver部分也会提供remove函数,在执行移除时,先调用driver的remove,然后再调用bus的remove以清除资源。
  • --iova-mode=<pa|va>

DPDK是一个用户态应用框架,使用DPDK的软件可以像其他软件一样使用常规虚拟地址。但除此之外,DPDK还提供了用户态PMD和一组API,以实现完全以用户态执行IO操作

作为PA的IOVA模式下,分配到整个DPDK存储区的IOVA地址都是实际的物理地址,而虚拟内存的分配与物理内存的分配相匹配。该模式的一大优点就是它很简单:它适用于所有硬件(也就是说,不需要IOMMU),并且它适用于内核空间(将真实物理地址转换为内核空间地址的开销是微不足道的)。

作为VA的IOVA模式不需遵循底层物理内存的分布。而是重新分配物理内存,与虚拟内存的分配匹配,即使底层物理内存可能不存在,内存看上去还是IOVA连续的。由于重新映射,IOVA空间片段化的问题就变得无关紧要。不管物理内存被分段得多么严重,它总能被重新映射为IOVA-连续的大块内存。

soket_id

socket_id存放着物理cpu号

TSC frequency

Linux中有3种timer:

1、Real Time Clock(RTC)

2、Programmalbe Interval Timer(PIT)

3、Time Stamp Counter.(TSC)

其中RTC是位于CMOS中的,其频率范围是2HZ--8192HZ.

PIT主要由8254时钟芯片实现的

TSC的主体是位于CPU里面的一个64位的TSC寄存器。每个CPU时钟周期其值加一。

numa socket

socket是一个物理上的概念,指的是主板上的cpu插槽。node是一个逻辑上的概念,对应于socket。
numa架构下,访问本地内存的速度要快于访问远端内存的速度,访问速度与node的距离有关系。

node 0到本地内存的距离为10,到node 1的内存距离为20;node1到本地内存的距离为10,到node 0的内存距离为20。

EAL源码框图

Reference

3. Environment Abstraction Layer — Data Plane Development Kit 21.11.0 documentation (dpdk.org)

DPDK初始化 - 坚持,每天进步一点点 - 博客园 (cnblogs.com)

(21条消息) 深度分析mmap:是什么 为什么 怎么用 性能总结_精诚所至-CSDN博客_mmap

Using the GNU Compiler Collection (GCC): __atomic Builtins

Linux 设备驱动之 UIO 机制(基本概念)

(21条消息) Linux 设备驱动之 UIO 机制(测试 UIO 机制)_ZP1015-CSDN博客_linux uio

深入理解 Epoll - 知乎 (zhihu.com)

(21条消息) 进程间的通信方式——pipe(管道)_sky_Mata的博客-CSDN博客_管道通信

linux设备驱动程序--bus - 牧野星辰 - 博客园 (cnblogs.com)

(21条消息) DPDK内存篇(二): 深入学习 IOVA_老马农的博客-CSDN博客

(23条消息) numa下socket node cpu thread的关系_冰糖银耳盅的博客-CSDN博客

(23条消息) DPDK18.11.11内存初始化流程总结_aixueai的博客-CSDN博客

(23条消息) intel dpdk rte_eal_cpu_init() 函数介绍_编码人生——朝阳_tony-CSDN博客

(23条消息) DPDK跟踪库:trace library_RToax-CSDN博客

DPDK中断机制简析 - MerlinJ - 博客园 (cnblogs.com)

https://blog.csdn.net/xiajun07061225/article/details/9250579

DPDK的进程间通信机制 – 孙希栋的博客 (sunxidong.com)

(24条消息) DPDK学习记录9 - 内存初始化2之rte_eal_memzone_init_jeawayfox的博客-CSDN博客

原文链接:https://zhuanlan.zhihu.com/p/439119807  原文作者:于顾而言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/88422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【IVIF:搜索架构】

Searching a Hierarchically Aggregated Fusion Architecture for Fast Multi-Modality Image Fusion &#xff08;搜索用于快速多模态图像融合的分层聚合融合架构&#xff09; 现有的基于CNN的方法使主要点在于设计各种体系结构&#xff0c;以端到端的方式实现这些任务。但是…

JSP ssh美食娱乐分享网站系统myeclipse开发oracle数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh美食娱乐分享网站系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采 用B/S模式开发。开发环境为TOMCA…

学习二叉树必须要了解的各种遍历方式及节点统计

哈喽&#xff0c;大家好&#xff0c;我是小林。今天给大家分享一下对二叉树的一些常规操作。 愿我们都能保持一颗向上的心。 目录一、前序遍历二、中序遍历三、后序遍历四、 统计节点个数五、统计叶子节点个数六、第K层的节点个数七、二叉树的深度八、查找值为x的节点九、层序遍…

TensorFlow TFRecords简介

TensorFlow TFRecords简介 这篇博客将介绍TensorFlow的TFRecords&#xff0c;提供有关TFRecords的所有信息的一应俱全的介绍。从如何构建基本TFRecords到用于训练 SRGAN 和 ESRGAN 模型的高级TFRecords的所有内容。包括什么是TFRecords&#xff0c;如何序列化&#xff0c;反序…

SQL 语句练习03

目录 一、建表 二、插入数据 三、查询 一、建表 这里先建好我们下面查询需要的表&#xff0c;方便后续查询。 建立如下学生表(命名格式“姓名拼音_三位学号_week5s”&#xff0c; 如LBJ_023_week5s&#xff09;create table LYL_116_week5s(SNO varchar(4) primary key,SNA…

【Kubernetes】DashBoard部署

kubernetes&#xff0c;是一个全新的基于容器技术的分布式架构领先方案&#xff0c;是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本&#xff0c;于2014年9月发布第一个版本&#xff0c;2015年7月发布第一个正式版本。 kubernetes的本质是一组服务器集群&#xff0…

数字孪生智慧水务建设综述

随着新时期治水方针的逐步落实&#xff0c;水利现代化、智能化建设已全面开启&#xff0c;数字孪生等新技术的成熟&#xff0c;也为智慧水务体系的搭建提供了技术保障&#xff0c;新时代治水新思路正逐步得到落实。本文将重点对智慧水务的内涵及建设内容进行解读&#xff0c;力…

2022年航空与物流行业研究报告

第一章 行业概况 航空与物流行业是指以各种航空飞行器为运输工具&#xff0c;以空中运输的方式运载人员或货物的企业。航空公司是以各种航空飞行器为运输工具为乘客和货物提供民用航空服务的企业。航空公司使用的飞行器可以是他们自己拥有的&#xff0c;也可以是租来的&#x…

物联网通信技术原理-作业汇总(更新ing)

第一章 第二章 第三章 第四章 第五章 1. 移动通信中典型的多址接入方式有哪些&#xff1f;简要说明其工作原理2. 分集技术的基本原理是什么&#xff1f;简要说明空间、频率和时间分集、合并的异同。 1&#xff09;分集技术的基本原理 通过多个信道&#xff08;时间、频率或…

25.访客功能

访客功能 一、需求分析 用户在浏览我的主页时&#xff0c;需要记录访客数据&#xff0c;访客在一天内每个用户只记录一次。 首页展示最新5条访客记录 我的模块&#xff0c;分页展示所有的访客记录 二、数据库表 visitors&#xff08;访客记录表&#xff09; { “_id”: …

尚医通 (三十五) --------- 预约下单

目录一、预约下单前端1. 封装 api 请求2. 页面修改二、后端逻辑1. 需求分析2. 搭建 service-order 模块3. 添加订单基础类4. 封装 Feign 调用获取就诊人接口5. 封装 Feign 调用获取排班下单信息接口6. 实现下单接口7. 预约成功后处理逻辑① rabbit-util 模块封装② 封装短信接口…

C++ Reference: Standard C++ Library reference: Containers: map: map: cend

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/cend/ 公有成员函数 <map> std::map::cend const_iterator cend() const noexcept;返回指向结束的const_iterator 返回一个指向容器结束后元素的const_iterator。 const_iterator是指向const内容的it…

正弦交流电物理量表征

前言 这一讲主要来表征正弦交流电的物理量 文章目录前言一、周期和频率二、最大值、有效值和平均值一、周期和频率 周期&#xff1a;正弦交流电每重复变化1次所需要的时间称为周期&#xff0c;用符号T表示&#xff0c;单位是秒&#xff08;s&#xff09;。 频率&#xff1a;正…

web前端期末大作业 绿色环境保护(4个页面) HTML5网站模板农业展示网站 html5网页制作代码 html5网页设计作业代码 html制作网页案例代码

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

体育馆场地预约管理系统/球馆管理系统

摘 要 随着体育馆规模的不断扩大&#xff0c;人流数量的急剧增加&#xff0c;有关体育馆的各种信息量也在不断成倍增长。面对庞大的信息量&#xff0c;就需要有体育馆场地预约管理系统来提高体育馆工作的效率。通过这样的系统&#xff0c;我们可以做到信息的规范管理和快速查询…

TCP/IP网络原理 【IP篇】

&#x1f389;&#x1f389;&#x1f389;写在前面&#xff1a; 博主主页&#xff1a;&#x1f339;&#x1f339;&#x1f339;戳一戳&#xff0c;欢迎大佬指点&#xff01; 目标梦想&#xff1a;进大厂&#xff0c;立志成为一个牛掰的Java程序猿&#xff0c;虽然现在还是一个…

聚观早报 | 马斯克丢掉世界首富宝座;加密货币FTX创始人被捕

今日要闻&#xff1a;马斯克丢掉世界首富宝座&#xff1b;加密货币FTX创始人被捕&#xff1b;美团推出高峰打车极速版&#xff1b;魔兽制作组正研发新功能&#xff1b;SpaceX出售公司内部股票马斯克丢掉世界首富宝座 12 月 13 日消息&#xff0c;据国外媒体报道&#xff0c;受特…

7-54 孤岛营救问题——状压bfs+三维标记

1944 年&#xff0c;特种兵麦克接到国防部的命令&#xff0c;要求立即赶赴太平洋上的一个孤岛&#xff0c;营救被敌军俘虏的大兵瑞恩。瑞恩被关押在一个迷宫里&#xff0c;迷宫地形复杂&#xff0c;但幸好麦克得到了迷宫的地形图。迷宫的外形是一个长方形&#xff0c; 其南北方…

二、小程序框架

目录 框架 一、响应的数据绑定 二、页面管理 三、基础组件 四、丰富的API 模块化 一、模块化 二、文件作用域 三、API 视图层 View 一、WXML 事件 什么是事件 事件的使用方式 使用 WXS 函数响应事件 事件详解 框架 小程序开发框架的目标是通过尽可能简单、高效…

万字长文详解 YOLOv1-v5 系列模型

一&#xff0c;YOLOv1二&#xff0c;YOLOv2三&#xff0c;YOLOv3四&#xff0c;YOLOv4五&#xff0c;YOLOv5参考资料 一&#xff0c;YOLOv1 YOLOv1 出自 2016 CVPR 论文 You Only Look Once:Unified, Real-Time Object Detection. YOLO 系列算法的核心思想是将输入的图像经过…