- 博客(37)
- 收藏
- 关注
原创 PCIe子系统内存资源分配解析
发现: 读取设备的 BAR,了解其资源需求。规划: 从 Host Bridge 的顶层资源开始,递归地为总线、桥和设备分配不冲突的 PCI 总线地址。告知: 将分配好的地址写入设备的 BAR 寄存器。映射: 在驱动中,通过ioremap将 PCI 总线地址映射到内核虚拟地址空间,以便 CPU 访问。理解这个过程的关键在于分清PCI 总线地址和CPU 物理地址,并熟悉树形结构在资源管理中的核心作用。
2025-11-27 17:39:44
296
原创 交换机ACCESS/TRUCK/HYBRID接口区别
特性Access 接口Trunk 接口Hybrid 接口角色终端接入设备互联多面手,灵活接入允许的VLAN数仅1个多个多个接收处理接收无标签帧,打上PVID接收有/无标签帧,无标签帧打上PVID接收有/无标签帧,无标签帧打上PVID发送处理总是剥离标签通常保留标签(除了PVID可选剥离)可针对每个VLAN配置带标签或剥离标签灵活性低中高常见厂商所有厂商Cisco, Juniper 等华为, H3C 等。
2025-11-04 11:02:16
808
原创 如何理解HOST CPU与EP模式的CPU的对接关系
物理连接逻辑关系:HOST是主,EP CPU是从。通信路径:这是唯一的控制与数据通道。所有HOST与EP CPU之间的交互(命令、数据、中断)都通过这条链路。EP的本地独立性:EP CPU可以利用其另一个RC模式的控制器构建一个私有的、HOST无法直接访问的本地I/O子系统。这种架构广泛应用于高性能计算、AI推理、智能网卡、存储控制器等领域,其中一个强大的通用CPU(HOST)负责管理任务调度和复杂操作系统,而一个或多个专用CPU(EP)负责执行计算密集型或延迟敏感型的特定工作负载。
2025-10-31 11:27:44
906
原创 CPU访问GPU等外设设备的地址流程
/ Process Address Space ID (PASID) 支持每个进程的 GPU 地址空间。.address = pcie_addr, // 通过 IOMMU 转换得到的地址。// 3. 这个 PCIe 地址对应 GPU 显存中的物理位置。// 1. 这个"物理地址"实际上是一个 GPU 设备地址。// 1. IOMMU 有自己的页表,由 GPU 驱动设置。// 1. GPU 将 PCIe 地址转换为显存物理地址。// 1. 检查 CPU 缓存中是否有该地址的脏数据。
2025-10-11 11:38:24
641
原创 用户态虚拟地址/内核态虚拟地址/页表/物理地址关系
用户态虚拟地址这是普通应用程序(如浏览器、文本编辑器)代码中使用的内存地址。每个进程都有自己独立的、从0开始的一片虚拟地址空间。这意味着不同进程可以有相同的虚拟地址,但它们指向的是不同的物理数据,互不干扰。进程运行在用户态时,只能访问这片地址空间。如果尝试访问内核地址,会引发段错误。内核态虚拟地址这是操作系统内核代码中使用的内存地址。这片地址空间被所有进程共享。当一个进程通过系统调用进入内核态时,它就开始使用内核的虚拟地址空间。
2025-09-30 10:22:01
786
原创 驱动开发,为什么需要映射?
是首选:在大多数情况下,由于它的安全性和简洁性,应该优先使用。pci_iomap用于特殊情况:当需要部分映射或对BAR类型有明确控制时使用。遵循正确的调用顺序→→ 映射函数。使用正确的I/O访问函数:映射后必须使用专门的读写函数访问硬件。这两个函数是PCI驱动开发中访问硬件寄存器的基石,正确使用它们对于编写稳定可靠的驱动程序至关重要。
2025-09-23 10:15:43
1179
原创 如何实现将GPU显存,注册到第三方使用
✅ P2P客户端注册/注销 (✅ GPU内存映射/取消映射 (✅ DMA引擎配置和启动✅ 中断处理✅ 总线地址管理和设备寄存器编程🔸 通过CUDA分配GPU内存🔸 通过ioctl控制数据传输流程🔸 应用程序逻辑和业务处理这种架构既保证了性能和安全,又提供了清晰的用户空间编程接口。
2025-09-22 19:23:06
814
原创 GPU显存,GPU物理地址,GPU虚拟地址,CPU虚拟地址,主存物理地址 如何理解?
概念比喻使用者/可见性在CUDA/GD技术中的角色主存物理地址总部档案室真实位置编号内存控制器、DMA设备DMA操作的源或目标物理地址CPU虚拟地址项目经理的任务清单编号CPU应用程序返回的指针GPU显存分部私有档案室GPU核心cudaMalloc分配的内存所在GPU物理地址分部档案室真实位置编号GPU内存控制器、DMA设备GDR/GDS的核心,第三方设备直接操作的终点GPU虚拟地址分部工程师的任务列表编号GPU线程(CUDA Kernel)cudaMalloc。
2025-09-16 20:15:09
1201
原创 CUDA陋见
CUDA(Compute Unified Device Architecture)是 NVIDIA 推出的一种并行计算平台和编程模型。它允许开发者使用 NVIDIA 的 GPU(图形处理器)进行通用计算(GPGPU, General-Purpose computing on Graphics Processing Units),而不仅仅是图形渲染。
2025-09-01 10:48:59
1186
原创 nvme ,文件系统、namespace、LBA,文件名的浅浅理解
文件系统就是这个聪明的管理员,它有一本“账本”(元数据),记录了“2024年财报.pdf”这份文件的具体内容分别存放在【A区-05排-12列】、【B区-11排-03列】等几个货架上。你只需要告诉管理员(文件系统)你要这个名称的文件,它会自动帮你找到所有对应的货架编号(LBA),并把货物取出来拼凑完整。读写数据时,你告诉硬盘:“请从LBA = 1024 的地方开始,给我读8个块的数据”。,比如“A区-05排-12列”。,它的任务是将底层枯燥的、按块寻址(LBA)的磁盘,变成一个用户可以理解和使用的、充满。
2025-08-28 16:48:55
828
原创 内存一致性浅谈
内存一致性的核心是解决多组件访问同一内存时的数据同步问题。CPU 之间 → 依赖硬件缓存一致性协议(如 MESI)。一致性内存:牺牲 CPU 性能,避免手动同步(流式内存:手动同步换取性能(dma_sync_*选择策略取决于数据大小和访问模式,理解差异是优化驱动性能的关键。
2025-08-04 11:41:04
833
原创 使用 SPDK 创建高性能虚拟 NVMe(适用于开发测试)
1.遇到 "Failed to open /dev/nvme-fabrics: No such file or directory" 错误时,通常是由于系统缺少必要的内核模块或配置。# 输出应显示 SPDK 控制器和命名空间。# 创建内存后端(1GB RAM磁盘)通常由内核自动创建。# 安装 nvme-cli。# 添加命名空间到子系统。(至少 4.8+)。
2025-07-25 11:08:58
681
原创 Ubuntu 20.04 上安装 SPDK
以下是在 Ubuntu 20.04 上安装 SPDK (Storage Performance Development Kit) 的完整步骤:# 更新系统sudo apt updatesudo apt upgrade -y# 安装基础依赖sudo apt install -y git make gcc g++ libssl-dev libaio-dev libnuma-dev \ pkg-config python3 python3-pip libjson-
2025-07-24 14:22:17
1134
原创 RCU典型死锁场景分析
这段代码存在潜在的RCU(Read-Copy-Update)死锁风险。这种模式避免了在持有锁时执行可能阻塞的RCU操作,符合RCU的设计原则。CPU B需要等待CPU A释放锁才能退出读侧临界区。RCU的核心理念是延迟释放内存直到所有读者完成访问。需要等待CPU B退出读侧临界区才能释放内存。CPU B持有RCU读侧临界区并尝试获取锁。// 收集需要释放的指针到列表。最佳实践是不要在持有锁的情况下调用。如果在持有锁的情况下调用。遍历XArray元素。CPU A持有锁并调用。// 在锁外批量释放。
2025-07-22 20:16:32
168
原创 Linux 文件系统核心概念
掌握 Linux 文件系统是系统管理的核心基础,建议结合实际操作(如挂载磁盘、修改权限)加深理解。tar -czvf archive.tar.gz /path/to/dir # 压缩。:存储文件的元数据(权限、大小、位置等),唯一标识一个文件。:所有者可读/写/执行,组可读/执行,其他用户仅可读。权限控制和元数据(如创建时间、所有者等)管理。# 开机自动挂载(编辑 /etc/fstab):实际存储文件数据的磁盘块(通常 4KB)。:Inode 耗尽(即使磁盘有空间)。# 符号模式(给所有者添加执行权限)
2025-06-13 16:58:25
708
原创 预取内存 和 非预取内存区别
是两种不同的内存区域类型,主要区别在于它们的访问特性、使用场景以及硬件优化方式。预取内存通常支持 64 位地址,而非预取内存通常限制在 32 位空间。可能导致设备寄存器写入被延迟或合并,引发功能异常(如设备不响应)。写入操作必须立即到达设备(例如,写入控制寄存器触发设备动作)。// PCIe 设备的 BAR 默认是非预取的(无特殊标记)。CPU/PCIe 控制器可以预取数据(提前加载到缓存)。显卡显存(VRAM)、NVMe 设备的 DMA 缓冲区。设备的控制寄存器(如网卡的 TX/RX 控制位)。
2025-05-19 14:08:53
991
原创 platform_device,device,pci_device三者关系与区别
特性devicepci_dev层级基类派生类(虚拟总线设备)派生类(PCI总线设备)总线依赖无虚拟平台总线(PCI总线典型用途所有设备的公共属性SoC外设、嵌入式设备PCI接口硬件资源管理通用属性(名称、电源等)内存/IRQ资源(resourcePCI配置空间、BAR资源匹配方式无名称或设备树兼容字符串。
2025-05-18 09:32:42
1077
原创 Linux UIO (Userspace I/O) 框架详解
UIO 是 Linux 内核提供的一种将设备驱动部分逻辑移到用户空间的机制,特别适合需要快速开发或自定义 I/O 处理的场景。
2025-05-15 10:38:08
1334
原创 NVMe 中命名空间、nblocks、slba 和 addr 的关系解析
NVMe设备中的逻辑存储分区,类似于传统存储的分区每个命名空间有独立的LBA(逻辑块地址)空间可配置不同的块大小(通常512B、4KB等)通过nsid(命名空间ID)标识。
2025-05-15 09:45:48
1199
原创 Linux NVMe驱动深度分析
Linux内核中的NVMe驱动采用分层架构,主要分为以下几个部分:用户空间| 块设备层 (/dev/nvmeXnY) || 字符设备层 (/dev/nvmeX) |内核空间| NVMe核心层 (nvme-core) || PCIe传输层 (nvme-pci) || Fabrics传输层 (nvme-tcp, || nvme-rdma等) |硬件层| NVMe控制器 |
2025-05-15 09:28:28
2208
4
原创 绕过文件系统直接读写NVMe盘的方法
绕过文件系统直接访问NVMe存储设备可以消除文件系统开销,实现最高性能的裸设备访问。以下是不同操作系统下的实现方法。
2025-05-15 09:16:19
838
2
原创 MMIO机制详解
CPU发出地址 0x40000000 → 内存控制器识别为MMIO区域 → 转发请求到PCIe/SoC总线 → 目标设备响应读写。// 16个32位寄存器。// 写入数据寄存器。的机制,CPU通过读写内存地址来访问设备寄存器,而非专用的I/O指令。:设备监听特定地址范围,当CPU访问该范围时,设备响应操作。:确认数据宽度对齐(32位设备需32位访问)。
2025-05-14 20:03:13
1585
原创 MLX5 Linux 驱动代码分析
Mellanox ConnectX 系列网卡的 Linux 驱动 (mlx5) 是一个高性能 RDMA 和 Ethernet 驱动,支持 InfiniBand 和 Ethernet 功能。
2025-05-12 10:48:36
2846
原创 PLX 8748 组播(MC)窗口大小计算方法
实际配置时,请参考PLX 8748数据手册中的"Multicast Configuration"章节,根据具体应用场景调整这些参数。
2025-05-08 15:34:11
461
原创 PCIe Crosslink
PCIe Crosslink(交叉连接)是一种特殊的PCIe链路连接方式,允许两个PCIe设备(通常是Root Complex或Endpoint)是指两个PCIe设备(如两个CPU、两个FPGA或两个GPU)通过PCIe链路直接连接,形成点对点(P2P)通信通道。:两个Intel/AMD CPU通过PCIe Crosslink直接通信(替代UPI/Infinity Fabric)。:主板需提供PCIe Crosslink连接(如特定插槽支持x16/x8 Crosslink)。
2025-05-04 11:05:45
1278
原创 EP 设备间P2P 与 基于pcie switch 的p2p区别
对于具体实现,需结合硬件规格(如PLX交换机手册或GPU技术文档)和操作系统支持(如Linux。GPU(Port 1)和NVMe SSD(Port 2)通过PLX Switch直接通信。多台NVMe SSD通过PCIe Switch共享访问(如CXL over PCIe)。GPU和FPGA通过同一PCIe插槽的拆分(Bifurcation)直接通信。设备通过PCIe Lane直接交互(如x16拆分为x8+x8)。启用PCIe Bifurcation(如x16→x8+x8)。
2025-05-04 10:47:53
2958
2
原创 perf 添加自定义函数性能测试实例
要在 Linux 内核或模块的函数添加perf probe探针,可以使用%return后缀来跟踪函数返回。# 添加函数入口探针sudo perf probe -m <模块名,必须路径加ko,不然会报不在.text段> --add <函数名># 添加函数退出探针(使用 %return)sudo perf probe -m <模块名,必须路径加ko> --add <函数名>%return。
2025-04-30 17:41:48
878
原创 linux 内核worker queue实现
├── find_worker_executing_work() // 检查是否已在执行。WORK_STRUCT_DELAYED_BIT, // 是否是延迟工作。└── wake_up_worker() // 唤醒worker线程。WORK_STRUCT_PENDING_BIT = 0, // 是否已排队。├── insert_work() // 添加到pending链表。// 使用指定CPU的worker_pool。// 每个worker_pool有自己的锁。// 2. 执行工作。
2025-04-29 15:11:40
821
原创 linux 内核内存管理概述
硬件抽象层:处理特定架构的内存管理单元(MMU)细节物理内存管理:处理物理页帧的分配和释放虚拟内存管理:提供进程地址空间抽象内存分配器:提供kmalloc、vmalloc等接口用户空间接口:通过brk、mmap等系统调用提供服务Linux 内存管理系统通过精妙的分层设计和多种算法,实现了高效的内存管理。理解其工作原理对于系统调优、性能分析和内核开发都至关重要。随着硬件发展和新需求出现,Linux 内存管理仍在不断演进,如近年来对非易失性内存的支持等新特性。
2025-04-29 10:19:45
886
原创 理解字节对齐的效率
默认使用8字节对齐(64位系统的自然对齐)对性能关键代码进行对齐优化使用工具验证(如GCC的警告)不同架构区别对待(x86较宽容,ARM较严格)在绝大多数64位系统现代CPU上,8字节对齐的访问性能优于4字节对齐,特别是对于64位数据类型的操作。
2025-04-28 20:15:01
880
原创 DMA与关键操作性能对比分析
hlist_for_each_entry_rcu(pos, head, member) { // 无锁读取。// ≈8 ns (无锁算法)当 (CPU拷贝时间) > (DMA启动开销 + DMA传输时间) 时选择DMA。// 同时CPU可以处理其他任务。// 启动DMA传输。// 等待DMA完成。
2025-04-25 15:25:20
1070
原创 sysfs_create_bin_file、kobject_create_and_add 与 sysfs_create_file 的区别详解
sysfs_create_bin_file、kobject_create_and_add 与 sysfs_create_file 的区别详解
2025-03-27 17:38:33
1163
原创 华为eNSP使用详解
eNSP是一款由华为提供的免费的、可扩展的、图形化的网络设备仿真平台,主要对企业网路由器、交换机、WLAN等设备进行软件仿真,完美呈现真实设备部署实景,支持大型网络模拟,让你有机会在没有真实设备的情况下也能够开展实验测试,学习网络技术。eNSP提供便捷的图形化操作界面,让复杂的组网操作变得更简单,可以直观感受设备形态,并且支持一键获取帮助和在华为网站查询设备资料。按照真实设备支持特性情况进行模拟,模拟的设备形态多,支持功能全面,模拟程度高。支持与真实网卡的绑定,实现模拟设备与真实设备的对接,组网更灵活。
2024-04-15 18:59:11
438
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