自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SylixOS 中的管道

创建一个命名管道可以使用 mkfifo 函数, mkfifo 函数指定了命名管道的设备文件路径,其他进程可以使用标准的文件打开函数——open 函数打开该命名管道,然后使用 read 函数和 write 函数对命名管道进行读和写操作。虽然匿名管道是一个文件,但匿名管道并不存在于文件系统中,所以匿名管道只能用于父子进程间的通信。没有血缘关系的进程,由于不存在文件描述符的继承,所以无法使用匿名管道进行通信,但可以使用命名管道进行通信。匿名管道只有两端口:读端和写端,并且只允许数据从写端流向读端,所以。

2025-12-09 20:09:22 566

原创 Linux 下的 time_before/time_after 接口

由于 jiffies 是一个 unsigned long 类型的全局计数器,在 HZ=1000(即每毫秒递增一次)的系统上,大约每 49.7 天就会发生一次回绕(wrap-around)。以 sunxi_mmc_reset_host 为例,expire 的生成时刻与之后在 time_before() 中读取到的 jiffies 之间的真实时间差只要小于 2。- 1,就能保证 (long)(a-b) 的结果符号是正确的,从而保证 time_before() 返回的先后判断是可靠的。

2025-11-30 18:54:22 1039

原创 虚拟化入门笔记

虚拟化技术是一种资源管理技术,它在下层计算资源与上层软件之间添加了一层抽象层,称为虚拟化层。虚拟化层负责分割、隔离并管理计算资源,并将资源划分为多个抽象的资源实例,提供给上层软件使用。上层软件拥有对抽象资源的完全控制权,然而,其对物理资源的使用会由虚拟化层进行调度和限制。这又让我想起了刚开始接触到计算机科学时,看见的一句话:计算机科学领域内的任何问题都可以通过增加一个间接的中间层来解决虚拟化是一项广泛应用的技术,它构成了几乎所有现代云计算和企业基础设施的基石。

2025-11-09 23:23:47 1071

原创 DMA 实践拾遗

最近在学习 ARM 的 AMBA 总线架构时,补上了过去对 DMA 传输机制的一些理解空白。借此机会,把这部分内容做一个简单的整理与记录,算是学习笔记,也方便后续查阅。ARM 总线技术 —— AHB。

2025-11-07 21:24:12 954

原创 ARM 总线技术 —— APB

本文的参考资料为官方文档 AMBA™3 APB Protocol specification。

2025-11-02 15:17:22 828

原创 ARM 总线技术 —— AMBA 入门

AMBA( Advanced Microcontroller Bus Architecture) 的全称是“高级微控制器总线架构”。它是一套开放标准,为芯片内部各个功能模块的连接与管理制定了规范,可以被看作是片上系统设计中的一套“交通规则”。简单来说,AMBA 协议的作用就是定义芯片内部不同功能单元之间如何“对话”和交流。如下图所示,这是一个典型的 SoC 设计。

2025-10-14 23:02:28 538

原创 ARM 总线技术 —— AHB

在数据传输的同时,主设备可以在下一时钟周期内发起新的地址阶段请求,从而实现地址与数据的重叠传输。为了提高总线的整体传输效率,AMBA AHB 总线协议引入了 突发传输(Burst Transfer) 机制,使得多个连续地址的数据可以在一次地址阶段后连续传输,从而显著减少地址译码的开销并提升带宽利用率。在基本的单次传输模式中,每次传输都需要先进行地址阶段和从设备选择阶段,因此在每笔数据传输前都会产生一定的等待时间,用于地址译码(Decode)和总线仲裁。的一个负效应是必需延长相应的下一笔传输的地址周期。

2025-10-14 23:01:23 996

原创 block DMA & scatter-gather DMA

上面提到的数据拆分,其实只是设备驱动层面的操作——驱动会根据硬件的 DMA 传输能力、物理地址的连续性以及应用层传入的缓冲区特征,将一次用户请求拆分成若干个物理上连续的片段(segment)。看到这里,我们就会发现,在有 IOMMU 的前提下,DMA 传输数据需要的源地址、目的地址发生了本质变化,不再是需要连续的物理地址了。从这里就可以发现,有了 IOMMU 之后,实际上,DMA 的源地址、目的地址,就不再是连续物理地址,而是虚拟地址了。我们这里以 SPI 控制器驱动为例,讲解 DMA 传输的拆分问题。

2025-10-12 09:39:10 1092

原创 Linux 内核态和用户态

在学习操作系统的过程中间,经常能听到内核态、用户态的说法,但是一直没有详细研究过。在 ARM32(ARMv7-A)架构中,虚拟地址空间的管理完全依赖于 MMU(Memory Management Unit) 的页表机制。系统通过页表将虚拟地址转换为物理地址,并通过页表项中的访问权限位控制访问权限。在 Linux 操作系统中,用户态(User Mode)与内核态(Kernel Mode)之间的。本篇文章中,对 ARM 架构相关的知识不会再做详细讲解,所有细节前面链接中的文章都有涉及。接口请求内核代为完成。

