- 博客(76)
- 资源 (2)
- 收藏
- 关注
原创 RISC-V PMA、PMP机制深入分析
RISC-V架构通过PMA(物理内存属性)和PMP(物理内存保护)机制实现内存管理与安全隔离。PMA定义静态内存属性(如缓存行为、原子操作支持、可执行权限),通常在芯片设计时固化。SiFive U74内核允许通过特殊寄存器有限修改PMA。PMP则用于动态配置S/U模式下的内存访问权限,通过pmpcfg/pmpaddr寄存器定义保护区域及权限(R/W/X)。配置模式包括TOR(相邻边界)、NA4(4字节对齐)和NAPOT(2的幂次方区域),并遵循编号优先原则。文章还介绍了PMP在OpenSBI中的
2025-05-29 23:56:09
2520
原创 RISC-V特权模式及切换
RISC-V采用多级特权模式(M/H/S/U)实现硬件资源隔离与安全保护。M模式权限最高,负责硬件初始化;S模式运行操作系统内核;U模式执行用户程序。特权模式切换通过异常、中断或系统调用触发:低特权级通过ecall或硬件异常进入高特权级,高特权级通过mret/sret指令返回。典型场景如OpenSBI启动时从M模式切换至S模式,Linux内核则管理S/U模式切换以处理系统调用和异常。这种分级机制确保了系统安全性与稳定性。
2025-05-28 22:32:41
2744
原创 ECLIC中断流程及实际应用 —— RISC-V中断机制(二)
芯来N级别处理器内核通过改进型内核中断控制器(ECLIC)管理中断,使用多个CSR寄存器(如mepc、mcause、mtvec等)保存控制信息和处理中断流程。ECLIC中断处理流程包括硬件自动更新寄存器、跳转到共享中断入口、保存上下文、执行中断服务程序、恢复上下文并退出中断。通过自定义指令和寄存器优化,ECLIC减少了中断延迟并支持中断嵌套和咬尾处理。
2025-05-09 14:42:30
7255
原创 RISC-V CLINT、PLIC及芯来ECLIC中断机制分析 —— RISC-V中断机制(一)
RISC-V的中断机制通过CLINT和PLIC两个控制器实现,分别管理本地和全局中断。CLINT负责软件中断和定时器中断,设计简洁但功能有限,适用于单核或轻量级多核系统。PLIC则负责外部设备中断,支持优先级仲裁和多核处理,功能更为复杂和强大。两者共同构成了RISC-V的中断处理体系,旨在通过模块化设计降低开发门槛,但其设计合理性仍需市场验证。相比之下,ARM的GIC功能更为完备但配置复杂,RISC-V的简洁设计在特定场景下具有优势。
2025-05-09 13:24:49
9716
原创 跟我一起由浅入深学习Makefile
首要目标是读懂复杂makefile,从makefile执行过程梳理剖析工程,然后就是能够写makefile管理工程项目
2025-04-24 21:46:19
2693
原创 Huffman树与Huffman编码
哈夫曼树(Huffman Tree),又称最优二叉树,是一种加权路径长度最短的二叉树。它是由David A. Huffman在其1952年的论文中提出的一种编码方法,主要用于数据压缩和编码领域。
2025-03-20 12:53:28
6495
原创 RISC-V汇编学习(五)—— 汇编实战、GCC内联汇编(基于芯来平台)
高级编程语言如C、C++、Java、Python等已经极大地简化了软件开发的过程,并且在大多数应用领域中提供了足够的抽象层次来隐藏底层硬件细节,但在某些特定场景下,汇编语言仍然不可或缺。但是掌握汇编语言不仅要求对目标架构有深入的理解,还需要投入大量的时间和精力去学习其语法和最佳实践,这对于大部分的开发者来说还是有难度的,实际上也没有必要完全掌握,因为大部分人并不会直接去写汇编程序。
2025-03-14 12:45:32
6821
原创 RISC-V汇编学习(四)—— RISCV QEMU平台搭建(基于芯来平台)
无论是x86架构还是ARM架构的汇编代码,都需要在对应架构的物理芯片或兼容的模拟环境中执行。这意味着任何机器码都必须在相应的处理器架构上运行,以实现对底层硬件的操作。RISC-V架构也不例外,因此我们需要搭建一个合适的执行平台。通常有两种主要的方法来实现:1、使用实际的RISC-V开发板 2、通过软件模拟器如QEMU创建虚拟环境。
2025-03-13 22:40:26
6702
2
原创 RISC-V汇编学习(三)—— RV指令集
RISC-V是一种开源的指令集架构(ISA),它遵循精简指令集计算(RISC)的原则,旨在为各种计算设备提供高效、灵活的基础。与传统的专有ISA不同,RISC-V的设计强调简洁性、模块化和可扩展性,使其成为从嵌入式系统到超级计算机广泛应用的理想选择。博客列举RISC-V指令集,包括基础整数指令集RV32I/RV64I以及一系列标准扩展,如乘法和除法(M)、原子操作(A)、浮点运算(F/D)等
2025-03-08 23:05:22
8691
原创 RISC-V汇编学习(二)—— 汇编语法
在具体汇编指令和汇编实战之前,还是有必要对RISC-V汇编进行下介绍,我一般称之为RISC-V汇编的“语法”,可能“语法”较少,也相对比较简单的原因,大部分的博主都是一笔带过,但本着循序渐进的原则,还是简单概述下,以便加深认识。
2025-03-02 17:55:42
6809
原创 RISC-V汇编学习(一)—— 基础认识
ISA(Instruction Set Architecture) 指令集架构,可以说是CPU的灵魂,是软硬件之间的桥梁;定义了指令集(指令类型和编码、寻址方式)、数据类型、存储模型、系统模型(中断、异常、特权等级等)、软件可见的处理器状态(通用寄存器、PC、处理器状态等)。
2025-03-02 17:06:40
6809
原创 VS Code使用Remote SSH远程开发环境搭建及免密登录
一般linux嵌入式开发时,这个需求是挺高的,大部分情况下我们的代码在linux服务器端,我们本地工作端都在windows,所以为了方便开发,需要搭建下远程开发环境。我一般是vscode开发,source insight调试,这里主要针对vscode ssh远程环境说明(小白同事在线尝试了数十种方法仍然存在问题,遂把这个环境搭建流程给他梳理下)
2024-12-04 15:46:08
591
原创 SD卡bus协议详解——SDIO协议入门与实践(二)
sdio控制器如何让sd卡是工作起来,如何从sd nand里读取想要的数据,本文将简单从头梳理下sd卡总线协议。另外,tf卡和sd卡这里不做区分,统一用sd卡代替(一般我们也叫tf卡为小卡,sd卡为大卡)。
2024-10-16 10:01:32
7551
原创 SD卡认识——SDIO协议入门与实践(一)
经常用sd卡会在卡的正面看到,**SD、SDHC、SDXC**的字样,一般用户也不太关心这些,但如果要搞sd卡相关开发,还是要了解一二的
2024-09-27 10:28:59
7444
原创 CAN error情况及处理机制——深入浅出理解CAN协议(三)
CAN协议之所以能在汽车、工业自动化、航天航空船舶、医疗等等安全度要求很高的领域广泛应用,除了其可靠性、实时性、抗干扰能力强等,另外一个重要原因就是的对各类异常错误的处理机制。
2024-09-19 09:57:57
3740
原创 CAN_FD和CAN2.0的不同点——深入浅出理解CAN协议(二)
直接来看CAN2.0和CANFD,CANFD是在链路层对CAN协议做了升级,物理层并未改变;区别从宏观上来说:帧格式、传输速度和数据长度等上有不同。
2024-09-18 13:18:15
7630
原创 CAN(-FD)协议介绍——深入浅出理解CAN协议(一)
本内容包含CAN2.0及CANFD协议,可作为入门CAN协议;另外也有深入硬件的理解,从业多年软件工程师也可以学习一二;亦可作为后续查阅使用,常看常新嘛。
2024-09-18 11:38:46
7737
原创 GDB调试简单介绍
通过调试程序,我们可以监控程序执行的每一个细节,包括变量的值、函数的调用过程、内存中数据、线程的调度等,从而发现隐藏的错误或者低效的代码;在我们日常coding debug时,有时很难肉眼发现自己写的代码的问题之处,这时GDB就排上用场了。
2023-10-22 21:56:24
5827
原创 链接脚本(Linker Script)解析
链接脚本实质上是一个规则文件,程序员用来指挥链接器工作的,当我们编写了多个C文件,调用了大量库,如何编译成一个可执行文件呢?这是链接脚本文件就会发挥他的作用了:将多个目标文件(xx.o)、库文件(xx.a)、动态库(.so)等等链接成一个可执行文件。
2022-09-29 11:06:12
14618
6
原创 Linux系统调用之二——调用机制
无论是GUI(用户图形接口)、应用程序,还是命令行接口最终都需要使用系统调用来实现。当我们要打开文件(open)然后进行写入(write)或者分配内存(malloc)时,此时将会切换到内核态,虽然我们并察觉不到;之后内核对调用进行检查,如果通过,则按照指令执行相应的操作,分配相应的资源。
2022-01-09 15:47:34
3282
原创 Linux系统调用之一——概述导论
内核提供了用户进程和内核交互的一组接口;做过Linux开发的人应该也清楚系统调用的流程:应用->陷入内核、系统调用->驱动->硬件;然后也有不少人讲到0x80的中断。但系统调用的讲解有些片面,原理并不清晰,细节更是一笔带过,看了并不能让人耳目一新,大都新瓶旧酒,**比如0x80中断是怎么创建,又是怎么识别的**等,后面会介绍。所以,我想分享一些自己的学习,以及自己的理解
2022-01-03 16:34:46
5639
2
原创 多线程并发时原子操作的简单探究
所谓**原子操作**,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位。
2021-12-15 23:00:03
622
原创 二叉树的创建和遍历实现
二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。既然二叉树是通过递归定义的,所以想要创建一颗二叉树,这里可以借助递归去创造。
2021-11-19 22:26:55
2541
原创 各类数据类型sizeof的大小
sizeof 是一个关键字,它是一个编译时的运算符,用于判断变量或数据类型的字节大小。sizeof 运算符可用于获取类、结构、共用体和其他用户自定义数据类型的大小。
2021-10-18 16:58:56
7516
1
原创 Linux系统查看内存使用情况
常用命令查看内存使用情况:free显示进程信息(包括CPU、内存使用等信息):top、ps查看驱动占用内存:lsmod
2021-10-13 16:31:15
135916
原创 vscode函数跳转环境搭建(C/C++)
工程比较大如何使函数跳转呢?IDE可以,但体量太大,轻量级的vscode一般是首选,但函数跳转不搞好很影响工作效率。下面分享给大家如何搭建环境,构建函数功能。
2021-08-11 10:30:38
54283
27
原创 内核dma_cache_maint介绍
外设和主芯片数据传输时,经常要手动刷新cache,要用到dma_cache_maint,这个内核函数到底在干什么呢?
2021-08-10 11:46:26
596
原创 platform_bus、device及driver 注册及介绍
在目前常用的bus, driver, device 框架中,这三者的关系及注册是怎么样的呢?让我们一探究竟
2021-08-06 16:21:17
1061
原创 内核态do_gettimeofday()、用户态gettimeofday()获取指令执行时间
获取通过do_gettimeofday()或者gettimeofday()获取系统时间,进一步得到指令执行时间
2021-07-29 11:53:59
7831
1
转载 win10环境下debug命令调试寄存器
王爽的《汇编语言》,讲解是在古老的dos机上调试寄存器,当然我们可以装个虚拟机,但我们也可以只搞个环境。
2021-07-15 10:33:39
583
原创 大小端介绍、查看及转换
Big-Endian(大端字节序):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端(符合人们日常阅读习惯);Little-Endian(小端字节序):低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
2021-04-26 08:24:37
2672
4
原创 回调函数(callback)浅析、理解及代码分析。
call很好理解,一开始写代码是在这么用,把个一个个功能封装出一个个函数,然后去使用该函数。但是回调callback呢?
2021-04-12 21:09:29
8226
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人