- 博客(157)
- 收藏
- 关注
原创 ARMv8 架构下的刷 Cache 操作
dsb sycache maintenance 指令不是普通函数调用意义上的同步点。执行到下一条指令,不代表维护操作对系统其他观察者已经完成。DSB的作用是等待前面的 cache maintenance 完成,再继续执行后续代码。对于 DMA 场景,这个屏障非常关键。否则代码可能先启动了 DMA,而 clean 还没有真正完成,设备仍然可能读到旧数据。
2026-07-05 10:48:42
302
原创 硬盘的总线协议与接口(SATA、NVMe、PCIe)
总是分不清 PCIe、SATA、mSATA、SAS、NVMe、M.2、AHCI?PCIeSATAmSATASASNVMeM.2AHCI问题不在于定义难记,而在于这些词本来就不在同一层。其中有的是总线,有的是协议,有的是接口。现实交流中又经常跨层使用,所以很容易混淆。主要是协议,主要是接口;在严格分层时主要属于总线,但在日常语境里也常直接指接口、插槽或整套标准。M.2(以前也叫NGFF)是接口。它不是协议,也不是总线。M.2接口外形连接器形式PCIeSATASAS,严格分层时更偏总线。
2026-06-28 21:46:42
345
原创 深入理解 ARMv8-A|Application Binary Interface (ABI)
ARM 架构的应用二进制接口(ABI)为所有原生可执行代码模块制定了一套必须遵循的基础规则,以确保它们能够正确地进行协同工作。在此基础上,针对特定的编程语言(如 C++),ABI 还会提供额外的补充规范。此外,不同的操作系统或运行环境(例如 Linux)为了满足自身的特定需求,也可能会在 ARM ABI 基础规范之上,进一步定义附加的规则。ELF(可执行与可链接格式)
2026-06-07 21:33:02
363
原创 深入理解 ARMv8-A|异常/中断处理
参考:《ARM Cortex-A Series Version: 1.0 Programmer’s Guide for ARMv8-A》《Arm Architecture Reference Manual Armv8, for Armv8-A architecture profile》 在日常交流中我们常说"中断",但在 ARM 的术语体系中,打断软件执行流的所有事件统称为异常(exception),中断只是异常的一个子集。更精确地讲: 理清这个关系后,下文将统一使用 ARM 的标准术语——异常。A
2026-05-31 22:55:20
451
原创 深入理解 ARMv8-A|处理器模式与寄存器
本文主要从 ARM 汇编的使用者角度,系统地介绍 ARMv8-A (AArch64) 架构的核心知识。首先讲解异常级别(Exception Level)与执行状态的切换机制;接着深入介绍各种通用寄存器、特殊寄存器和系统寄存器,并在此基础上详解异常处理的完整流程;随后概述 A64 指令集的主要指令类别、AAPCS64 调用惯例以及汇编宏的使用方法;最后以一段裸机启动汇编代码的逐行分析结束全文。参考:《ARM Cortex-A Series Version: 1.0 Programmer’s Guide fo
2026-05-31 14:42:42
390
原创 深入理解 ARMv7-A|异常/中断处理
ARMv7-A 处理器的核心竞争力之一,在于它对 **同步异常** 和 **异步中断** 有着一套设计精巧、层级分明、硬件高度自动化的处理机制。理解这套机制,是后续学习操作系统内核、驱动开发、虚拟化以及安全扩展的必备基础。
2026-05-24 14:54:03
503
原创 Armv8-A virtualization 笔记 (二)
同步异常(Synchronous)由指令执行直接产生,可预测且精确。异常返回地址指向触发该异常的指令。未定义指令、指令/数据中止、对齐错误系统调用(SVC / HVC / SMC)断点/观察点(BKPT)异步异常(Asynchronous)不由当前指令流直接产生,不可预测。异常返回地址不保证指向触发源。IRQ(普通中断)FIQ(快速中断)SError(系统错误:总线错误、奇偶校验错误等)
2026-05-16 18:12:40
499
原创 ARM GICv3 学习笔记(一)
本文是 ARM GICv3 学习笔记系列的第一篇,系统梳理 GICv3 的中断类型、硬件架构、状态机模型、亲和性路由、安全模型以及中断处理流程。
2026-05-15 23:16:33
466
原创 Armv8-A virtualization 笔记 (一)
陷阱是一种机制,当执行特定动作(例如读取某个寄存器)时,会强制触发一个异常。Hypervisor 需要利用这种能力来拦截 VM 中配置底层控制的操作,并在不干扰其他 VM 的前提下对其进行模拟。ARM 架构包含陷阱控制功能,用于拦截 VM 内的操作并由 Hypervisor 进行模拟。一旦设置了陷阱,执行原本被允许的操作就会触发异常,并将控制权移交给更高异常级别(Exception Level)的软件。Hypervisor 正是利用这些陷阱来实现对 VM 内部操作的模拟。
2026-05-06 22:09:49
446
原创 C 语言类型强转引发的隐蔽内存破坏问题分析
Release 版本改变了栈布局、重排变量、使用寄存器缓存数据。随机问题 / 编译器问题 / 栈问题 / 多线程问题。把 1 字节变量当成 8 字节变量,然后越界写。sp+23 ~ sp+30 (连续 8 字节)原因: printf 会影响栈布局。a + y + x 的一部分。👉 x 和 y 都被破坏了。
2026-04-30 23:30:09
248
原创 从设备树到驱动源码:揭秘嵌入式 Linux 中 MMC 子系统的统一与差异
虽然我们在上一章提到 MMC/SD/eMMC 在理论上拥有共同的接口规范,但在实际的芯片设计中,硬件控制器的最终定义权掌握在 SoC 厂商手中。追求极致性能:厂商可能设计了私有的 DMA 引擎或流水线优化,标准的 SDHCI 寄存器无法描述这些高级特性。历史遗留或架构差异:某些早期的 IP 核或特定架构(如某些 ARM PL081 DMA 配合 MMC)并不兼容 SDHCI 的寄存器映射。成本与面积考量:为了节省芯片面积,厂商可能会裁剪掉 SDHCI 中某些“非必需”的功能位。
2026-04-19 00:00:40
506
原创 别再把 PCIe 的 inbound/outbound、iATU 和 eDMA 混为一谈
PCIe 内部 DMA (eDMA)是 SoC 系统中实现高性能数据传输的关键技术,它允许 PCIe 控制器作为总线主设备,在不依赖 CPU 干预的情况下,直接在设备内存与系统内存之间搬运数据。本文将深入剖析其工作原理,特别是源/目的地址的配置、Inbound/Outbound 地址转换单元的作用,以及数据在芯片内部的真实流动路径。iATU 的地址转换是双向的,通常分为 Outbound 和 Inbound 两个方向。💡 关键理解:这两个方向的定义是以 CPU(主机/Root Complex)为参考系的。
2026-04-11 12:36:05
494
原创 UEFI + GRUB 引导过程初探
在近期进行的板卡调试工作中,我们遇到了一个基于 UEFI 固件与 GRUB 引导程序协同启动的场景。为了适配特定的启动需求,需要在 GRUB 配置中添加一条自定义引导项。这一过程并非一帆风顺,其中涉及到的几个关键问题与排查思路颇具代表性,值得深入复盘与记录。
2026-04-11 00:13:26
467
原创 深入理解组播
由于 IP 地址有 28 位有效位(去掉前 4 位),而 MAC 地址只映射了 23 位,这意味着有 32 个组播 IP 会映射到同一个 MAC 地址上。这就是所谓的“哈希冲突”。在网络编程和系统开发中,我们习惯了“一对一”的单播通信。MAC 控制器中,对于组播和单播的过滤方法,可以手动去选择控制。作为一个熟悉驱动开发的工程师,你可能会问:“网卡是怎么处理这些包的?如果我们用 Wireshark 抓包,你会发现一个有趣的事实:组播数据包的结构,和单播数据包。很多开发者对组播的理解停留在“一对多”的概念上。
2026-04-06 23:06:19
455
原创 SylixOS 线程创建
在日常开发中,我们频繁使用线程,但往往只关注业务逻辑。线程从创建到销毁,在操作系统内核层面究竟经历了什么?本文将结合源码,深入剖析线程的生命周期,重点解读线程创建时的资源分配、独特的“外壳函数”机制以及线程退出的底层逻辑。线程不是裸奔的:每一个用户线程都被包裹在之中。这解释了为什么在系统发生异常或打印堆栈回溯(Backtrace)时,最底层的函数往往都是。它是线程的“地基”自动销毁机制:在 SylixOS 等现代 RTOS 中,线程函数 return 并不意味着直接退出,而是返回到。
2026-04-06 18:49:02
201
原创 Flash 块设备驱动开发
在嵌入式 Linux 中,Flash 的管理依赖一套清晰的分层设计。硬件层:我们已经学习了 NOR 和 NAND 的物理结构差异(浮栅晶体管、并联 vs 串联)、读写擦除的电气特性(XIP、页/块操作、先擦后写)。软件层:我们将看到 Linux 内核如何通过子系统,将这些硬件差异抽象成统一的接口。🔹 硬件回顾Flash 分为两大类:支持随机读取(XIP)按块 block 擦除类似“只读内存”按 page 读写、block 擦除存在坏块需要 ECC🔹 软件层目标。
2026-04-05 17:12:19
481
原创 一文读懂 Flash 底层原理
浮栅晶体管可以看作是一个“带记忆的开关”。在普通 MOS 晶体管的基础上,它多了一层关键结构——浮栅(Floating Gate)。控制栅(Control Gate):外部施加电压的入口绝缘层(Interpoly Oxide):隔绝电子浮栅(Floating Gate):被绝缘层完全包裹,用来存储电子隧穿氧化层(Tunnel Oxide):电子进出浮栅的“通道”(可以理解为一种特殊的绝缘层)源极(Source) / 漏极(Drain):电流通路P-well(P型阱)
2026-04-04 12:13:30
745
原创 SylixOS 多核启动
关于多核启动的基本机制,前文中已经进行了较为详细的分析,这里不再展开。本篇文章的重点在于:在操作系统启动完成后,多核之间是如何进行协同工作的,以及各个 CPU 是如何进入多任务调度状态的。主核如何完成系统初始化并进入调度从核如何被唤醒并参与系统运行多核之间如何进行同步与协作以下内容均基于 ARMv7 架构进行说明。
2026-03-28 19:14:29
419
原创 SylixOS 中的块设备驱动
在操作系统中,设备管理是内核最基础、也是最关键的功能之一。为了屏蔽不同硬件之间的差异,操作系统通常会对设备进行抽象建模,并按照访问方式和数据组织形式,将设备划分为若干类型。字符设备块设备和网络设备。其中,块设备(Block Device)是存储系统的核心组成部分,直接承载了文件系统与物理存储介质之间的数据交互。以块为单位传输数据:通常以 512 字节或 4KB 作为基本单位(扇区)。即使应用层发起非对齐访问请求,内核也会在块层进行对齐、填充与裁剪处理支持随机访问。
2026-03-28 16:11:18
293
原创 SylixOS 中的异常处理
本文以 Data Abort 异常为例进行分析。原因是:后续异常处理将在 SYS 模式运行,而 SYS 模式下的 SP / LR 可能会被修改,因此需要提前保存。注意,这里必须要将寄存器上下文保存在 TCB 中。因为异常退出时,CPU 执行的任务,不一定会是之前被打断的任务。,分析系统是如何完成异常捕获、异常上下文保存以及异常处理流程的。SylixOS 提供了一套 平台无关的异常处理框架。在 ARMv7 架构中,处理器通过。为例,介绍异常处理机制,并结合。即之前保存的异常上下文。随后进入异常入口代码。
2026-03-15 23:25:11
435
原创 深入 LWIP:数据是如何被封装并发送出去的
当应用程序调用:这条数据会在协议栈中经历以下几个层次:最终数据被封装成 以太网帧,通过网卡发送到物理网络。send -> lwip_sendto该函数主要功能:2.2 传输层(UDP)netconn_send -> lwip_netconn_do_send -> udp_sendto该函数主要功能:udp_sendto_if该函数主要功能:udp_sendto_if_src是 UDP 发送流程中最底层、最核心的实现函数。它的主要职责是:2.3 网络层(IP)ip_output_if_src它的
2026-03-15 12:11:08
437
原创 SylixOS 字符设备驱动
字符设备驱动安装接口相关信息位于“libsylixos/SylixOS/system/ioLib/ioSys.c”文件中,SylixOS 为驱动安装提供了三组接口。每一个具体的字符设备,都需要对应一个设备控制块(Device Control Block)。此类设备的数据访问通常是顺序访问,无法像块设备那样对设备内部的某一位置进行随机读写。在 SylixOS 中,每个字符设备都会在 /dev 目录下对应一个设备文件(Device Node)。后续设备实例在创建时,需要与该驱动号进行绑定。
2026-03-14 13:26:28
417
原创 理解 block 与 sector
在嵌入式系统学习和操作系统学习中,经常会遇到 sector 和 block 这两个概念。文件系统中有 block,硬盘中有 sector,SD 卡协议里又有 block。这些名称看似相似,大小常常也是 512 或 4096 字节,但它们究竟是不是同一个东西?如果不是,又分别属于哪个层次?
2026-03-01 11:57:49
749
原创 SylixOS 中的虚拟网桥
从实现机制来看,虚拟网桥并没有改变物理网卡 eth0 和 eth1 的驱动本质。网卡硬件仍然正常工作,中断机制依旧存在,发送路径也未被破坏。真正发生变化的是数据接收路径——原本属于各自网卡的接收处理函数被重定向为统一的 netbr_input 函数。正是这一“接管”动作,使多个物理接口在逻辑上被整合为一个统一的二层转发域。在 netbr_input 中,数据帧的去向不再由单一网卡决定,而是通过 MAC 地址表完成转发决策。
2026-02-27 22:36:55
676
原创 深入理解 xv6 文件系统(从磁盘布局到日志机制)
函数名功能binit初始化缓冲区缓存bget获取指定块的缓冲对象bread读取磁盘块bwrite写入磁盘块brelse释放缓冲对象bpin锁定缓冲对象bunpin解锁缓冲对象binit接口,启动时调用一次。初始化双向链表将所有 struct buf 结构体链接到空闲链表中初始化每个 buffer 的自旋锁 (lock) 和条件变量 (cv),为并发访问做准备void/* 采用头插法,创建双向循环链表 */b++){bread。
2026-02-26 19:40:04
689
原创 链接脚本入门
SECTIONS/* 定义第一个输出段:.text */.text : {*(.text) /* 收集所有输入文件的 .text 段 */*(.rodata) /* 顺便把只读数据也放进来 */} > FLASH/* 定义第二个输出段:.data */*(.data)} > RAM/* 定义丢弃规则 */每一个输出段的定义(如段名 (Section Name):例如.text.data(type)或(type):指定段类型,如 (NOLOAD) 表示该段在文件中不占空间(常用于.bss。
2026-02-25 19:07:37
719
原创 文件系统(一)——分区表
在计算机启动的“第一秒”,操作系统尚未加载,CPU 刚刚通电,整个系统处于最原始的状态——此时,是谁告诉电脑“从哪里开始运行”?答案就藏在硬盘的第一个扇区里。从早期的 MBR(主引导记录)到现代的 GPT(GUID 分区表),磁盘分区方案不仅决定了我们能用多大的硬盘、分多少个区,更深刻影响着系统的启动方式、数据安全性和兼容性。
2026-02-14 16:18:56
759
原创 关于家用路由器的一些知识
如今,无论是家用路由器还是中高端网关设备,多数 SoC 都选择 集成多个 MAC,并通过外置 PHY 或交换芯片进行扩展,以获得更灵活的端口划分和更高的吞吐能力。例如,在家庭环境中,若二楼的无线信号较弱,可以通过在二楼放置一个 AP 设备,并使用网线(也可以使用无线桥接)将其连接至一楼的路由器上。这样,二楼的设备便能无缝接入无线网络(AP 的无线网络,不是一楼路由器上的无线网络),享受稳定的网络服务。,因此通过 AP 上网的设备将获取上级路由分配的 IP 地址,无法直接管理 AP 设备本身。
2026-02-12 15:36:22
947
1
原创 Windows 网络共享(ICS)详解
即 Internet 连接共享,是 Windows 系统内置的一项功能,用于:将一块已经联网的网卡的网络能力,共享给另一块(或多块)未联网的网络接口。通俗一点说:ICS 的作用,是让一台 Windows 电脑 “临时充当一台路由器”。
2026-02-09 00:01:51
837
原创 VMware 三种网络模式(桥接 / NAT / Host-Only)原理与实验解析
网上关于 VMware 桥接(Bridged)、NAT、仅主机(Host-Only) 三种网络模式的文章很多,但大多停留在概念层面,文字描述较多,拓扑与数据流向不直观,初学者往往“看懂了字,却没真正理解网络是怎么走的”。本文将结合 实验用例 + 简化拓扑图,从网络组成和数据转发角度,系统剖析这三种模式的工作原理与核心区别。实验环境说明VMware 运行在 Windows Host OS 上VMware 中运行 Ubuntu Linux 虚拟机。
2026-02-07 20:56:36
978
原创 静态路由探究
路由表(Routing Table) 是存储在路由器或主机中的一张逻辑表,用于描述:“去往某个目标网络 / 主机,应该从哪个接口发出,交给谁(下一跳)”简单一句话:路由表决定了 IP 数据包“往哪走、从哪走、交给谁”由管理员手工配置(静态路由)也可以由路由协议自动学习(动态路由,如 OSPF、RIP、BGP)本文主要讨论 Linux 下的静态路由表。当多条路由都能匹配同一个目标 IP 时,Linux 使用:最长前缀匹配原则(Longest Prefix Match)主机路由 /32。
2026-02-05 19:23:45
640
原创 ACRN Hypervisor 简介
由于设备可能需要在多个 VM 之间共享,ACRN 通过 device emulation(设备模拟) 的方式,为 VM 及其 Guest OS 提供对共享设备的访问能力。a. Hypervisor 内部的 device emulation在这种方案中,device emulation 直接实现于 hypervisor 内部。VMware Workstation(基于 Host OS 的 hypervisor)采用了这种方式。以及其他必要的平台设备。
2026-01-31 19:02:37
774
原创 理解 协程 概念
协程(Coroutine)协程之间协作式调度(不会被抢占)切换发生在用户态,不进入内核能在函数执行过程中主动让出并恢复执行从本质上看,协程做的事情只有一件:保存当前执行上下文 → 切换到另一个上下文 → 在未来某个时刻再切回来继续执行✅ 1. 可读性(最大优势)你写的是“流程”,而不是“调度逻辑”。✅ 2. 极低的切换成本只保存寄存器和栈指针不进入内核不触发线程调度在 IO 密集场景下,性能通常显著优于 pthread协程并不是银弹,也不是为了替代线程。
2026-01-25 18:09:52
389
原创 ARM 架构中的内存屏障
即使数据尚未真正写入物理内存,只要系统能保证最终可见性,其状态仍然是可预测的,因此通常不需要 DSB 这样的强约束。数据访问包括普通的加载操作(load)和存储操作(store),也包括数据高速缓存(data cache)维护指令(因为它也算数据访问指令)我们这里不要去纠结,不管数据访问是否执行结束,只要是 DMB 指定的作用域内,都能看到 DMB 屏障之前的访存操作的结果,记住这一点就可以。在程序顺序上位于 DMB 之前的显式内存访问,在可见性上先于 DMB 之后的内存访问被观察到。
2026-01-24 11:30:50
1120
1
原创 深入 QEMU Guest Agent:虚拟机内外通信的隐形纽带
在虚拟化世界中,虚拟机(VM)常被视为一个“黑盒”——宿主机可以分配 CPU、内存和磁盘资源,却难以感知其内部状态:操作系统是否正常运行?文件系统是否已挂载?IP 地址是什么?关键进程是否卡死?早期方案多依赖 SSH、SNMP 或自研代理,但普遍存在安全风险高、侵入性强、缺乏统一标准等问题。直到的出现,才为这一难题提供了一种轻量、安全且高度标准化的解决方案。QGA 是一个运行在虚拟机内部的轻量级守护进程,通过 virtio-serial 虚拟串口通道与宿主机通信,对外暴露一组基于JSON-RPC。
2026-01-11 17:44:22
877
原创 SylixOS 中的 Unix Socket
Unix Domain Socket(简称 Unix Socket)是一种在同一主机内进行进程间通信(IPC)的高效机制。与网络套接字不同,它不依赖 IP 协议栈,而是通过文件系统路径(或抽象命名空间)作为地址标识,实现本地进程间的可靠或不可靠通信。零网络开销;支持流式(SOCK_STREAM)和数据报(SOCK_DGRAM)两种语义可传递文件描述符、凭证等高级特性(本文暂不展开)。本文将从接口使用、内核对象模型和通信流程三个层面,深入剖析 Unix Socket 的实现机制。地址即索引。
2026-01-10 17:16:30
870
原创 SylixOS 中的管道
创建一个命名管道可以使用 mkfifo 函数, mkfifo 函数指定了命名管道的设备文件路径,其他进程可以使用标准的文件打开函数——open 函数打开该命名管道,然后使用 read 函数和 write 函数对命名管道进行读和写操作。虽然匿名管道是一个文件,但匿名管道并不存在于文件系统中,所以匿名管道只能用于父子进程间的通信。没有血缘关系的进程,由于不存在文件描述符的继承,所以无法使用匿名管道进行通信,但可以使用命名管道进行通信。匿名管道只有两端口:读端和写端,并且只允许数据从写端流向读端,所以。
2025-12-09 20:09:22
624
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