2025-10-07 17:59:31 772

原创 SylixOS 中的软件定时器

来实现的,所有操作都是围绕这两个链表进行,不同的是普通定时器等待唤醒链表是在线程上下文中判定时间和回调的,而高速定时器等待唤醒链表是在系统 Tick 中断中进行的,他俩的最小有效定时器精度通常为一个 Tick。SylixOS 里的软件定时器是通过。函数在 Tick 中断中被调用。是在线程中,去更新、维护、唤醒。函数中去更新、维护、唤醒。

2025-09-27 23:08:50 168

原创 ARM Synchronization Primitives

如果随后使用 Store Exclusive instruction 向一个已被标记为独占的地址进行写入操作,则该地址的独占状态将被清除。这里有一个重点,StoreExcl 指令必须依赖于一个在它之前、同线程内执行的 LoadExcl 指令才能有成功的机会,反之则不一定需要(每一个 LoadExcl 不一定非要有一个后续的 StoreExcl)。该标记随后被用于判断:一个已被 Local Monitor 放行的、针对该地址的 Store-Exclusive,是否最终可以执行。

2025-09-27 10:58:45 776

原创 SylixOS 的 RMS 调度

任务按单调速率优先级分配(RMPA)的调度算法,称为单调速率调度(RMS)。RMPA 是指任务的优先级按任务周期 T 来分配。它根据任务的执行周期的长短来决定调度优先级,那些具有小的执行周期的任务具有较高的优先级,周期长的任务优先级低。更详细的讲解,以及 RMS 的案例,请阅读文档:单调速率调度(RMS)算法。

2025-09-24 19:21:49 275

原创 单调速率调度(RMS)算法

两个进程的总 CPU 利用率为 (25/50)+(35/80)=0.94,因此似乎合乎逻辑的结论是:这两个进程可以被调度,并且仍让 CPU 有 6% 的可用时间。如果我们按执行与周期的比率 ti/ρi 测量一个进程的 CPU 利用率,那么 P1 的 CPU 利用率 20/50 = 0.40,P2 的是 35/100 = 0.35,总的 CPU 利用率为 75%。尽管是最优的,然而单调速率调度有一个限制,CPU 的利用率是有限的,并不总是可能完全最大化 CPU 资源。我们接下来分析一组进程,它们。

2025-09-24 19:20:41 1256

原创 嵌入式系统启动流程

这里说的 “三级引导” 并不是一个固定的、标准的术语,而是想强调,在某些系统里,bootloader 可以再拆得更细,例如。BootROM 不是严格意义上“只能从 ROM 启动操作系统” 的意思,而是指芯片上电复位后,第一段固定的启动程序,通常固化在 ROM(只读存储器)或 mask ROM、OTP ROM,甚至是 eFuse 或者内嵌 Flash 中。可以是单级的,也可以是多级分层的。对 Armv7 中的 TrustZone(TZ)进行了提高,补充了启动过程信任链的传导,细化了运行过程的特权级区间。

2025-09-14 21:01:00 1128

原创 SylixOS 调度浅析

每个 CPU 如果需要被调度,即进行 CPU 任务上下文切换,有两种情况:主动调度、被动调度对于多核 CPU 来说,如何通知某个 CPU,它需要被调度?通过 IPI 中断如下图所示。上面的解释中有优先级卷绕如果原先候选表 CAND_ptcbCand 中已经存有线程,而又出现有一个优先级高于“候选表中线程”的线程就绪,会产生优先级卷绕并将 CPU 的优先级卷绕标志位设置为 1并且替换候选表中的线程,把原先存于候选表中的线程放回到就绪表中。

2025-09-07 15:44:34 929

原创 U-Boot 多 CPU 执行状态引导

  在实际项目开发中,经常遇见,uboot 引导 Linux 内核时,uboot 和 Linux 所处执行模式有所区别。uboot 无法直接通过跳转到 Linux 内核镜像地址运行。而是需要经过相关转换,将处理器执行模式(AArch64 或者 AArch32)进行切换,切换后再跳转运行。vmlinuxImageuImage拓展:比较常见的内核镜像文件,还有一个叫:zImagezImage 是压缩过的内核镜像,主要用于减小内核体积,方便引导。生成方式:工作原理:特点:mkimage 与 Image / zIm

2025-09-06 16:31:22 851

原创 SylixOS 下的信号系统

