自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux 下 DMA 内存映射浅析

流式 DMA 映射根据数据方向对 cache 进行 “flush/invalid”,既保证了数据一致性,也避免了完全关闭 cache 带来的性能影响。

2025-06-08 10:44:03 561

原创 Linux 下关于 ioremap 系列接口

在系统运行时,外设 IO 资源的物理地址是已知的,由硬件的设计决定(参考SOC的datesheet,一般会有memorymap)。而在 Linux 中,还有其他的一些常见的类似接口,ioremap_wc、ioremap_wc、ioremap_np 等,他们的区别又是什么呢?提供了架构无关的通用默认实现,而 arch/xxx/ 目录下的实现用于特定架构的覆盖或替代。Device属性的内存空间还有下面三种子属性,都有打开和关闭的定义。从上面我们可以看到,默认将设备的寄存器地址资源,使用。

2025-06-07 18:45:26 597

原创 PCIe 总线事务层

PCIe 是以包(Packet)为单位传输数据的。和计算机网络类似,其协议也是分层的。其协议栈主要分为三层:物理层(Physical Layer),数据链路层(Data Link Layer)和事务层(Transaction Layer),如下图所示:本节重点介绍与数据传送密切相关的总线事务,如存储器、 I / O、 配置读写总线事务。当然在 TLP 的头中,我们仍然有很多字段没有涉足,这些字段都和具体的事务类型相关,所以我们在这一篇中就不会过多的深入了。

2025-06-07 15:14:34 907

原创 PCIe 中的 SR-IOV 介绍

本文介绍了PCIe规范中的SR-IOV(单根I/O虚拟化)技术。SR-IOV通过硬件支持实现I/O虚拟化,允许多个虚拟机共享一个物理设备,提供接近原生的性能。文章对比了SR-IOV与多功能设备(Multi-Function)的区别,指出SR-IOV专为虚拟化设计,具有更好的资源隔离和性能优势。详细讲解了SR-IOV的初始化过程,包括关键寄存器配置、VF BAR空间分配以及VF设备BDF计算方法。文章还推荐了相关技术文档,为理解和使用SR-IOV提供了实用参考。

2025-05-28 10:20:56 740

原创 PCIe 中的 ARI 介绍

由于 PCIe 是端对端设备,作为 Endpoint 类型的设备,只有一个 device,即 device number 恒为 0,此时 5-bit 的 Device Number 没有多大意义,而 3-bit Function Number 只能表示 8 个function,在部分虚拟化场景中(例如 SR-IOV),常常不够用。:软件在设置下行端口(Downstream Port)的 ARI Forwarding Enable 位时,必须确保该端口下挂的设备确实支持 ARI 功能。

2025-05-01 10:28:39 949

原创 PCI 总线学习笔记(五)

PCI 总线定义了两类配置请求, 一类是 Type 00h 配置请求, 另一类是 Type 01h 配置请求。 PCI 总线使用这些配置请求访问 PCI 总线树上的设备配置空间, 包括 PCI 桥和 PCI Agent 设备的配置空间。  在 PCI 总线中, 只有 PCI 桥能够接收 Type 01h 配置请求。Type 01h 配置请求不能直接发向最终的 PCI Agent 设备, 而只能由 PCI 桥将其转换为 Type 01h 继续发向其他 PCI 桥, 或者转换为 Type 00h 配置请求发向

2025-04-26 00:23:47 856

原创 wait_event 类接口详解

在 Linux 内核中,等待某个条件成立是驱动开发与内核线程编程中最常见的场景之一。为了避免不必要的轮询和资源浪费,内核提供了以等待队列(wait_queue_head_t)为基础的一套机制,用于在条件未满足时挂起当前进程,并在条件成立或事件发生后将其唤醒。下面通过实际代码示例,结合内核调度机制与条件判断时机,深入分析它们的使用方式及常见误区。但是被唤醒后,会再次检查 condition,如果 condition 为 false 的话,会接着进入睡眠状态…接口唯一的区别,就是可以被信号打断的。

2025-04-24 23:30:10 824

原创 C 语言中的 volatile 关键字

