自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(81)
  • 问答 (1)
  • 收藏
  • 关注

原创 RISC-V内存一致性模型

全局内存顺序是所有 hart 生成的内存操作的总顺序。通常,多线程程序有许多不同的可能执行,每个执行逻辑都有自己对应的全局内存顺序。全局内存顺序是在内存指令生成的原始加载和存储操作上定义的,任何满所有内存模型约束的执行都是合法执行。

2026-06-22 10:24:48 185

原创 OpenSBI相关内容理解与分析系列(5):SRAM内存划分

硬件级隔离:基于硬件的内存保护,安全性高灵活配置:支持多种地址匹配模式和权限组合性能优势:保护检查由硬件完成,零软件开销架构扩展:支持虚拟化和安全扩展。

2026-06-16 09:21:47 338

原创 OpenSBI相关内容理解与分析系列(4):Kernel中的SBI代码分析

endif。

2026-06-16 09:21:05 351

原创 OpenSBI相关内容理解与分析系列(3):OpenSBI兼容性分析

生态稳定性:软件可以稳定运行在不同版本的OpenSBI上平滑升级:用户可以升级OpenSBI而无需修改上层软件硬件抽象:屏蔽硬件差异,提供统一接口功能扩展:通过扩展机制灵活添加新功能。

2026-06-16 09:19:55 540

原创 OpenSBI相关内容理解与分析系列(1):OpenSBI相关内容简介

本质上讲,SBI位于S模式和M模式之间。opensbi-0.9/lib/sbi/sbi_init.c是sbi核心代码的开始,sbi_init函数主要分为冷启动和热启动,无论那种,主要功能均为对设备树进行解析,初始化相关硬件设备,比较重要的如irq,tlb,ipi,ecall,domain,PMP,timer,console,总之建立系统调用,配置硬件权限,定义系统mmio以及内存区域的划分domain(这里暂时没有考虑domian的情况)如果未定义FW_PAYLOAD_OFFSET,则此配置参数是必需的。

2026-06-15 16:15:13 212

原创 OpenSBI相关内容理解与分析系列(2):OpenSBI异常处理和系统调用

硬件触发ecall指令或异常事件触发,硬件跳转到mtvec指向的。汇编入口:保存上下文,调用 C 函数。异常分发根据mcause区分中断与异常,并分发到具体处理函数。对于 ECALL,调用。服务路由根据a7a6寄存器中的 ID,查找已注册的扩展,并调用其handle函数。服务执行:扩展的handle函数(如)执行具体操作,并将结果写回寄存器。返回恢复:恢复上下文,通过mret返回 S-Mode,Linux 内核从a0a1寄存器获取结果。

2026-06-15 10:29:16 590

原创 QEMU理解与分析系列(21):QEMU协程相关内容理解

CPU 硬件上的上下文和堆栈的切换,在 CPU 各个优先级上都可以实现,前提是要准备好将寄存器等上下文的空间,分配好指向代码的堆栈空间。在每次切换前都需要保存当前的上下文和堆栈指针,切换回来时要重新加载存放的上下文和堆栈指针,这样就完成了上下文切换,也就是完成了 CPU 的任务切换。Linux 下的任务就是进程,任务切换就是进程切换,在设计时放在内核态中实现。但其实,用户态可以实现硬件上下文的切换,协程就是用于实现用户态的上下文切换。

2026-06-08 09:49:24 192

原创 QEMU理解与分析系列(20):QEMU的AIO模型

提供高效的线程间通信机制;AioContext作为事件处理的核心上下文;实现延迟任务调度;基于 GLib 事件循环,实现跨平台的异步 I/O 处理。这种设计使得 QEMU 能够高效处理大量并发的 I/O 操作,为虚拟化环境提供高性能的事件处理能力。

2026-06-08 09:47:45 22

原创 QEMU理解与分析系列(19):QEMU 事件派发机制