信号是一种软中断,用来通知进程或者线程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程或者线程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是一种异步通信机制,一个进程或者线程不必通过任何操作来等待信号的到达,事实上,进程或者线程也不知道信号到底什么时候到达。进程之间可以互相 kill 函数发送信号。内核也可以因为内部事件而给进程或者线程发送信号,通知进程或者线程发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。

2025-09-02 22:49:55 823

原创 ARM 学习笔记(四)

多数底层优化机制(如乱序执行、推测执行、多发射等)对软件开发者而言是透明的,无需显式关注;然而,部分优化会对程序行为产生可观察影响。为保障正确性,体系结构也提供了如内存屏障等机制,使开发者可以显式控制这些影响。当然这里也包括ARM 学习笔记(三)中所讲的内存类型。阅读到这里,建议再看一下ARM 架构下 cache 一致性问题整理一文,可能会有不一样的体会。

2025-07-24 23:13:36 1023

原创 ARM 学习笔记(三)

参考文献:《ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition》

2025-07-20 17:17:44 718

原创 ARM 学习笔记(二)

参考文献:《ARM ArchitectureReference Manual ARMv7-A and ARMv7-R edition》

2025-07-20 10:48:07 1367

原创 SylixOS 下的中断嵌套

那如果当 ARM 处理 FIQ 模式,fiq pin 又来中断信号,也就是又一批公安来了,那没戏,都是执法人员,你打不断我。当你跳到异常向量表,处于 IRQ 的模式的时候,此时如果 irq pin上面又来中断信号,此时 ARM 是不会理你的,irq pin 就像秘书,ARM 核心就像老板,老板本来在做事,然后来了一个客户,秘书打断它,让客户进去。实际上,众多的 RTOS,为了达到中断嵌套的目的,通常会在软件上,进入 IRQ 中断处理后,手动将当前核的中断打开,也就是置 CPSR 的 I 位为 0。

2025-07-13 17:40:36 1121

原创 ARM 学习笔记(一)

本篇文章,皆以 ARMV7-A 架构为例进行讲解。

2025-07-06 15:48:59 1205

原创 C 中的 uintptr_t 类型

总结一句话,intptr_tuintptr_r变量类型用于跨平台的情况下,不同机器字长(16位、32位、64位)整数与指针相互转移的的通用性。通常情况下,编译器内部都会提供intptr_t等定义。如果编译器没有提供,则标准库会根据架构用 typedef 自己定义。

2025-07-05 11:15:42 1710

原创 一个非对齐访问的问题

处理器访存指令所发出的内存地址如果不是被访问的数据类型位宽的整数倍,称为非对齐访问。处理器访存指令支持字节访问(8bit),半字访问(16bit),字访问(32bit),双字访问(64bit)等,处理器的存储空间最小单位为字节,因此除了。还是以 ARMV7 架构为例,从下面的图我们也可以看到,之前出现了非对其访问异常,就是因为使用了。对于处理器硬件而言是否支持非对齐,如果出现非对齐访问时如何操作,需要有明确的规定。这里的 ptr 是一个非 4 字节对齐的地址!指令进行字节访问,不需要对齐。

2025-07-02 19:36:35 875

原创 深入 ARM-Linux 的系统调用世界

上面的这套宏系统的作用,在汇编文件。

2025-06-30 20:30:10 991

原创 Linux 下的 regulator 子系统

regulator 框架是 Linux 内核中用于管理电压和电流调节器(如 LDO、DCDC 转换器等)的一个子系统。它提供了一个抽象层,使得驱动程序和内核的其他部分可以以一致的方式与调节器进行交互,而无需了解底层硬件的细节。控制电压的启停调整输出电压查询当前电压状态保护系统不受过流或过压的影响以上两种方式,regulator driver 可以根据实际情况,选择一种实现方式。

2025-06-29 10:37:22 1432

原创 关于大小端的理解

想象这样一个问题,对于一个 4 字节的 int 型整数,它在内存中的排列顺序(字节序)是什么样的呢?这里提前下一个定义,字节序指的是,多字节数据的内存排列顺序。涉及到多个字节联合表示一个数据,因此就有了大小端的概念区分大端模式(big-endian): 数值的高位字节存放在内存的低地址端, 低位字节存放在内存的高地址端 (可方便记忆为: 因为符合人类从左至右的阅读习惯, 所以叫大端)内存低地址 ------ > 内存高地址高位字节 < -------- 低位字节小端模式。

2025-06-26 10:19:10 172

原创 Linux 下的 socket

Socket,中文常称为“套接字”,是 UNIX 操作系统中引入的一种通信抽象接口,用于支持不同进程之间,特别是不同主机之间的通信。在 UNIX 哲学中,“一切皆文件”,包括网络通信也不例外。Socket 就是这种设计理念的延伸 —— 它被视为一种“特殊的文件”,可以通过经典的打开(open)→ 读写(read/write)→ 关闭(close) 的方式进行操作。🧱Socket 的起源与设计初衷。