在程序运行时,编译器通常会假设变量的值仅由当前线程或函数内的代码修改,并据此进行优化(如循环内变量提升、指令重排等)。此时,若未使用 volatile 修饰,编译器可能生成错误的优化代码,导致程序行为异常。volatile 是 C/C++ 语言中的一个类型修饰符,用于告知编译器:该变量的值可能会在程序控制流之外被意外修改(如硬件寄存器、多线程共享变量或信号处理函数等),因此编译器不应对其进行激进的优化(如缓存到寄存器或消除冗余读取)。测试,因为 ARM 是弱内存模型,更容易复现问题。

2025-04-16 23:56:25 639 1

原创 SylixOS 下优先级反转与解决方案

在优先级多任务系统中引入互斥方案,会导致任务优先级反转的问题:假如某时低优先级的任务占有资源,然后又有高优先级的任务申请资源,但因为不能满足而被挂起了,即低优先级任务阻塞了高优先级任务的运行。此时优先级最高的任务 A 不仅要等任务 C 运行完,还要等优先级低的任务 D 运行完才能被调度,如果任务 D 和任务 C 需要执行很长时间,那么任务 A 的执行就不能得到保证,整个系统的实时性能很差。将申请(占有)资源的任务的优先级提升到可能访问该资源的所有任务的最高优先级(这个最高优先级称为该资源的优先级天花板)。

2025-04-13 15:52:46 817

原创 SD 协议

本篇文章讲的只是和 SD 存储卡相关的内容。像 SDIO 这些不再详细讲解,只作为一个科普文用。如果需要详细的内容,还是推荐阅读SD Association 官网中的文档。

2025-04-13 12:19:51 811

原创 ARM 架构下 spin_lock 实现

本文深入解析自旋锁机制,探讨其在Linux内核中的应用,包括解决资源冲突、死锁预防及多核环境下公平性问题。详细介绍自旋锁的数据结构、实现原理及变体接口,适合操作系统与并发控制领域的研究者。

2025-04-12 16:04:32 831

原创 聊一聊原子操作和弱内存序

有些 cpu 为了提高性能,引入了一些优化手段,导致指令实际执行的 “效果” 可能与程序顺序不同,具有这种内存模型的 cpu 通常被称为 ”弱内存模型“。编译器对指令做重排序cache 一致性优化引入的乱序(可参考 ibm 的文章,看一下 store buffer 和 invalid queue 怎么影响指令执行顺序)指令多发射,有的流水线的指令由于没有阻塞而先执行,有的被阻塞了后执行从而导致顺序变化。

2025-04-12 12:07:13 778

原创 CAN 总线协议概述

在 CAN2.0B 中额外增加了扩展帧,它拥有 29 位标识符(ID),前 11 位与 CAN2.0A 的标识符相同,在此之后又增加了 18 位 CAN2.0B 专用的扩展标识符,其余结构完全相同,基于 2.0B 的总线网络既可以接收标准帧也可以接收扩展帧,但是在同一网络中通常只能出现一种帧格式,必须提前设定该网络是接收标准帧还是扩展帧,扩展帧结构如图 3-2 所示。时,发现总线实际电平和其发送的电平不一致,这时候,节点 A 会认为自己输掉了仲裁,会从一个发送节点转变为一个接收节点…

2025-03-30 09:22:26 1133

原创 SylixOS 中 select 原理及使用分析

select 是操作系统多路 I/O 复用技术实现的方式之一。select 函数允许程序监视多个文件描述符,等待所监视的一个或者多个文件描述符变为“准备好”的状态。所谓的”准备好“状态是指:文件描述符不再是阻塞状态,可以用于某类 IO 操作了,包括可读,可写,发生异常三种。

2025-03-26 22:09:45 917

原创 SPI 总线协议

SPI,是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。SPI,是一种高速的,全双工,同步的通信总线。主节点或子节点的数据在时钟上升沿或下降沿同步。主节点和子节点可以同时传输数据。SPI 接口可以是 3 线或 4 线。本文重点介绍流行的 4 线 SPI 接口。

2025-03-18 22:54:20 944

原创 I2C 总线协议

IIC(Inter-Integrated Circuit)协议也称为 I2C 总线,是一种串行通信协议,通常用于连接低速外设。它由 Philips(现在的NXP Semiconductors)公司于 1980 年代初开发,现在已经成为一个标准。IIC 总线只需要两条数据线,分别是串行数据线(SDA)和串行时钟线(SCL),这使得它成为一种非常简单的接口。I2C 有利于设计人员在系统的众多节点之间建立简单、双向、灵活的通信。I2C 仅使用两条双向线来发送和接收信息,从而降低了复杂性。

