自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(70)
  • 收藏
  • 关注

原创 llvm中端之mem2reg源码分析

mem2reg源码依赖了一些封装库,包括分析器、util、mem2reg自身的封装。DominatorTree:由DominatorTreeAnalysis生成,用于获取函数的支配树,建立函数基本块之间的支配关系;AssumptionCache:由AssumptionAnalysis生成,用于注册ICmpInst指令和建立影响该指令结果的映射关系。对后续的指令预判有用;ValueTracking:依赖AssumptionCache,对Value跟踪分析并作一些结果判断;

2024-09-12 16:19:59 782

原创 llvm后端之局部变量

llvm后端对局部变量(即alloc节点)的访问,首先,将对alloc节点转为FrameIndex,所有对alloc的load和store均用FrameIndex取代;对于RISCV而言,就是RISCV::ADJCALLSTACKDOWN和RISCV::ADJCALLSTACKUP两条指令,前者是增长栈、后者为缩小栈。局部变量包括固定大小的变量,不固定大小的变量(例如不定长的数组)。由于FrameIndex操作数是一个抽象的操作数,对它的替换是在PEI这个pass中进行的。

2024-09-10 16:14:02 1101

原创 llvm后端之函数栈帧

细心的朋友可能会发现之前的代码逻辑缺失了寄存器的保留与恢复操作。这部分指令是在PEI这个pass中完成的,该pass是在TargetPassConfig::addMachinePasses中完成添加的。TargetInstrInfo类的storeRegToStackSlot和loadRegFromStackSlot方法用于寄存器压栈和出栈指令的生成。注:由于先生成的保留寄存器的压栈与出栈指令,所以目标在实现emitPrologue和emitEpilogue方法时,需要注指令的插入位置;

2024-09-09 18:27:23 1288

原创 llvm后端之tblgen寄存器信息

其生成规则是按枚举出现顺序将sub_8bit、sub_8bit_hi、sub_8bit_hi_phony、sub_16bit_hi、sub_32bit、sub_xmm、sub_ymm被设置为0x01、0x02、0x04、0x08、0x10、0x20、0x40。注:并不是有多少个寄存器就有多少个寄存器单元,例如两个8位BL和BH组成了16位BX、两个16位BX和HBX组成了32位EBX、EBX扩展成64位RBX,有6个寄存器却只有X86::BL、X86::BH、X86::HBX三个寄存器单元。

2024-08-30 12:25:34 844

原创 llvm后端之SelectionDag源码分析

例如AMDGPU中的Load节点,对于AMDGPUAS::CONSTANT_ADDRESS_32BIT地址空间的数据load是具备恒定的,因为该地址空间的数据运行后不会更改;DAG合法化是最后一个合法化阶段,它在SelectionDAG::Legalize中完成,它会不断通过SelectionDAGLegalize::LegalizeOp对每个节点合法化,直到所有节点都不再需要合法化结束。注:一般地,在参数寄存器还可以分配的时候,会优先使用CCState::AllocateReg分配参数寄存器;

2024-01-08 12:47:20 1238

原创 四种NAT的网络结构

对于三种圆锥型NAT可以建立P2P打洞技术,但是对于对称性网络却无法做到P2P效果。

2023-12-27 10:28:06 8319 1

原创 llvm后端之SDNode设计

DAG节点的类型(也就是操作类型,对应于指令类型)是定义在llvm::ISD::NodeType枚举类型中;EVT是对MVT的封装,此外还提供了对MVT类型的扩展。当表示MVT之外的类型时,其V.SimpleTy为INVALID_SIMPLE_VALUE_TYPE。蓝色表示指令序列化时两个节点中间可以插入其他节点对应的指令,而红色节点表示两个节点生成的指令中间不能插入其他节点的指令。llvm后端DAG的类型系统分为三个层级,从外到内为:EVT、MVT、SimpleValueType。

2023-12-20 22:28:45 1468

原创 Linux虚拟化之VFIO框架

对group文件调用ioctl执行VFIO_GROUP_GET_DEVICE_FD命令,将调用vfio_group_get_device_fd从struct vfio_group.device_list链表中查询设备,并创建一个文件对象,将struct vfio_device赋值给file->private_data;目前有三种iommu实现,vfio_noiommu_ops、tce_iommu_driver_ops和vfio_iommu_driver_ops_type1。后面以vfio-pci设备为例。