2025-06-22 23:24:25 1043

原创 linux 共享内存

共享内存是一种在多个进程或线程之间共享数据的机制。它允许不同的进程或线程可以直接读取和写入同一块内存区域,从而实现高效的数据共享和通信。常见的应用场景包括并行计算、多线程编程、分布式系统等。共享内存的优势避免复制大量数据(内存拷贝),减少了通信开销,非常适合处理图像、视频、音频等高吞吐量场景数据一写入共享区,其他进程立即可以读取,提高了响应速度,适合对时效性要求高的系统减少系统调用,提高程序效率(需要配合 mmap 接口使用)缺点共享内存本身没有提供任何同步/互斥的功能。

2025-06-22 13:36:15 473

原创 CPU Cache 的映射与寻址

CPU Cache的组织结构:CPU Cache 被划分成多个组 Set,每个 Set 中还可以有多个行 Cache Line,需要注意的是 Cache Line 是 CPU Cache 中的基本缓存单位,也有人叫它块(Block),也就是说它每次读写不是一个字节的去读写,而是以 Cache Line 为单位,一块块地去读取。所以,当我们访问 Block0 地址时,cache 会缺失(cache miss),然后数据会从主存中加载到 cache 中第 0 行 cache line。

2025-06-21 22:20:39 1245

原创 SylixOS 下的消息队列

消息队列(Message Queue) 是 Linux 提供的一种进程间通信(IPC)机制,允许进程通过发送和接收消息块来进行数据交换。与管道、共享内存不同,消息队列具有结构化、非阻塞和优先级控制等特点。MQ 采用链表来实现消息队列,该链表是由系统内核维护,系统中可能有很多的 MQ,每个 MQ 用消息队列描述符(消息队列 ID)来区分。在进行任务间通信时,一个任务将消息加到 MQ 尾端,另一个任务从消息队列中取消息(不一定以先进先出来取消息,也可以按照消息类型字段取消息),这样就实现了任务间的通信。

2025-06-21 12:29:56 715

原创 SylixOS 下的工作队列

系统工作队列相比于内核工作队列,不仅提供了执行线程,还提供了延时执行的功能,更便于被直接调用,是一种系统级调用接口。内核工作队列提供的则是更基础的调用方法,是一种半成品。对于一些不适合直接使用系统工作队列的地方,可以在内核工作队列的基础上构造自己独享的工作队列模块,如网络接收处理和系统中断下半部执行等都是基于内核工作队列单独实现的。中,是纯粹的针对工作队列对象的一些操作集合,供内核使用,系统工作队列和网络工作队列都是基于内核工作队列实现的。内核工作队列文件中并没有这个操作,通常由具体使用者去创建。

2025-06-17 20:21:36 633

原创 SylixOS armv7 任务切换

SylixOS 操作系统下,任务切换可以分为两种下面分别讲讲这两种切换。

2025-06-15 16:43:55 455

原创 Linux 下自旋锁 spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析

但这会带来另一个问题,就是如果自旋锁所保护的临界区执行时间太长,当前核一直处于关中断状态,会极大影响操作系统的实时性。该函数增加了一个参数,即在关闭当前核中断之前,将当前核的中断状态保存在 flags 变量中。想象这样一个场景,一个外设处理线程正在尝试获取自旋锁 A,而这时外设中断产生,中断处理里面也尝试获取这把锁 A,就会出现死锁的现象。解锁时,不会直接打开当前核中断,只会恢复上一次 cpsr 寄存器的值(也就是入参 flags)。,把当前核的中断强行打开了,这会带来不可预知的问题!

2025-06-13 19:59:20 1253

原创 Linux 下 pcie 初始化设备枚举流程代码分析

以 rk3568 pcie 代码为例,简要介绍一下 pcie 初始化设备枚举的过程。比较重要的函数,就是,这两个函数是递归的核心。

2025-06-12 23:25:12 1259

原创 深入理解 PCIe 协议中 BDF(Bus/Device/Function)分配与管理机制

RC 发出的访问Endpoint 设备需要经过各级桥设备的 ID 路由来响应 RC与 RC 直连的桥设备,不需要经过路由,直接根据硬件的 Device 号响应 RC不与 RC 直连的桥设备,依赖其上级桥设备的 ID 路由响应 RC。例如,当前桥设备为 A,该桥设备的上一级桥设备为 B。

2025-06-12 00:01:15 1947

原创 Linux 下 DMA 内存映射浅析

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

2025-06-08 10:44:03 1900

原创 Linux 下关于 ioremap 系列接口

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

2025-06-07 18:45:26 1125

原创 PCIe 总线事务层

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

2025-06-07 15:14:34 1414

原创 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 2945

空空如也

空空如也

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

TA关注的人

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