
Linux实战经验总结
文章平均质量分 83
分享自己工作中遇到的一些经典案例,以供大家参考,如有不当的地方,请大家及时指正。
MARS.QZ
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
iperf2 vs iperf3:UDP 发包逻辑差异与常见问题
iperf3与iperf2的UDP发包机制存在本质差异:iperf3采用"真实统计"模式,严格按时间间隔发送单包,若系统延迟则直接跳过欠账包,导致实测带宽低于设定值;而iperf2会补发欠账包以逼近目标速率。这种差异使iperf3更适合精确测量实际可用带宽,iperf2更适合压力测试。建议根据测试目的选择工具,并通过优化系统参数(如socket缓冲区、CPU绑定等)提升测试精度。当iperf3显示带宽不足时,通常反映的是系统发包能力的真实上限。原创 2025-08-23 16:17:46 · 1050 阅读 · 0 评论 -
什么是“代码临界区”?
摘要:临界区是并发程序中必须互斥访问的共享资源区域,确保同一时刻仅有一个线程执行。其核心在于通过锁、原子操作等机制保证数据一致性。类比单车道桥或家庭卫生间,不同锁类型(自旋锁、互斥锁)对应不同等待策略。使用场景包括共享计数、链表修改等。正确选择锁类型(如短操作用自旋锁,长操作用互斥锁)可避免死锁、性能浪费等问题。关键原则是"共享+修改=要互斥"。原创 2025-07-25 08:00:00 · 371 阅读 · 0 评论 -
《MODEM HOST INTERFACE》,第3章:MHI接口操作(第13节,通道传输描述符要求)
MHI接口操作原创 2025-05-25 08:00:00 · 920 阅读 · 0 评论 -
《MODEM HOST INTERFACE》,第3章:MHI接口操作(第4~6节)
本文介绍了MHI(Modem Host Interface)系统的错误处理机制和通道管理方法。当检测到内部错误时,设备会设置系统错误标志并停止操作,主机需重置系统恢复。MHI重置流程允许主机在不重启设备的情况下恢复错误状态,涉及寄存器重置和协议接口关闭/重初始化。在通道管理方面,详细说明了通道状态维护、上下文初始化、暂停/恢复操作以及重置流程。文章还规定了通道上下文的数据结构访问权限,为MHI系统的高效运行提供了完整的技术规范。<|end▁of▁sentence|>原创 2025-05-22 08:00:00 · 1589 阅读 · 0 评论 -
《MODEM HOST INTERFACE》,第6章,MHl register interface
摘要:该文档描述了内存映射I/O寄存器空间的架构规范,主要包括:1)寄存器访问约定(64位/32位访问方式和小端序排列);2)通道门铃和事件环门铃阵列的结构及访问机制;3)杂项寄存器的可选功能实现,包括传统中断控制和时间同步功能。其中门铃阵列采用偏移量计算基地址,而时间同步提供两种机制(读取计数器和命令寄存器触发)。所有功能支持情况需通过读取能力ID确认。原创 2025-06-07 08:00:00 · 741 阅读 · 0 评论 -
《MODEM HOST INTERFACE》,第7章,MHl data structures
摘要: 本文详细介绍了系统寄存器访问和数据结构管理的规范要求。主要内容包括:1)32/64位寻址支持,根据主机能力采用不同访问方式;2)寄存器字段采用小端字节序排列;3)通道上下文和事件上下文数组的构建规则,通过ID索引并以NCH/NER字段确定大小;4)传输环、命令环和事件环元素的处理规范,其中零长度传输被视为无效;5)完成码设置规则,特别说明了溢出事件的处理方式。所有未使用的数组条目均需初始化为零。原创 2025-06-08 08:00:00 · 288 阅读 · 0 评论 -
《MODEM HOST INTERFACE》,第5章:时间同步
本文介绍了两种高精度时间同步方法:非发布式和发布式。非发布式方法通过主机主动读取设备时间寄存器计算时差,精度可达微秒级,但需保持PCIe链路在L0状态。发布式方法采用异步机制,主机发出命令后由设备生成完成事件,虽然处理开销略高但更加灵活。两种方法均需在时间同步期间禁用PCIe低功耗模式,并考虑传输延迟因素。通过周期性执行这些方法,可实现主机与设备间的亚毫秒级时间同步,适用于对时间精度要求较高的应用场景。原创 2025-05-28 08:00:00 · 747 阅读 · 0 评论 -
《MODEM HOST INTERFACE》,第3章:MHI接口操作(第7~11节)
本文详细介绍了命令接口管理设备的工作原理及其操作规则。设备通过命令环发送MHI命令,并在处理完每条命令后生成命令完成事件。命令环的操作包括添加命令描述符、敲击门铃寄存器以及设备按顺序执行命令。此外,文章还描述了停止通道、启动通道和重置通道的命令操作流程,以及时间同步配置的步骤。通道门铃和事件环门铃的操作规则也被详细说明,包括如何设置门铃寄存器以声明新元素数量。最后,文章解释了环(Ring)的概念及其在数据传输中的作用,包括传输描述符的处理和环元素所有权的转移规则。这些机制共同构成了设备与主机之间高效通信的基原创 2025-05-24 08:00:00 · 1786 阅读 · 0 评论 -
《MODEM HOST INTERFACE》,第8章,MHI 序列图
《MODEM HOST INTERFACE》,第8章,MHI 序列图原创 2025-06-13 08:00:00 · 186 阅读 · 0 评论 -
《MODEM HOST INTERFACE》,第3章:MHI接口操作(第3节)
在转换到M1状态并暂停所有的MHI处理之后,设备向主机发送一个MHI事件,以通知状态变化。对于每个恢复的 MHI 通道,设备会检查对应门铃的最新状态,以处理 MHI 暂停期间主机发送的挂起门铃事件。对于每个恢复的 MHI 通道,设备会检查对应门铃的最新状态,以处理 MHI 暂停期间主机发送的挂起门铃事件。当设备处于M2状态时有待处理主机数据,设备会发起从M2状态转回M1状态的操作,并在恢复MHI运行后最终转至M0状态。在恢复 MHI 处理前,设备会向主机发送 MHI 事件,指示状态已更改为 M0。原创 2025-04-17 08:00:00 · 1059 阅读 · 0 评论 -
《MODEM HOST INTERFACE》,第4章:中断
本文详细阐述了MHI规范中的中断机制。主要内容包括:1)设备通过中断向主机通告事件,支持MSI和传统INTx两种中断方式;2)介绍了事件环与中断的关联关系,包括多中断分配和优先级处理;3)详细说明传统INTx中断的使用方法及子向量机制;4)解释了中断阻塞功能,通过BEI标志控制中断触发;5)重点分析了中断节制机制,包括定时器和计数器两种节流方式,以及不同场景下的中断处理规则。这些机制共同优化了系统中断处理效率,减少不必要的CPU中断负载。原创 2025-05-27 08:00:00 · 564 阅读 · 0 评论 -
《MODEM HOST INTERFACE》,第3章:MHI接口操作(第2节)
系统启动后,设备通过 PCIe 接口进行枚举,并将 BAR-0 分配用于 MMIO 寄存器空间。原创 2025-03-19 08:00:00 · 490 阅读 · 0 评论 -
《MODEM HOST INTERFACE》,第3章:MHI接口操作(第1节)
下图展示了 MHI 状态以及有效的状态转换。MHI 初始化在ready状态中执行。M0 表示 MHI 在设备上运行,并且处理门铃(doorbells)和传输。下表描述了支持的 MHI 状态(LPM 表示低功耗模式)。原创 2025-03-10 08:00:00 · 692 阅读 · 0 评论 -
《MODEM HOST INTERFACE》,第3章:MHI接口操作(第12节,传输环管理)
本文描述了传输环的工作原理,涉及主机和设备之间的数据交互。主机通过写指针将数据写入传输环,设备通过读指针读取并处理数据。传输环的状态由写指针和读指针的位置决定,环满和环空的状态分别定义为写指针位于读指针后方一个元素位置和读指针与写指针相等。设备处理完环元素后,会根据完成状态决定是否生成事件,并通过事件环向主机报告读指针的当前值。主机和设备在操作传输环时,都会根据元素大小推进各自的指针,并在指针到达环的末尾时自动重置为环的基地址。此外,文中还详细介绍了EOT(End of Transfer)条件的处理,包括出原创 2025-05-24 08:15:00 · 727 阅读 · 0 评论 -
《MODEM HOST INTERFACE》,第1章:MHI接口介绍
调制解调器主机接口原创 2025-02-28 15:17:18 · 725 阅读 · 0 评论 -
《MODEM HOST INTERFACE》,第2章:MHI接口架构
《MODEM HOST INTERFACE》,第二章:MHI接口架构原创 2025-03-01 16:05:32 · 1311 阅读 · 0 评论 -
在i.MX8MP上使用新接口操作GPIO
【摘要】i.MX8MP升级到Linux6.6后,传统的/sys/class/gpio接口被弃用,改用libgpiod工具集(v2.x)。本文系统梳理了迁移原因、Yocto配置方法、命令行操作及常见问题。内核4.8起建议使用/dev/gpiochipN字符设备,NXP6.x BSP默认关闭sysfs接口。libgpiod提供C/Python API和命令行工具(gpiodetect/gpioset等),v2.x采用新语法(--chip或chip:offset格式)。Yocto中通过添加libgpiod-too原创 2025-07-04 08:00:00 · 324 阅读 · 0 评论 -
如何理解Linux下V4L2架构?
摘要: ARM64 Linux平台通过V4L2框架实现高效视频处理,其核心由Media Controller和Videobuf2组成,支持零拷贝和高吞吐。V4L2分为四层:用户空间(如FFmpeg)、V4L2 Core(管理IOCTL和缓冲)、Videobuf2(统一缓冲队列)和硬件驱动层(如CSI/ISP)。关键机制包括: Videobuf2:管理MMAP、DMABUF等缓冲类型,驱动通过状态机(REQBUFS→QBUF→STREAMON)完成帧传输; Media Controller:用Entity-P原创 2025-07-01 08:00:00 · 588 阅读 · 0 评论 -
在 Linux ARM64 系统上启用并使用硬件编解码器的完整路径
本文介绍了基于i.MX8MPlus/RK3568/Snapdragon2290等SoC的视频编解码开发指南。从内核驱动配置、设备树设置到用户态栈选型(V4L2-M2M/GStreamer等),详细说明了各层关键要点。重点包括:1)内核需同时启用编解码IP和M2M框架;2)用户空间推荐主线V4L2-M2M方案;3)调优技巧涉及延迟、功耗、并发等场景;4)提供了验证Checklist和故障速解方法。强调CMA内存配置和DMA-BUF对零拷贝的重要性,建议开发时先用软解验证再转向硬解优化。原创 2025-06-21 08:00:00 · 1499 阅读 · 0 评论 -
音视频编解码器速查表
摘要:本文整理了主流音频与视频编解码器的关键技术参数与应用场景。音频方面,无损编解码器如FLAC主要用于Hi-Fi播放,有损编解码器如AAC广泛用于流媒体,蓝牙音频则采用aptX、LDAC等专属协议。视频方面,H.264仍为主流,HEVC和AV1逐渐普及,新一代H.266复杂度更高。各编解码器在算法、码率、延迟、授权模式及硬件支持上存在显著差异,需根据应用场景选择。音频更注重延迟与兼容性,视频则关注分辨率提升与专利授权问题。原创 2025-06-20 08:00:00 · 939 阅读 · 0 评论 -
关于pci_set_dma_mask函数的总结
pci_set_dma_mask函数是告诉内核”我只能DMA到哪“,那如果EP的DMA支持48-bit的位宽,而我们DMA MASK为36-bit,会不会存在EP往大于36-bit的地方DMA呢?跑到 EP 配置空间去“锁死” DMA 引擎的位宽,也不会把什么 36-bit 限制告知硬件。正常 Wi-Fi/NIC 驱动没开 ATS,描述符全由驱动可控,(48-bit)读到的只是 iova_low <= 36 值。,它不会自己凭空生成 >36-bit 的目标地址。出现“硬件擅自 DMA 高位”现象。原创 2025-06-21 08:00:00 · 898 阅读 · 0 评论 -
PCIe Rx:EP → Host DDR → 协议栈 还会不会再发生 memory copy?
摘要:文章分析了SteamDeck OLED WLAN下载速率低的原因——MemoryCopy现象。正常情况下,EPDMA直接写入IOVA/PA缓冲,内核仅处理缓存同步和元数据填充。MemoryCopy仅发生在特殊分支(占少数流量),如硬件限制或优化拷贝时。以i.MX8MP和Qualcomm Wi-Fi为例,零拷贝RX流程展示了数据如何在DDR地址保持不变。驱动代码示例显示,仅需dma_sync_single_for_cpu()操作即可完成接收,无需memcpy。结论指出,正常PCIe/AXI Wi-Fi原创 2025-06-23 08:00:00 · 441 阅读 · 0 评论 -
高速率需求下DMA和PCIe的协同配合
PCIe接口与DMA技术的关系解析:PCIe本身不具备DMA能力,需通过Bus-Master功能实现数据传输。两者常被集成因协议契合(PCIe的TLP格式匹配DMA需求)和带宽需求(PCIe Gen3 x1可达1GB/s)。典型实现方式包括SoC内置DMA、通用DMA通过AXI访问及外设自带DMA三种架构。关键技术环节涉及Bus-Master使能、地址转换(iATU/SMMU)、描述符队列和中断机制。虽然PCIe可独立运行,但高带宽场景(如网卡/存储)必须依赖DMA,其实现方式可分为IP内部集成或SoC互连原创 2025-06-18 08:00:00 · 963 阅读 · 0 评论 -
iATU(Internal Address Translation Unit)在 i.MX8MP 的实现
i.MX8MP中的iATU实现解析:该芯片的Synopsys DesignWare PCIe控制器提供4条Outbound和4条Inbound窗口。典型配置会将1条Inbound窗口设为1:1映射,使外设可直接访问整个64-bit DDR内存空间。iATU负责AXI与PCIe地址空间转换,支持Memory/IO/CFG等类型。启用1:1映射时,IOVA等于物理地址,无需IOMMU参与;启用SMMU时需配置额外窗口。硬件配置需注意窗口对齐(最小64KB)和使能顺序。Linux驱动通过dw_pcie_setup原创 2025-06-17 08:00:00 · 908 阅读 · 0 评论 -
C语言中的位域和ABI
C语言中的位域(bitfield)是一种以位为单位定义结构体成员的特殊语法,常用于硬件寄存器映射和节省内存空间。位域的使用涉及底层类型选择、编译器的位分配顺序和ABI兼容性等关键问题。虽然位域提供直观的位操作方式,但其实现依赖具体编译器,存在可移植性风险。相比之下,手工位操作更加可控但较为繁琐。在实际开发中,特别是驱动和内核编程时,必须确保工具链ABI(数据布局、调用规则等)的一致性,可通过编译器选项和诊断工具进行验证。合理选择位域或手工操作,并严格遵守ABI规范,才能避免二进制兼容性问题。原创 2025-06-16 08:00:00 · 1315 阅读 · 0 评论 -
Ring Buffer中的Producer和Consumer是什么?
本文介绍了环形队列中Producer/Consumer指针的工作原理。Producer代表写入者维护producer_idx,Consumer代表读取者维护consumer_idx,二者通过模N运算实现环形索引。文章详解了PCIeDMA场景下的分工机制:Host作为Tx-Producer/Rx-Consumer,Endpoint作为Tx-Consumer/Rx-Producer。技术实现涉及计数器管理、顺序保证(使用内存屏障)、空满状态判断(保留1空位)、Doorbell同步机制等核心概念。这种无锁设计通过原创 2025-06-14 08:00:00 · 826 阅读 · 0 评论 -
如何使用ChatGPT协助我们高效的分析代码?
本文介绍了三种利用ChatGPT梳理项目代码的方法:1)将项目打包为压缩文件上传,借助Python工具遍历目录结构;2)通过GitHub仓库链接让ChatGPT浏览单个文件;3)分模块粘贴关键代码逐步讨论。注意事项包括token限制和代码隐私问题。最推荐的方式是整体压缩上传配合分块提问,也可根据实际情况选择模块化提交或GitHub链接访问。这些方法能有效帮助开发者借助AI进行代码审查、重构建议和问题排查。原创 2025-06-14 08:00:00 · 587 阅读 · 0 评论 -
一文轻松让你理解什么是“描述符(Descriptor)”?
描述符是内核为DMA设备设计的标准化数据结构,用于解决硬件无法直接理解复杂内核对象的问题。它将"数据位置、传输量、目标地址"等关键信息以固定格式封装,形成设备可解析的"自助取餐单"。描述符通常驻留在环形队列中,包含方向标识、地址长度等字段,通过门铃机制触发传输。这种设计既隔离了虚拟地址变化风险,又实现了数据复用,同时通过状态回写完成同步。典型应用包括网络收发场景,其中环形队列管理和缓存一致性是核心实现要点。原创 2025-06-12 08:00:00 · 478 阅读 · 0 评论 -
一文轻松让你理解PCIe Doorbell 是什么?
摘要:Doorbell是PCIe等DMA I/O方案中的一种轻量级事件通知机制,通过写特定寄存器/内存位置(Doorbell register/ring)通知对方处理新任务。它不传输数据,仅触发操作。EP与Host之间常通过Doorbell和MSI配对实现双向通信:Host写EP的Doorbell寄存器触发EP工作,EP完成后再通过MSI通知Host。Doorbell需注意总线排序、缓存一致性等实现细节,是现代高性能PCIe设备数据面的关键组件之一。理解Doorbell的地址映射、顺序和缓存属性对开发优化驱原创 2025-06-11 08:00:00 · 878 阅读 · 0 评论 -
环形缓冲区(Ring Buffer)
环形缓冲区是一种固定大小的数据结构,通过模拟首尾相连的环形结构实现高效的数据流缓冲。其核心特性是数据写入和读取遵循先进先出(FIFO)原则,且当缓冲区满时,新数据可覆盖最旧数据。环形缓冲区的实现通常通过指针或索引管理数据头尾位置,并通过模运算实现指针的循环移动。其优势在于无需移动元素即可实现数据消费,所有操作均可在常数时间内完成,特别适合固定容量的队列场景。优化策略包括将缓冲区映射至连续虚拟内存区域,结合DMA技术提升性能。环形缓冲区广泛应用于多媒体、生产者-消费者模型及LZ77压缩算法等领域,因其高效的内原创 2025-05-22 08:15:00 · 1546 阅读 · 0 评论 -
Yocto:Patch Upstream Status(补丁上游状态)
当然,如果之后有其他人负责将该补丁提交给上游,则状态应更改为 Submitted [where],并且由负责上游提交的人在补丁中添加一行 Signed-off-by:。为了跟踪配方中应用的补丁,并最终减少需要维护的补丁数量,OpenEmbedded 构建系统要求为每个补丁提供上游状态的信息。在补丁说明中,每个补丁都应详细描述其所解决的 bug(例如提供 bug 跟踪系统中的 URL 以及相关邮件列表归档的链接)。将来的更新可以根据情况将状态更改为 Backport 或 Denied。原创 2025-04-01 08:00:00 · 1459 阅读 · 0 评论 -
一文轻松让你理解SDIO如何处理中断
为了让SDIO能够接收数据,在SD接口的一个引脚上添加了中断功能。pin 8在4-bit SD模式下为DAT1,用于向主机发出中断信号。SDIO中断是“电平敏感”的,也就是说,中断在低电平下有效。所有Host应在所有数据线DAT[3:0]上提供上拉电阻,如“sdio_v1.0”的第6章所述。4-bit SD模式中pin 8在IRQ和DAT[1]之间共享,设备只能在特定时间发送中断。在SPI和1-bit SD模式中,引脚8专用于中断功能。因此,在SPI和1-bit SD模式下,中断没有时间约束。原创 2024-07-15 10:44:10 · 1550 阅读 · 0 评论 -
SDIO传输数据格式简介
具体的操作流程如下所示:例子:绿色:SDMMC_CLK黄色:SDMMC_CMD,空闲时一直处于高电平其次主控和响应一般包含48个bit的数据,所以48个clk为一个完整的包。要确认的就是:主控发出去命令包后,SD卡端是否有响应。原创 2024-06-28 11:23:50 · 1816 阅读 · 0 评论 -
一文轻松使能Linux PCIe的ASPM
PCIe总线的电源管理包含ASPM(Active State Power Management)和软件电源管理两方面内容。所谓的ASPM是指PCIe链路在没有系统软件参与的情况下,由PCIe链路自发进行的电源管理方式。如下是PCIe的ASPM的状态机,其L1是强制性的规定,而L0s是可选的。原创 2024-06-24 20:06:17 · 4940 阅读 · 0 评论 -
一文让你轻松使能Linux IOMMU/SWIOTLB
这篇文章说明了如何在Linux内核中启用和配置IOMMU和SWOTLB。当今的计算或者嵌入设备使用一种内存分区的方法进行外设的管理,如显卡、PCI设备或USB设备,都将设备映射为一段内存,用于设备的读写。传统意义上的IOMMU用于内存映射,在系统初始化时就已设置,并且在系统运行时不能动态更改,因此有一定的局限性,所以芯片制造商(如Intel和AMD)开发了更先进的内存管理方法。在Linux内核中,我们可以使用Intel的SWOTLB和AMD架构的其他机制来操作IOMMU。原创 2024-06-17 17:02:23 · 2293 阅读 · 0 评论 -
关于IOMMU问题的扩展
如前所述,Steam Deck OLED WLAN速率低问题和IOMMU有一定的关系,这里我们对IOMMU为什么会对速率有影响进行一个较深入的理解。对于IOMMU我相信大家通过网上的资料,或多或少都有一定的了解,那在这里我们只是简单的描述下,具体相关的资料大家可以google等等。。。首先IOMMU(Input and Output Memory Management Unit)可以我们可以直接理解为一个硬件单元,主要的作用是地址的转换和地址的隔离,可以将它和MMU进行类比。原创 2024-06-17 14:39:51 · 7801 阅读 · 0 评论 -
IOMMU page fault
IOMMU is also known as the system MMU (SMMU). It performs memory management functions on behalf of masters that do not have their own MMU.For example, nonprocessor masters. The IOMMU hardware block allows virtually contiguous memory to be backed by phvsica原创 2024-06-17 13:29:26 · 1099 阅读 · 0 评论 -
基于RK3588裸Linux的CarPlay、HiCar、CarLife+无线互联系统开发计划
同样,麦克风输入通过音频服务器采集,送往协议服务编码后传给手机。对于语音通话,通过Bluetooth HFP传输声音,BlueZ可与ofono配合或使用其内置HFP支持,将手机语音通话声音输出到车机扬声器,同时采集车机麦克风上传。除上述三大协议外,如果未来需要支持Google的Android Auto或Car Connectivity Consortium的MirrorLink,也需分别通过Google认证和CCC认证,但本项目当前聚焦国内主流的CarPlay/HiCar/CarLife+。原创 2025-03-27 08:00:00 · 3778 阅读 · 4 评论 -
Linux 内存架构和内存模型
下图所示,这里还是有4个CPU,其中CPU0和CPU1组成一个节点(Node0),它们可以通过系统总线访问本地DDR物理内存,同理,CPU2和CPU3组成另外一个节点(Node1),它们也可以通过系统总线访问本地的DDR物理内存。下图所示,这里有4个CPU,都有L1高速缓存,其中CPU0和CPU1组成一个簇(Cluster0),它们共享L2高速缓存。另外,CPU2和CPU3组成一个簇(Cluster1),它们共享另外一个L2高速缓存。某些体系架构支持多种内存模型,但在内核编译构建时只能选择使用一种内存型。原创 2025-03-24 08:00:00 · 551 阅读 · 0 评论 -
RK3568平台SDIO接口驱动能力提升指南
例如,当SDIO设备在启动早期就被访问,或需要在操作系统启动前保证引脚电气特性稳定时,可以考虑在Bootloader中配置。具体方法包括:在U-Boot的设备树中做类似的pinctrl配置(U-Boot也使用设备树驱动引脚初始化),或者在U-Boot板级初始化代码中通过寄存器接口设置驱动强度。通过修改板级设备树(例如rk3568-yourboard.dts)中SDIO引脚的pinctrl节点,加入或修改drive-strength属性,就能在Linux启动时应用新的驱动能力设置,如上节所示。原创 2025-03-23 08:00:00 · 1716 阅读 · 0 评论