2025-03-17 23:14:37 1320

原创 PCI 总线学习笔记(四)

PCI 总线协议中的中断处理

2025-03-08 11:35:38 917

原创 ARM 架构下 cache 一致性问题整理

本篇文章主要整理 ARM 架构下,和 Cache 一致性相关的一些知识。本文假设读者具备一定的计算机体系结构和 Cache 相关基础知识,适合有相关背景的读者阅读。

2025-03-02 12:09:32 1559

原创 ARM 架构下的 cache invalid 问题

ARM 架构下的 Cache Invalid

2025-03-02 09:49:07 226

原创 分辨率、帧率和码率三者之间的关系

分辨率、帧率、码率之间的关系

2025-02-22 12:44:30 1316

原创 原码、反码、补码

原码、反码、补码

2025-02-22 11:00:22 565

原创 PCI 总线学习笔记(三)

BDF、BAR 空间、Primary、Secondary、Subordinate Bus Number Register、Base&Limit Register,PCI 总线树遍历

2025-01-24 18:01:56 955

原创 PCI 总线学习笔记(一)

PCI基础知识

2025-01-19 12:18:38 1010

原创 PCI 总线学习笔记(二)

PCI配置空间的访问、存储器域与PCI总线域地址

2025-01-19 12:17:48 935

原创 ARM 栈和函数调用

ARM 栈和函数调用

2024-09-21 16:20:04 1336

原创 如何理解栈的增长方向

函数调用栈,简称栈。不管是函数的执行还是函数调用,栈都起着非常重要的作用

2024-05-25 09:44:20 662

原创 Linux delay相关函数实现

这里讨论基于 ARM 处理器架构的实现,udelay 实现在arch/arm/include/asm/delay.h中。gcc 的内建函数 __builtin_constant_p 用于判断 n 是否为编译时常数,如果 n 是常数,返回 1,否则返回 0。当然,从注释中我们可以看到,include/linux/delay.h 目录下只是通用的实现,可以被架构相关的实现覆盖掉。至此,loops_per_jiffy 变量就已经计算完毕,后面的 udelay 、BogoMIPS 计算都会用到该变量。

2024-01-28 14:45:50 1271

原创 X86_64 栈和函数调用

Intel 系列处理器通常称为x86,目前常用的笔记本或台式机都是 64 位的处理器,这些处理器使用的机器语言一般都是 x86_64,我记得以前学习微机原理课的时候,学习的还是 8086 处理器上的汇编。8086 是Intel的第一代16位的处理器,只有8个16位的寄存器,而现在的 64 位处理器对其进行了扩展,共有16个64位的寄存器。需要注意这里的栈是倒着画的,栈顶在下面,栈顶的内存地址是更小的,换句话说栈增长的方向是内存地址减小的方向。寄存器,这个寄存器中存储着栈顶的地址。到这里,函数栈情况如下图。

2023-10-15 11:34:17 842

原创 可执行文件 elf 和 bin

在 Embedded(嵌入式)中,如果上电开始运行,没有 OS 系统,如果将 ELF 格式的文件烧写进去, 包含一些 ELF 文件的符号表字符表之类的section,运行碰到这些,就会导致失败,如果用 objcopy 生成纯粹的二进制文件,去除掉符号表之类的 section,只将代码段数据段保留下来,程序就可以一步一步运行。在Linux OS上,为了运行可执行文件,他们是遵循 ELF 格式的,通常 gcc -o test test.c,生成的 test 文件就是 ELF 格式的。ELF 文件并执行。

2023-10-05 13:41:58 914

原创 关于内存对齐你需要了解的事

这篇文章的目的是带你了解什么是内存对齐,具体的内存对齐的细节、处理方式、不同架构则不会去详细讲解,只做科普文用。内存对齐和数据在内存中的位置有关。内存对齐以字节为单位进行,一个变量的内存地址如果正好等于它的长度的整数倍,则称为自然对齐。比如在32位 cpu 下,一个 u32 的内存地址为0x00000004 ,则属于自然对齐。内存空间按照字节进行划分,理论上可以从任意地址开始读取,实际上会要求读取数据的首地址是某一个值的整数倍。