本质上事件派发实现的机制就是select或者poll,事件循环会轮询监视一组文件描述符,当其中的一个文件描述符准备就绪时,事件循环会唤醒相应的事件处理函数进行处理。#endifAioHandler 关键字段说明pfd:封装的文件描述符及其事件掩码io_read:读事件回调函数io_write:写事件回调函数io_poll:poll 回调函数node:链表节点node_ready:就绪链表节点(仅在 aio_poll 期间使用):用户态轮询的超时时间。

2026-06-08 09:41:20 19

原创 QEMU理解与分析系列(18):QEMU BLOCK设备基本实现流程

/qemu5, file-posix.c中首先,通过block_initstaticvoidfunctionvoid;然后,通过进行调用。

2026-06-08 09:39:26 144

原创 QEMU理解与分析系列(17):ZSBL分析

大概流程描述如下:首先将fw_dyn的地址存入a2(高版本的 qemu 都将 dynamic 方式作为默认启动方式),将当前硬件线程的 id 存入a0,接下来根据不同的架构位数使用不同的 load 指令将start_addr和的值存入t0和a1寄存器,最后将跳转到t0的位置。

2026-05-20 10:05:22 248

原创 QEMU理解与分析系列(16):QEMU启动方式分析

定义了 fw_jump 固件的链接脚本,当然此链接脚本是要经过 c 预处理宏展开后而使用的。

2026-05-20 10:04:41 298

原创 QEMU理解与分析系列(15):QEMU的helper机制

QEMU 的 helper 机制的实现依赖于缓存机制,即将翻译后的指令放到 cache 中,在执行阶段会通过 跳转到对应的 helper 函数。比如:函数 会将对应指令的呼叫后端操作插入 TCG 代码,调用指令的目标是函数 。举个例子,我们想为 x86 加入一个 helper 函数,首先需要修改 ,为 syscall 的 helper 定义如下:之后需要在某个位置( 或 等)实现 函数,而且参数需要匹配使用 宏的定义。这里 的 表示函数有 2 个参数, 是 helper 的名称, 是返回类

2026-05-20 10:04:03 224

原创 QEMU理解与分析系列(14):裸机指令代码流程分析

阶段内容关键组件反汇编读取 target 可执行文件指令解码器IR 生成翻译为 TCG IRtrans_xx()函数代码生成IR 翻译为 host 机器码执行通过 prologue/epilogue 执行缓存管理TB 的创建与复用。

2026-05-20 10:03:21 383

原创 QEMU理解与分析系列(13):QEMU中指令添加源码解析以及测试程序

根据指令的定义将指令名称和二进制编码填入根据指令对于参数的定义,选取合适的 Format,例如@r,就顺序包含了两个输入寄存器 rs1 & rs2 和输出寄存器 rd。注:若是新定义的指令类型,需要在 QEMU 中添加对应的 Format若没有,需要自己去定义。

2026-05-20 10:03:01 374

原创 QEMU理解与分析系列(12):QEMU中断机制

分析源码发现,QEMU 中主要是通过 GPIO 来实现中断系统的。

2026-05-19 10:33:36 31

原创 QEMU理解与分析系列(11):QEMU内存机制

在物理机上,CPU 对于内存的访问在保护模式下通过分段分页的形式实现。在该模式下,CPU 访问时使用的是虚拟地址,通过 MMU 映射到物理地址,将虚拟地址转换为物理地址才能访问实际的物理内存。同样的,虚拟机模拟的物理机同样需要有上述的机制,也需要有从虚拟地址到物理地址的转换。这里需要注意,模拟的物理机的物理地址本质上是 qemu 的虚拟地址。

2026-05-19 10:30:41 48

原创 QEMU理解与分析系列(10):QEMU中与RISCV Trap处理相关的实现细节

中断统一以IRQ_01234567891011中断类型定义说明IRQ_U_SOFT0用户态软件中断IRQ_S_SOFT1监督态软件中断2虚拟监督态软件中断IRQ_M_SOFT3机器态软件中断4用户态定时器中断5监督态定时器中断6虚拟监督态定时器中断7机器态定时器中断IRQ_U_EXT8用户态外部中断IRQ_S_EXT9监督态外部中断IRQ_VS_EXT10虚拟监督态外部中断IRQ_M_EXT11机器态外部中断异常定义中包含EXCP_10x00x10x2。