2023-11-28 10:46:08 1329

原创 Linux虚拟化之mdev框架

然后再将该设备通过函数mdev_register_device注册到mdev框架中,其回调为struct mdev_parent_ops mdev_fops。在vfio_mdev_init函数中,直接通过mdev_register_driver注册了一个设备驱动vfio_mdev_driver;在mdev_register_driver内部,将vfio_mdev_driver.driver.bus设置为mdev_bus_type。注:mtty_*系列回调实现了pci配置空间、BAR空间的模拟。

2023-11-28 10:45:43 1540

原创 DPDK之eventdev_pipeline源码解析

注:当调用rte_event_eth_rx_adapter_queue_add时,设置struct rte_event_eth_rx_adapter_queue_conf.rx_queue_flags参数带有RTE_EVENT_ETH_RX_ADAPTER_QUEUE_EVENT_VECTOR标志,那么WORD1就是vec;只要有一个网卡设备不具备RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT能力,那么就需要采用generic实现,该实现发送数据由上述的软件方式实现。

2023-10-18 20:05:23 497

原创 DPDK之l3fwd-power源码解析

app_mode运行模式,有五种运行模式:APP_MODE_LEGACY、APP_MODE_EMPTY_POLL、APP_MODE_TELEMETRY、APP_MODE_INTERRUPT、APP_MODE_PMD_MGMThp_lcores支持睿频的CPU核ID数组,数组长度为nb_hp_lcores;指向struct lcore_params数组,数组每项表示网卡号为port_id的接收队列号queue_id由核lcore_id处理lcore_conf。

2023-05-17 21:16:31 1120 1

原创 DPDK之l2fwd源码解析

表示开启的eth网卡。例如port为N的网卡若开启,l2fwd_enabled_port_mask从低到高第N位置1,否则置0;表示转发目的网卡的port。例如port为N的网卡的转发目的网卡port为l2fwd_dst_ports[N]表示相互转发的两个网卡的信息。例如M与N是相互转发的两个网卡的port号,那么它们的第0位不同,其他位相同。满足:M >> 1 等于 N >> 1。

2023-04-06 20:33:23 1163

原创 数据流分析之推导要点

数据流分析在编译器中作用显著,它能辅助实现各种优化过程。数据流分析有两种常见的推导方法:一种是use-def推导、另一种是gen-kill模式。

2023-03-31 19:54:10 265

原创 数据流分析之定值分析

若一条指令对寄存器R生成了定值,其他指令对R的生成定值称为对该条指令关于R的杀死定值。指令n的杀死定值集合表示为kill[n],n为指令序号、元素为寄存器+赋值指令序号的二元组;指令n的生成定值集合表示为gen[n],n为指令序号、元素为寄存器+赋值指令序号的二元组(一般有0个或1个元素);指每条指令执行后的相关变量的可能值。指令n的出口定值集合表示为out[n],n为指令序号、元素为寄存器+赋值指令序号的二元组;指令n的入口定值集合表示为in[n],n为指令序号、元素为寄存器+赋值指令序号的二元组;

2023-02-12 20:44:59 627

原创 控制流分析之构建支配树

在编译器中,支配树作用显著。例如,它可以辅助我们识别函数中的循环等功能。本文将将讨论如何从一个图构建支配树?

2023-01-05 20:39:23 806

原创 数据流分析之活跃分析

注:这种优化,只求出了跨基本块的入口活跃列表和出口活跃列表的变量;我们对一个函数的每个结点生成入口活跃列表和出口活跃列表是比较耗时的,但是,很多时候我们只需要求出每个基本块的入口活跃列表和出口活跃列表。指令n的定值集合表示为def[n], n为指令序号、元素为寄存器(一般有0个或1个元素);指令n的引用集合表示为use[n], n为指令序号、元素为寄存器;指令n的出口活跃集合表示为out[n],n为指令序号、元素为寄存器;指令n的入口活跃集合表示为in[n],n为指令序号、元素为寄存器;

2022-12-14 22:25:52 651

原创 llvm中端之IR设计