2023-10-05 13:26:46 2543

原创 动态链接那些事

动态链接那些事

2023-10-03 22:28:01 1421 2

原创 可执行文件的装载与进程

当我们在Linux系统的bash下输入一个命令执行某个ELF程序时,Linux系统是怎样装载这个ELF文件并且执行它的呢?首先在用户层面,bash进程会调用fork()系统调用创建一个新的进程,然后新的进程调用execve()系统调用执行指定的ELF文件,原先的bash进程继续返回等待刚才启动的新进程结束,然后继续等待用户输入命令。它的三个参数分别是被执行的程序文件名、执行参数和环境变量。在进入execve()系统调用之后,Linux内核就开始进行真正的装载工作。

2023-09-04 11:09:59 603

原创 静态链接过程

1、空间与地址的分配  现在的链接器空间分配的策略基本上都采用 “相似段合并” 的方式。通过将所有相同类型的 section 合并到一起,例如将所有输入目标文件的 .text 合并(按顺序合并)到输出文件的 .text 节中;然后,链接器根据运行平台中进程虚拟地址空间的划分规则,为所有输入目标文件中定义的节和符号分配运行时内存地址;完成之后,程序中的每条指令和符号都有唯一的运行时内存地址了。链接器的空间分配示意如下:  使用这种方法的链接器都采用两步链接的方法。  第一步,空间与地址分配。扫描所有的

2023-07-26 22:34:24 762

原创 ELF文件结构描述

经过上面的描述,我们了解到了强符号,弱符号,强引用,弱引用的概念。强符号可以替换弱符号。弱引用可以避免函数未定义的错误。强符号替换弱符号一些库中对外接口可以声明为弱符号。比如:实现一个 myadd(int num1,int num2) 接口,之后再将项目中的所有 add 替换为 myadd。这种方式可行,但是存在缺点:修改量大,并且后续人员不清楚背景,很有可能继续使用熟悉的 add 接口。更新 math 库,从更本解决此问题。这种方式比较推荐。

2023-07-22 16:57:08 405

原创 目标文件里有什么

1、目标文件  目标文件编译源代码后生成的文件叫做目标文件。

2023-07-21 23:40:47 371 2

原创 关于网络命令 ping 你了解多少

网络 ping 命令详解

2023-05-15 23:05:32 2975

原创 lwip - 链路层收发以太网数据帧

以太网帧中的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在后面补填充位。最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU,如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)。注意,MTU这个概念指数据帧中有效载荷的最大长度,不包括帧首部的长度。封装后的数据包称为数据帧,数据帧的封装的信息决定了数据如何传输。

2023-04-22 23:14:37 1603

原创 Linux内核之文件描述符、文件表、i-node table

前言文件描述符在unix系统中几乎无处不在网络接口 select、poll、epoll 涉及到文件描述符IO接口 read、write 也涉及到文件描述符从形式上来看文件描述就是一个整数,那么我们可不可以更进一步去了解一下呢?1、文件描述符是一个int型整数2、文件描述符创建是有一定的规则。在创建文件描述符的时候系统会在files_struct数组中,去找到一个当前没有被使用的一个最小下标,作为一个新的文件描述符。3、程序开始运行时,有三个文件被自动打开了,打开时分别使用了这三个文件描述符

2021-04-27 16:44:30 1082

原创 操作系统中的锁——信号量(同步信号量、互斥信号量)、P/V操作、自旋锁

面试中常会问及操作系统中锁的概念,这里就来讲解一下。

2021-03-23 15:31:41 2904 1

原创 C语言关键字、函数杂谈(1)

1、static关键字static关键的,是用来声明静态变量的。主要作用有两个:隐藏与隔离的作用(当同时编译多个文件)保持变量内容的持久性下面就这两个功能进行详解:(1)隐藏与隔离的作用(当同时编译多个文件):​  上面已经阐述过,全局变量虽然属于静态存储方式,但并不是静态变量。全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,全局变量在各个源文件中都是有效的。​​  如果我们希望全局变量仅限于在本源文件中使用,在其他源文件中不能引用,也就是说限制其作用域只在定义该变量的源文件

2021-03-22 21:20:48 746

空空如也

空空如也

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

TA关注的人

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