2026-05-19 10:12:03 34

原创 QEMU理解与分析系列(9):QEMU对BIOS数据访问实现(fw_cfg)

为了BIOS更加方便的访问相关的数据比如cpu个数,ACPI表,mem等信息,qemu里面引入了fw_cfg机制。简单来说fw_cfg当中定义了一系列的key和value,然后bios通过port io来进行相关的访问。首先将"QEMU"字符串与FW_CFG_SIGNATURE配置项关联,将。变量的值决定是否将FW_CFG_VERSION_DMA加入到。类型后与FW_CFG_NOGRAPHIC配置项关联,将。类型后与FW_CFG_BOOT_MENU配置项关联。与FW_CFG_UUID配置项关联,将。

2026-05-19 10:04:01 30

原创 QEMU理解与分析系列(8):中断控制器、串口、pflash支持

pflash 是 flash 的载体,真实的固件已经很少见了,市面上常见的是 qspi flash 作为固件的载体,而 nor flash 一般都支持 xip 运行,那么基本上等同于 pflash 了。添加上述 ip 后,就有了中断控制器和串口,就可以进行简单的串口功能测试,现在需要固件的载体使其工作,这里使用到 qemu 中对于 flash 的仿真设备,也就是 pflash。真实板卡的初期调试中,串口打印可谓神器,几乎所有的SOC都会带有串口这个外设,因此我们也需要添加串口到我们的定义中。

2026-05-19 10:03:07 142

原创 QEMU理解与分析系列(7):主函数执行流程及设备添加

}\ }用来在程序启动时将初始化函数注册到 QEMU 中,被该属性声明的函数会在main函数执行前自动调用,用于实现一些初始化操作。在main函数执行之前,会将各个设备的初始化函数存入全局数组中。在调用时通过属性标志一些init函数,这样就可以确保这些init函数在到达上述的全局数组,方便后面的函数调用。

2026-05-18 14:32:15 177

原创 QEMU理解与分析系列(6):设备树文件

扁平设备树(Flattened Device Tree)简称FDT,是源于linux内核powerpc架构下对驱动的抽象分装技术。早年间linux内核中充斥着大量的mach-XXX的驱动代码,这对于当时的内核维护团队来说很是不满。而FDT的引入使得驱动的编写架构清晰,受到了大家的追捧,进而引入到所有的架构中,且近年来逐渐被其他开源项目引入,诸如U-Boot、opensbi等都直接使用fdt作为驱动框架以解释硬件具体配置。

2026-05-18 14:31:39 181

原创 QEMU理解与分析系列(5):RISCV虚拟版卡初始化

QEMU Object Model (QOM) 是 QEMU 中的一种对象系统,用于实现 QEMU 设备模型和设备模拟功能(面向对象的机制)。一个支持动态地注册 “类” 的系统“类” 的单继承“无状态接口” 的多重继承QEMU的Machine通过QOM进行抽象:https://qemu.readthedocs.io/en/latest/devel/qom.html(QEMU官方文档)。

2026-05-18 14:30:54 341

原创 QEMU理解与分析系列(4):QEMU-RISCV仿真板(sifive-u)

2023年6月19日 14:10SiFive HiFive Unleashed (sfive-u)开发板是采用 Freedom U540 多核 RISC-V 处理器的 RISC-V 开发板。支持设备:• Up to 4 U54 / U34 cores 固定搭配• 2 UARTs硬件配置信息:在没有-dtb选项时,会自动生成设备树(device tree blob),这提供了有关系统中各种设备的地址、中断线和其他配置的信息。

2026-05-18 14:26:11 322

原创 QEMU理解与分析系列(3):QEMU下创建Linux系统全过程

【代码】QEMU理解与分析系列(3):QEMU下创建Linux系统全过程。

2026-05-18 14:14:55 401

原创 PCIE分析(1):PCI/PCIE中断机制分析