llvm IR是llvm对代码的一种中间表示。它来源AST(抽象语法树),是llvm代码优化的主要对象。IR的很多组成元素都是以Value为基类。llvm并没有采用C++的RTTI,而是自实现了一套多态系统,其实现核心就在Class Value::Subclass*系列字段。每个模块代表链接前的一个编译单元,模块一般包括:此外,还包括:IRBuilder是指令和常量的构建器,它是一个模板类,它有两个模板参数:Instruction表示一个IR指令,llvm采用静态单赋值(Static Single Ass

2022-12-05 22:18:05 1162

原创 Linux图形子系统之dma-buf

dma-buf是linux内核提供的一种机制,用于不同模块实现内存共享。它提供生产者和消费者模式来实现不同模块对内存共享同时,不用关心各个模块的内部实现细节,从而解耦。在drm框架中也集成了dma-buf方式的内存管理。drm通过DRM_IOCTL_PRIME_HANDLE_TO_FD实现将一个gem对象句柄转为dma-buf的fd。其中会调用struct drm_driver的prime_handle_to_fd回调,drm_gem_prime_handle_to_fd函数是prime_handle_to

2022-06-21 15:36:57 2019

原创 Linux数据结构之refcount

kref是linux内核用于原子引用计数的数据结构一般在结构体中嵌套struct kref:1.2 初始化在结构体初始化过程对refcount初始化:

2022-06-18 16:41:32 507

原创 Linux数据结构之radix-tree

radix-tree在linux文件系统和句柄表使用的一种高效数据结构。它通过类似B+树的原理建立ID与数据指针的映射,并且通过rcu机制提供数据安全性和高效性。注:radix_tree_root也可以嵌套到结构体中1.3 预分配1.4 插入节点1.5 删除节点1.6 替换节点1.7 查询遍历1.8 安全访问安全读安全写1.9 标签操作注:tag必须小于RADIX_TREE_MAX_TAGS...

2022-06-16 19:14:33 595

原创 Linux数据结构之list

链表是Linux使用比较常见的一种数据结构一般在struct中嵌套struct list_head作为数据节点:1.2 初始化头节点头节点也用struct list_head表示。通过LIST_HEAD_INIT初始化头节点:1.3 添加节点list_add/list_add_tail将节点添加到链表节点的后面或前面:1.4 删除节点通过list_del移除节点:1.5 遍历节点通过list_for_each_safe安全遍历节点(遍历过程中,可以移除当前节点):注:在遍历过程中不移除节点

2022-06-15 19:48:19 220

原创 Linux数据结构之rbtree

rbtree是linux内核红黑树实现。一般在struct中嵌套struct rb_node作为树节点:1.2 初始化根将struct rb_root赋值为RB_ROOT:1.3 插入节点先通过rb_link_node插入节点,再通过rb_insert_color重新平衡红黑树:1.4 移除节点通过rb_erase移除节点:注:该API会重新平衡红黑树通过rb_entry可将节点转为具体类型:......

2022-06-15 19:47:50 493

原创 Linux数据结构之rcu

了解rcu前,先引入一个问题:当多个读者在访问一个全局指针的时候,假设一个写者给全局指针设置了一个新的值,同时需要对旧的指针指向的内存进行销毁。这个时候写着在销毁旧指针的时候,读者可能还在访问该全局变量。为了解决这个问题,可以通过加锁,或引用计数方式去实现。前者性能不佳;后者会有环形引用的风险;而RCU机制恰到好处。RCU通过机制将写者销毁旧数据的时机延迟到所有读者结束,它具备如下特点:注:struct的内部字段也可以定义为__rcu注:在rcu_read_lock/rcu_read_unlock之间

2022-06-15 19:47:04 473

原创 Linux虚拟化之IOMMU

Linux虚拟化之IOMMU引言1 IOMMU初始化1.1 初始化函数集1.2 初始化流程2 Intel-IOMMU2.1 技术原理2.2 数据结构2.3 核心流程引言DMA操作允许设备直接访问内存,但是也带来了诸多问题:当设备需要大量连续物理内存时,OS未必能满足;当某些设备不能访问高端内存时,必须采用反弹缓冲区搬移,影响性能;在虚拟化环境中,存在多设备访问同一物理内存的冲突;IOMMU与cpu的MMU类似,给设备提供一套虚拟地址空间,设备发出虚拟总线地址空间的访问请求、送到IOMMU单元

2022-06-10 12:34:09 5561 1

原创 IMG-GPU之内存管理

IMG-GPU之内存管理引言1 物理内存管理1.1 物理内存划分1.2 原始heap1.2.1 heap配置1.2.2 heap构建1.3 物理heap备份2 虚拟内存管理3 具体实现引言IMG-GPU对划分为两个层次,底层负责具体的物理内存的管理;基于物理内存管理层构建上层的不同用户的应用内存,或者说虚拟内存管理。1 物理内存管理1.1 物理内存划分在struct _PVRSRV_DEVICE_NODE_中定义了不同的物理内存heap:typedef struct _PVRSRV_DEVICE

2022-05-13 16:52:17 108

原创 Linux图形子系统之vblank事件

Linux图形子系统之vblank事件引言1 使能vblank2 传递vblank引言显示器显示图像数据的过程,一般从左上角,按从左至右、从上至下的方式扫描像素数据。一般每扫描一行,会切换到下一行的左侧,行与行之间的返回过程称为水平消隐;一帧图像扫描完成,要从图像的右下角返回到图像的左上角,开始新一帧图像的扫描,这一时间间隔,叫做垂直消隐,也称场消隐(vblank)。从右下角返回左上角的时间间隔内,可以通知驱动进行下一帧图像的送显,一般硬件进入vblank后(也就是扫描完一帧图像)会通过中断机制触发硬件

2022-03-31 20:35:07 4162 1

原创 Linux图形子系统之DRM渲染框架

Linux图形子系统之DRM渲染框架引言1 渲染框架2 amd实现引言drm对图形渲染抽象出了相关组件,drm核心代码负责管理其渲染流程和同步,驱动和GPU固件负责实现具体命令的生成和执行细节。1 渲染框架2 amd实现...

2022-03-31 17:58:20 3054

原创 Linux图形子系统之GEM内存管理

Linux图形子系统之GEM内存管理引言1 创建与映射1.1 创建GEM1.2 映射对象2 内存分配2.1 数据结构2.1.1 内存管理结构2.1.2 内存节点结构2.2 分配算法2.3 常见用法引言drm对内存使用抽象成GEM对象,用户空间通过句柄或文件映射的方式访问。1 创建与映射1.1 创建GEMdrm_mode_create_dumb_ioctl是DRM_IOCTL_MODE_CREATE_DUMB的处理函数,它直接调用了drm_mode_create_dumb函数,该函数通过参数解析和检

2022-03-29 16:58:47 4782

原创 Linux图形子系统之setCRTC流程

Linux图形子系统之setCRTC流程引言1 drm_mode_setcrtc2 drm_atomic_helper_set_config3 drm_atomic_helper_commit引言drm通过DRM_IOCTL_MODE_SETCRTC实现最原始的模式设置和送显操作。1 drm_mode_setcrtcdrm_mode_setcrtc是DRM_IOCTL_MODE_SETCRTC的处理函数。其源码如下:int drm_mode_setcrtc(struct drm_device *d

2022-03-29 11:03:15 2432 1

原创 Linux图形子系统之DRM显示框架

Linux图形子系统之DRM显示框架引言1 概述1.1 connector引言与其他子系统一样,linux抽象出了DRM作为其图形子系统。其中包括显示和渲染,本文主要讲解渲染部分。1 概述如图所属,drm将显示部分抽象出了framebuffer、plane、crtc、encoder、connector五部分。在同一时刻,一个framebuffer与一个plane动态绑定;在同一时刻,通常一个或多个plane与一个crtc静态绑定;在同一时刻,一个crtc与多个encoder动态绑定;在同

2022-03-28 16:46:37 5391 1

原创 mysql源码剖析–LEX结构分析

mysql源码剖析–LEX结构分析引言引言

2021-10-21 16:23:02 1482 2

原创 mysql源码剖析–词法解析过程

mysql源码剖析–词法解析过程引言引言

2021-06-02 20:08:05 559

原创 mysql源码剖析–通信协议分析

mysql源码剖析–通信协议分析引言1 协议简介1.1 server->client握手协议1.2 client->server认证协议引言我们使用驱动连接mysql服务器,其协议通常以TCP/IP为主;此外,mysql还支持命名管道等方式交付。无论底层通道是什么,mysql都在其上建立了统一的应用协议。以TCP/IP为例,整个mysql客户与服务器交付过程如下:1 协议简介mysql对所有的消息采用一个通用的模式进行包装,即:其中3字节的数据长度,1字节的包序号。每次请求或响应

2021-05-26 20:21:55 1021 2

原创 mysql源码剖析–调试环境搭建

mysql源码剖析–源码调试环境搭建引言1 工程搭建1.1 必需工具安装1.2 源码工程搭建2 调试设置引言mysql的源码支持多种平台,特别是在linux平台更是默认的关系数据库,其地位相当于windows的SQL Server。本文的调试环境搭建建议选择在windows平台,理由如下:我们搭建mysql源码调试环境,其目的是为了更好地理解mysql设计,而不是去研究linux或windows系统环境;windows平台的visual studio工具的高度集成和图形化,对于我们调试、跟踪其源

2021-05-15 17:10:51 478 1

原创 存储相关概要–分布式存储要点分析

分布式存储要点分析引言1 宏观架构2 监控中心2.1 Pull状态2.2 Observe状态2.3 Work状态2.3.1 节点竞选2.3.2 写数据流程2.3.3 数据修复2.3.4 节点替换3 虚拟节点3.1 数据写入3.2 数据迁移3.3 扩展节点3.4 收缩节点4 物理节点引言分布式存储和分布式计算是云计算的基石,分布式计算以AP为主、而分布式存储则以CP为主。前者一方面是特定场景不需要太高的一致性,另一方面即便是需要高一致性、也借助持久化层去实现高一致性,所以分布式计算设计考虑更多以AP为主;

2021-03-21 18:39:17 4011 4

原创 存储相关概要–BigTable设计原理

BigTable设计原理引言1 设计概述2 核心流程3 思考总结引言1 设计概述2 核心流程3 思考总结

2021-02-03 14:20:07 1854 1

原创 leveldb源码剖析2.4–核心设计之数据迭代器

leveldb源码剖析08–核心设计之数据迭代器引言1 迭代器分类引言在leveldb中,迭代子模式被广泛用及、几乎贯穿于整个代码之中。1 迭代器分类

2021-01-31 22:47:27 359

原创 leveldb源码剖析2.3–核心设计之文件缓存

leveldb源码剖析07–核心设计之文件缓存引言1 设计原理1.1 核心思想1.2 数据结构2 源码解读2.1 核心代码2.2 可优化项引言在leveldb中对文件数据缓存分为TableCache和Options中的block_cache,两个缓存的实现都是基于ShardedLRUCache类。1 设计原理1.1 核心思想LRUCache主要缓存KV数据,其核心思想如下:首先,将Key通过哈希算法散列。然后通过哈希链表存储数据;为了解决多线程并发互斥加锁,所以分为16个隔离的桶去实现哈希链表

2021-01-31 22:47:15 379

原创 leveldb源码剖析2.2–核心设计之mem缓存

leveldb源码剖析06–核心设计之mem缓存引言1 跳表原理1.1 数据结构1.2 数据查询1.3 插入节点1.4 删除节点2 源码解读引言无论是MemTable、还是immutable MemTable,在leveldb源码实现中都是MemTable类型。其核心数据结构是跳表。1 跳表原理1.1 数据结构跳表主要是优化传统有序链表的操作时间复杂度,借鉴于二分查找算法。其结构如下图:图中是一个最大高度为3的跳表。表头有3个指针域,数据节点为1到3个指针域。所有的指针域指向后续节点的基地址,

2021-01-31 22:47:03 187

原创 leveldb源码剖析2.1–核心设计之内存池实现

leveldb源码剖析05–核心设计之内存池实现引言1 数据结构2 源码解读2.1 源码解读2.2 发现问题引言为了更加合理地使用内存,在leveldb中实现了自定义的内存池。1 数据结构leveldb的内存池实现类为Arena,其核心数据域如下:首先,用一个vector类型的blocks_存储分配的一块块内存;用alloc_ptr_指向最新申请的内存中未使用内存的首地址;用alloc_bytes_remaining_表示最新申请的内存中未使用内存的字节大小;特别地,memory_usage_统

2021-01-31 22:46:53 336

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除