自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 RISC-V异常处理流程概述(2):异常处理机制

一、异常处理流程和异常委托1.1 异常处理流程1.2 异常委托二、RISC-V异常处理中软件相关内容2.1 异常处理准备工作2.2 异常处理函数2.3 Opensbi系统调用的注册。

2024-07-10 20:33:51 1101

原创 Uboot重定位

rel.dyn 包含了需要重定位的变量的信息, 叫做变量重定位表(包含全局变量和静态函数的符号).rel.plt 包含了需要重定位的函数的信息, 叫做函数重定位表/*Address *//*/*Addend */Elf64_Rela;//.rela.dyn重定位表的表项entry结构 ,可以用readelf -r test来查看该段tbl index) *///符号的名字,其实际值为字符串表.strtab的索引,真正的字符串放在.strtab中。

2024-06-29 15:46:47 855

原创 RV32F\RV32D指令集

F扩展增加了32个浮点寄存器f0-f31,每个32位宽,以及一个浮点控制和状态寄存器fcsr,其中包含浮点单元的工作模式和异常状态。FLEN=32表示F单精度浮点扩展,大多数浮点指令对浮点寄存器中的值进行操作。浮点加载和存储指令在寄存器和内存之间传输浮点值。还提供了将值传入和传出整数寄存器的说明。![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d71efac8561f42c2810214874fc7ad06.png。

2024-06-14 22:20:50 965

原创 RV32A\CSR\Counters\Wait-on-Reservation-Set指令集

这些 AMO指令从 rs1 中的地址原子加载数据值,将值放入寄存器 rd,将二元运算符应用于加载的值和 rs2 中的原始值,然后将结果存储回去到 rs1 中的地址。将rs2寄存器中的值与地址(rs1)中存储的值进行原子交换,并将原始值存储到rd寄存器中。功能:将csr中的值读出写入rd,然后将rs1的值进行按位或运算后再和原有csr的值进行按位或运算并写回到csr中。功能:将csr中的值读出写入rd,然后将rs1的值进行按位取反后再和原有csr的值进行按位与运算并写回到csr中。

2024-06-12 22:03:13 815

原创 RV32M指令集

DIVU指令 (rd = (unsigned)rs1 / (unsigned) rs2) DIVU 指令用于进行无符号整数除法运算,将一个源寄存器中的无符号整数除以另外一个源寄存器中的无符号整数,并将结果存储到目标寄存器中。REM指令 rd = rs1 % rs2 REM 指令用于进行有符号整数取模运算,将一个源寄存器中的有符号整数除以另外一个源寄存器中的有符号整数后取余数,并将结果存储到目标寄存器中。如果 rs1 和 rs2 都是无符号整数,则结果也是无符号整数。其语法如下: mul rd,

2024-06-11 21:58:24 598

原创 RISC-V汇编总结

一、risc-v汇编格式二、risc-v常用汇编伪指令三、risc-v汇编编程示例四、GCC内联汇编。

2024-06-11 21:45:59 1086

原创 FENCE.I指令及CAS指令集

FENCE.I 是 RISC-V 指令集架构中的一种 Fence 指令,用于同步指令缓存(Instruction Cache),用于保证内存操作的正确性和顺序性。具体来说,FENCE.I指令可以确保之前发出的所有对内存的读写操作都已经完成,并且将数据从处理器缓存中刷新到内存中,然后再继续执行后面的指令,这样确保处理器按照预期顺序执行指令。FENCE.I 指令的格式如下:fence.i。

2024-06-10 11:08:31 887

原创 RV32I指令集

如果一个组件包含一个独立的指令获取单元,则它被称为核心。RISC-V兼容核心可能支持多个 RISC-V 兼容的硬件线程,或 harts,通过多线程。Bare metal:harts直接由物理处理器实现,线程和指令可以直接访问物理地址空间。RISC-V操作系统:通过多路复用提供多个用户级执行环境的,RISC-V 操作系统用户级 harts 到可用的物理处理器线程并通过控制访问通过虚拟内存到内存。RISC-V 虚拟机管理系统,

2024-06-10 11:03:17 1948

原创 gcc源码分析 词法和语法分析

*c_token结构体来描述一个C语言中的语法符号*//* 记录标识符的类型. *//* 若一个标识符是关键字,非关键字的keyword默认为为 RID_MAX *//* 编译制导的标识符 *//* 记录token在源代码中的位置 */tree value;声明说明符是由一个个说明符(specifier)构成的,这些说明符被分为6个不同的大类,分别是:存储类说明符(storage-class-specifier)类型说明符(type-specifier)

2024-06-09 15:18:03 830

原创 RISC-V基础编译

在这种情况下,“unknown”表示目标平台,其中“ELF”代表“Executable and Linkable Format”,是一种常见的二进制文件格式,可在Linux和其他Unix-like系统上使用。linux-gnu-gcc使用的是GNU的glibc库,elf-gcc使用的是newlib库,应用的领域有差异,glibc是针对PC开发的,而newlib是与glibc在API兼容的小型C库,实现了glibc的部分功能,可用于嵌入式系统的开发,更加轻量,速度更快。,共同组成通用的标量指令。

2024-06-09 15:10:22 1099

原创 RTL处理及优化

数据相关是指指令之间由于操作数的使用而引入的一些相关关系,这种关系决定了指令之间的执行顺序。数据之间的关系主要包括以下几种形式:(1)真相关(2)反相关(3)输出相关。

2024-06-01 23:54:38 389

原创 从GIMPLE到RTL

变量展开的核心功能就是为各种各样不同类型的变量分配空间,并生成对应的RTX,主要包括以下两种典型情况:(1)对于GIMPLE语句中的GIMPLE临时变量,一般为该变量分配虚拟寄存器,创建类型为REG的RTX,通过该寄存器RTX访问该变量;(2)如果是函数中的自动变量,则使用堆栈进行空间分配,因此必须创建内存类型为的RTX(其RTX_CODE=MEM),一般通过基址寄存器(virtual_stack_vars_rtx)+偏移量的方式给出该变量的内存地址。

2024-05-29 09:15:02 1029

原创 gcc源码分析 GIMPLIFY相关

GCC通过前端的词法/语法分析后,将高级编程语言转换成抽象的AST中间表示。为了对AST中间表示进行语言无关的处理和优化,GCC引入了GIMPLE。GENERIC就是规范的AST。一般来说,如果一种前端语言的AST树均可以使用树节点表示,那么该AST就是GENERIC/AST,GIMPLE为是了处理不同的前端语言及其相应的AST/GENERIC, GCC引入的一种与前端语言无关的中间表示。GIMPLE是一种三地址码的中间表示形式。在从AST向GIMPLE转换的过程中,GIMPLE的生成先后经历了两个阶段,分

2024-05-29 09:07:15 843

原创 gcc源码分析(AST抽象语法树)

一个scope在解析过程中会依赖于其所能看到的所有标识符的绑定(代表其声明),其中此scope内层的标识符绑定只在当前scope中有效,在当前scope解析完毕后当前scope内在标识符上的绑定应该被删除,同时当前scope内生成的所有声明以及子scope的信息均会被保存到一个tree_block节点并返回:tree_block->vars顺序链接当前scope内所有的声明节点,而tree_block->subblocks顺序链接当前scope内所有子scope生成的block节点。

2024-05-25 11:07:35 1234

原创 gcc编译器前端简要分析

词法分析的过程就是将源代码识别成一个一个的词法符号,并在词法分析的过程中创建一些树节点,用来保存某些词法符号的值(value)。函数c_parse_filer如上所述,是C语法分析的入口函数,该函数首先对当前的词法符号进行判断,如果该符号的编译制导类型是PRAGMA_GCC_PCH_PREPROCESS,则调用函数c_parser_pragma_pch_preprocess对进行源代码的预处理,否则,调用函数c_parser_translation_unit()进行语法推导。

2024-05-05 21:04:01 486

原创 Opensbi初始化分析:设备初始化-warmboot

紧接_start_warm,接下来将正式进入C阶段,随机选择满足条件的hart执行clodboot,其余的hart执行warmboot,上篇博文已经详细分析了coolboot的详细过程了,下面就着重对比coolboot分析下。sbi_scratch_init本质是初始化动态加载的镜像模块,首先会初始化一个ROOT的内存域,最后会将root域注册到opensbi的系统中。console的初始化也是coldboot所特有的工作,理所应当的,所有的打印相关工作也是其完成的,这当然包括了我看到的"OpenSBI"

2024-05-02 21:27:48 40

原创 RISC-V异常处理流程概述(1):异常处理基本介绍

其中的关键函数为sbi_ecall_register_extension,这个函数的目的是将sbi_ecall_extension类型的结构体指针添加到一个全局的ecall_exts_list列表中,也就是进行ecall注册的工作。而ecall_time、ecall_rfence等则是结构体指针,相当于sbi_ecall_extension结构体的一个实例,其中的服务和id则是要映射结构体的extid_xxx和handle处理。下面将调用到sbi_trap_handler进行真正的异常处理函数。

2024-05-01 23:21:04 1112 1

原创 U-boot FIT签名验证

对FIT中的镜像进行哈希处理使用私钥对哈希值进行签名,生成签名将生成的签名存储在FIT中。

2024-04-28 18:44:35 847

原创 SMP启动分析

经过lottery后将选定一个boot hart,其余的hart将等待其重定位和scratch空间和栈空间初始化工作的完成。其余的hart在等待BOOT_STATUS_BOOT_HART_DONE标志后,将也会进入c阶段。boot hart在完成fdt的重定位后将进入c阶段。

2024-04-27 20:51:58 472

原创 Uboot FIT验签

【代码】Uboot FIT验签。

2024-04-23 22:02:26 167

原创 Opensbi初始化分析:设备初始化

Opensbi初始化分析:设备初始化设备初始化sbi_init函数coldinit,冷启动初始化sbi_scratch_init函数sbi_domain_init函数sbi_hsm_initsbi_platform_early_initsbi_hart_initsbi_console_initsbi_platform_irqchip_init中断控制器的初始化sbi_ipi_init函数sbi_tlb_init函数sbi_timer_init函数sbi_ecall_init函数sbi_domain_fina

2024-04-22 19:43:23 439

原创 Binutils简介

Binutils简介

2024-04-21 21:01:14 244 1

原创 OpenSBI初始化分析

再来看下非启动hart的动作:一直在等待启动hart的link_start和load_start相同,也就是_boot_status变为BOOT_STATUS_RELOCATE_DONE。接下来可以看到在几个nop指令后,非启动hart会跳转到_wait_for_boot_hart的链接地址,将继续等待启动hart完成其他的初始化工作。设置mtvec trap处理寄存器与_trap_handler函数。其他非启动hart将等待_boot_status=BOOT_STATUS_BOOT_HART_DONE。

2024-04-20 20:56:16 1612

原创 Makefile用法总结

Makefile的编译过程语法规则变量相关内容$符号变量赋值关键函数 wildcard patsubst伪目标.PHONY嵌套执行Makefile-C参数的使用exportunexport头文件和库文件目录添加头文件库文件Makefile 显示命令和出错命令显示相关命令出错命令在Makefile中添加.IGNORE:目标Makefile示例。

2024-04-17 20:52:28 863

原创 RISC-V通用寄存器

riscv通用寄存器riscv通用寄存器riscv通用寄存器寄存器调用名字用途x0zero常数 0x1ra返回地址x2sp栈指针x3gp全局指针x4tp线程指针x5-x7t0-t2临时存储x8s0/fp保存用寄存器/帧指针(配合栈指针界定一个函数的栈)x9s1保存用寄存器x10-x11a0-a1函数参数/返回值x12-x17a2-a7函数参数x18-x27s2-s11保存用寄存器

2024-04-10 21:26:56 475 1

原创 QEMU实现自己的引导程序

【代码】QEMU实现自己的引导程序。

2024-04-02 17:59:17 195 1

原创 VIM使用总结

u 撤销、U取消撤销ctrl + f 下一页 ctrl + b 上一页dd 删除此行yy 复制此行:n 快速到某行xxd 以16进制的形式显示set nowrap 不进行自动换行grep execve 使用管道屏蔽除某些字段外的行grep -e execve -e open 使用管道屏蔽除多个字段外的行grep -v ENOENT 使用管道反向过滤包含ENOENT字段的行%s/ /\r /g 格式化文本,使其可读性更好。

2024-04-01 17:44:42 102

原创 GCC -Wl参数详解

-Wl"选项允许你将参数传递给链接器。

2024-03-31 14:05:28 1306 1

原创 mkimage命令介绍

mkimage命令介绍

2024-02-24 22:00:43 663

原创 Linux内核打印printk

Linux内核打印-----printk

2024-02-22 22:06:57 580 1

原创 字符设备驱动模板

【代码】字符设备驱动模板。

2024-02-21 22:46:06 341 1

原创 字符型设备驱动

【代码】字符型设备驱动。

2024-02-20 20:53:11 317 1

原创 字符设备触发中断

【代码】字符设备触发中断。

2024-02-19 21:56:51 331 1

原创 C语言技巧总结(自用)

2024-02-18 21:37:44 494

原创 编译相关内容(自用)

.s与.S文件之间的区别.s文件(小写s):这种文件通常是纯粹的汇编源文件,其中所有的汇编代码都以原始形式存在。.S文件(大写S):这种文件是预处理过的汇编源文件,其中包括宏定义、条件编译等预处理指令。区分.s文件和.S文件的大小写是为了在文件命名时能够明确地表示它们是否需要预处理。不同的编译工具链可能对大小写的要求有所不同,因此在使用时需要注意。一般来说,建议根据需要进行预处理的情况使用大写的.S文件,而不需要预处理的情况使用小写的.s文件。

2024-02-17 12:59:18 2025 1

原创 shell脚本执行方式

【代码】shell脚本执行方式。

2024-02-04 21:53:02 329

原创 Linux命令总结(自用)

Linux命令总结

2024-02-03 10:49:14 539

空空如也

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

TA关注的人

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