对应的中断程序执行时,会读取PCIe控制器的寄存器,分辨发生的是INTA#~INTD#这4个中断的哪一个。PCIe设备枚举:扫描设备,并读取设备配置空间中的capability,确定是否含有MSI capability,如果存在,则读取设备的 ​MSI Capability,确定设备需要申请多少个中断;CPU处理中断:PCI/PCIe控制器收到中断,发给GIC,GIC再发给CPU,CPU根据写入的Message Data确定中断向量,调用对应的ISR,ISR读取设备状态寄存器,调用相应的处理分支。

2026-05-09 15:46:56 356

原创 硬件知识扫盲(1):基础知识

总线是计算机内部各部件之间数据传输的通道,它可以分为多种类型,包括指令总线、数据总线、地址总线等。其中指令总线和数据总线是计算机中两个重要的总线类型。指令总线:指令总线是一种计算机内部所有指令传输的总线。它是计算机内部指令传输的主要通道,用于将处理器从内存或缓存中读取指令。指令总线的宽度决定了CPU可以一次读取的指令字节数,一般为16位或32位。数据总线:数据总线是一种计算机内部数据传输的总线。它用于处理器、内存和输入/输出设备之间的数据传输。数据总线的宽度决定了CPU和内存之间可以传输的数据量。

2025-06-16 11:18:54 846

原创 硬件基础知识(5):I2C协议及eeprom

它有7位地址,同时包括一位的读/写位(R/W),1为读操作0为写操作,24C64的前四位被厂家固化为1010,所以芯片管脚上只剩3个地址管脚(A0,A1,A2)。若配置的方向传输位为“读数据”方向,发送的数据包大小也为 8 位,从机每发送完一个数据,都会等待主机的应答信号(ACK),重复这个过程,数据的多少可以理论也是可以随便的。配置为方向为“写数据”方向,接受的数据包大小为8位(一个byte),主机每发送完一个字节数据,都要等待从机的应答信号(ACK),重复这个过程,数据的多少可以理论是可以随便的。

2025-06-13 10:54:31 1048

原创 Uboot机制详细理解分析(12):Uboot 验签相关内容

在qemu上不修改uboot源码的情况下是暂时无法通过环境变量去指定的(除非使用介质去存储这样的一个环境变量),所以目前是采用的向opensbi输入一个新的设备树,以传递给uboot使用。我们采用将设备树与opensbi编译到一起的方式输入设备树。$ openssl genpkey -algorithm RSA -out keys/dev.key -pkeyopt rsa_keygen_bits:4096 -pkeyopt rsa_keygen_pubexp:65537 产生4096位宽的秘钥对。

2025-06-11 11:57:18 18

原创 Uboot机制详细理解分析(11):Uboot SPL相关内容

代码流程(risc-v架构):链接脚本:u-boot\arch\riscv\cpu\u-boot-spl.lds汇编代码入口:u-boot\arch\riscv\cpu\start.S 的_start初始化gp (global data pointer),设置异常处理函数并关闭中断,将mie寄存器的值设置为MIE_MSIE。设置sp值为CONFIG_SYS_INIT_SP_ADDR(0x80200000),调用board_init_f_alloc_reserve分配gd空间,并做16字节对齐。

2025-06-10 19:50:52 623

原创 Uboot机制详细理解分析(10):Uboot_DTB解析

(就是<>中有几个表示地址的数,几个表示大小的数,例如#address-cells #size-cells都是1,则子节点的reg形式为 reg =<0x2 5> ,如果#address-cells #size-cells都是2,则子节点的reg形式为 reg = <0x2 0x3 0x5 0x4> 前两个是地址(address1 ) 后两个是size(length1 ))其中node-name是必须的,后面的单元地址可选,如果节点中有reg属性,则要求加上单元地址,且单元地址要等于reg中的首地址。

2025-06-10 16:38:21 18

原创 Uboot机制详细理解分析(9):Uboot DM分析

设备与驱动绑定时相关调用①uclass_bind_device将设备挂到uclass的树上调用dev->parent->uclass->uc_drv的child_post_bind(一个设备被绑定到这个uclass的设备时调用)②drv->bind(dev) 设备和驱动绑定③parent->driver->child_post_bind(dev) ( child_post_bind 子设备被绑定后调用)

2025-06-10 10:26:07 14

原创 Uboot机制详细理解分析(8):Uboot DM定义和概念相关内容

一、设备驱动以及驱动模型的开启二、驱动模型的重要概念及关系2.1 概念2.2 挂接关系3.设备和驱动的定义3.1 uclass驱动的定义3.2 udevice驱动的定义3.3 udevice的添加。

2025-06-09 20:27:45 368

原创 Uboot机制详细理解分析(7):FIT相关内容

最初的时候,uImage的格式比较简单,就是为二进制文件加上一个header(具体可参考“include/image.h”中的定义),然后在boot该类型的Image时,从header中读取所需的信息,按照指示,进行相应的动作。可以使用dfu工具(这个应该在uboot代码里实现了)将生成的.idb文件,下载到memory的某个地址,例如0x100000,然后使用bootm命令即可启动。data,二进制文件的路径,格式为----/incbin/(“path/to/data/file.bin”);

2025-06-09 15:22:29 21

原创 Uboot机制详细理解分析(6):Uboot移植

init_sequence这个数组中包含了各个硬件设备初始化的函数指针。bootloader比较大,需要重定位到SRAM或者DDR上。将内核重定位到SRAN或者DDR上。

2025-06-09 15:21:06 528

原创 Uboot机制详细理解分析(5):Uboot重定位相关内容

U-BOOT的初始化阶段即将自身复制到另一个地址的操作,这个操作被称为重定位,定义在中,函数原型。

2025-06-09 12:18:37 281

原创 Uboot机制详细理解分析(4):Uboot构建过程分析(Kconfig和Kbuild编译)

从 v2014.10-rc1版本开始,U-Boot 引入了 Kconfig 并取代了传统的配置。尽管引入了 Kconfig,一些配置项也被移到了 Kconfig 中,但许多配置项仍然在C 头文件中定义。将它们全部转移到 Kconfig 将需要很长时间。在此期间,两种不同的配置基础结构是共存的。配置文件由 Kconfig 和旧的基于预处理器的配置生成,如下所示:C 源代码中使用的配置文件由 Kconfig 生成的通用配置开发板移植时增加的特定配置文件(每个开发板一个)

2025-06-09 11:30:58 21

原创 Uboot机制详细理解分析(3):Uboot platform添加和内存分配

/用于获取有效的内存大小,注意这里get_effective_memsize是限制uboot的reloc生长top地址 }TEXT_BASE default 0x80200000 //这里是uboot入口地址,需要与自己的引导程序一致。注:在编译时可以发现他们之间的关系时是层层调用,需要注意进行适配。//这里有一些环境的定义。

2025-06-08 10:25:13 25

原创 Uboot机制详细理解分析(2):Uboot启动过程分析

riscv的uboot启动代码位于/arch/riscv/cpu/start.S内,链接脚本在/arch/riscv/cpu/u-boot.lds,从链接脚本可以观察到程序的入口是_start,boot启动后的初始化流程如图所示。主要流程是:从start.S->board_init_f()->initcall_run_list->顺序执行list中各种函数->start.S->board_init_r->全面进入C代码。

2025-06-05 22:36:06 196

原创 Uboot机制详细理解分析(1):Uboot的编译与调试

这文件是使用编译工具链的 objcopy 工具从 u-boot 这个文件中提取来的,它只包含可执行的二进制代码,将 u-boot 中执行不需要的节区删除。u-boot-nodtb.bin 尾部依次拼接上 u-boot-spl-pad.bin 和 u-boot-spl.dtb 后形成的文件。由 .u-boot-spl-nodtb.bin.cmd 这个命令脚本产生。u-boot-dtb.bin 重命名得到的。uboot:这个文件是编译后生成的ELF格式的最原始的U-BOOT镜像文件,后续的文件都是由它产生的;

2025-06-05 21:36:03 458

空空如也

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

TA关注的人

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