RISCV——内核及汇编

article/2025/8/19 18:30:07

RISCV——内核及汇编

小狼@http://blog.csdn.net/xiaolangyangyang


1、寄存器组(ABI)

2、异常及中断

        XV6 trap(二)RISCV中断异常处理/定时器中断

  • mie:中断开关
  • mip:中断状态
  • mstatus.mie:全局中断开关

        RISCV异常及中断向量有两种方式:一是全部异常及中断使用同一个入口,二是使用向量表,D1s芯片使用的是第一种方式,全部异常及中断使用同一入口,再通过scause判断是异常还是中断,以及异常或中断编号,如下图所示:

3、特权模式

        RISC-V特权模式与寄存器

4、启动代码分析

/* linker.ld */
/* 起始地址是0x27000 */SECTIONS
{/** 设置benos的加载入口地址为0x27000** 这里“.”表示location counter,当前位置*/. = 0x27000,/** 这里是第一个段text.boot,起始地址就是0x27000* 这个段存放了benos的第一条指令*/_text_boot = .;.text.boot : { *(.text.boot) }_etext_boot = .;/** text代码段*/. = ALIGN(8);_text = .;_stext = .;.text :{*(.text)}. = ALIGN(8);_etext = .;/** 只读数据段*/_rodata = .;.rodata : { *(.rodata) }_erodata = .;/** 数据段*/_data = .;.data : { *(.data) }_edata = .;/** bss段** ALIGN(8)表示8个字节对齐* bss_begin的起始地址以8字节对齐*/. = ALIGN(0x8);_bss = .;.bss : { *(.bss*) } _ebss = .;
}
/* boot.S */
/* 启动代码,需要设置SP指针 */.section ".text.boot".globl _start
_start:/* 关闭中断 */csrw sie, zerocall __init_uartcall print_asm/* 设置栈, 栈的大小为4KB */la sp, stacks_startli t0, 4096add sp, sp, t0/* 跳转到C语言 */tail kernel_mainprint_asm:/*此时SP栈空间还没分配,把返回地址ra保存到临时寄存器中*/mv s1, rala a0, boot_stringcall put_string_uart/*恢复返回地址ra*/mv ra, s1ret.section .data
.align  12
.global stacks_start
stacks_start:.skip 4096.section  .rodata
.align 3
.globl boot_string
boot_string:.string "\r\nBooting at asm\r\n"
/* entry.S */
/* 主要定义了异常及中断入口 */#include "asm/asm-offsets.h"
#include "asm/csr.h".macro kernel_entryaddi sp, sp, -(PT_SIZE)sd x1,  PT_RA(sp)sd x3,  PT_GP(sp)sd x5,  PT_T0(sp)sd x6,  PT_T1(sp)sd x7,  PT_T2(sp)sd x8,  PT_S0(sp)sd x9,  PT_S1(sp)sd x10, PT_A0(sp)sd x11, PT_A1(sp)sd x12, PT_A2(sp)sd x13, PT_A3(sp)sd x14, PT_A4(sp)sd x15, PT_A5(sp)sd x16, PT_A6(sp)sd x17, PT_A7(sp)sd x18, PT_S2(sp)sd x19, PT_S3(sp)sd x20, PT_S4(sp)sd x21, PT_S5(sp)sd x22, PT_S6(sp)sd x23, PT_S7(sp)sd x24, PT_S8(sp)sd x25, PT_S9(sp)sd x26, PT_S10(sp)sd x27, PT_S11(sp)sd x28, PT_T3(sp)sd x29, PT_T4(sp)sd x30, PT_T5(sp)sd x31, PT_T6(sp)csrr s1, sstatussd s1, PT_SSTATUS(sp)/*保存sepc*/csrr s2, sepcsd s2, PT_SEPC(sp)/*保存sbadaddr*/csrr s3, sbadaddrsd s3, PT_SBADADDR(sp)/*保存scause*/csrr s4, scausesd s4, PT_SCAUSE(sp)/*保存ssratch*/csrr s5, sscratchsd s5, PT_TP(sp)/*保存SP*/addi s0, sp, PT_SIZE sd s0, PT_SP(sp)
.endm.macro kernel_exitld a0, PT_SSTATUS(sp)csrw sstatus, a0ld a2, PT_SEPC(sp)csrw sepc, a2ld x1,  PT_RA(sp)ld x3,  PT_GP(sp)ld x4,  PT_TP(sp)ld x5,  PT_T0(sp)ld x6,  PT_T1(sp)ld x7,  PT_T2(sp)ld x8,  PT_S0(sp)ld x9,  PT_S1(sp)ld x10, PT_A0(sp)ld x11, PT_A1(sp)ld x12, PT_A2(sp)ld x13, PT_A3(sp)ld x14, PT_A4(sp)ld x15, PT_A5(sp)ld x16, PT_A6(sp)ld x17, PT_A7(sp)ld x18, PT_S2(sp)ld x19, PT_S3(sp)ld x20, PT_S4(sp)ld x21, PT_S5(sp)ld x22, PT_S6(sp)ld x23, PT_S7(sp)ld x24, PT_S8(sp)ld x25, PT_S9(sp)ld x26, PT_S10(sp)ld x27, PT_S11(sp)ld x28, PT_T3(sp)ld x29, PT_T4(sp)ld x30, PT_T5(sp)ld x31, PT_T6(sp)ld x2,  PT_SP(sp)
.endm/*do_exception_vector必须4字节对齐否则写入stvec寄存器会不成功*/
.align 2
.global do_exception_vector
do_exception_vector:kernel_entrycsrw sscratch, x0la ra, ret_from_exceptionmv a0, sp /* pt_regs */mv a1, s4tail do_exceptionret_from_exception:restore_all:kernel_exitsret.global trigger_load_access_fault
trigger_load_access_fault:li a0, 0x100001ld a0, (a0)ret

5、调试

        平头哥IP核C906的JTAG调试器DIY教程(一)
        平头哥IP核C906的JTAG调试器DIY教程(二)
        《T-HEAD+CPU调试技巧.pdf》

6、各特权态的指令

  • 各个特权级都拥有的指令:

        ECALL:U态陷入S态,S态陷入M态
        EBREAK:产生断点异常
        FENCE.I:产生一个内存读写屏障
        SRET/URET:M太返回S态,S态返回U态

  • S态引入的指令:

        SFENCE.VMA:主要用于刷新页表

  • M态引入的指令:

        WFI:让当前处理器核心进入睡眠状态

7、各特权态的CSR

  • CSR寄存器有自己的一套独立的地址空间,访问CSR需要使用专用的指令
  • 每一个处理器核心都有自己一套独立的4K CSR,这4K CSR分别对应到4个特权态(U\S\V\M),对于每个特权态,最多有1024个CSR可使用
  • 访问没有权限的CSR会Trap,访问不存在的CSR会Trap,写只读CSR会Trap,对于可选寄存器的操作会被忽略

【百问网DongshanPI-D1S开发板体验】2环境搭建
全志D1s开发板裸机开发之坏境搭建
DongshanPi-D1s快速上手 | 开发环境搭建
韦东山D1S板子——xfel工具无法烧写bin文件到spi norFlash问题解决
RISC-V 架构 - 精讲


http://www.hkcw.cn/article/dnJgetkeJT.shtml

相关文章

安装Arch Linux(实体机、干货)

一、环境: 本地PC机:ASUS 目标:安装原生Arch (备注:本文按照主流的UEFIGPTD方式,不涉及BIOSMBR) Arch相关网站 官方网站:https://archlinux.org/官方wiki:https://wiki.archlinux.org/title/I…

电机控制选 STM32 还是 DSP?技术选型背后的现实博弈

现在搞电机控制,圈里人都门儿清 —— 主流方案早就被 STM32 这些 Cortex-M 单片机给拿捏了。可要是撞上系统里的老甲方,技术认知还停留在诺基亚砸核桃的年代,非揪着 DSP 不放,咱也只能赔笑脸:“您老说的对,…

秋招Day12 - 计算机网络 - 基础

说一下计算机网络体系结构 OSI七层模型,TCP/IP四层模型和五层体系结构 说说OSI七层模型? 应用层:最靠近用户的层,用于处理特定应用程序的细节,提供了应用程序和网络服务之间的接口。表示层:确保从一个系…

端午假期铁路运输今日开启 长三角迎来首波客流小高峰

2025年5月29日,G7583次高铁列车上,乘务员与旅客互动开展迎端午活动。5月30日,长三角铁路启动端午小长假运输,预计发送旅客342万人次。同日,铁路上海站预计发送旅客52.0万人次,车站增开安徽、徐州、沪杭等方向旅客列车52列。午后起,上海、杭州、南京、合肥、徐州、宁波、…

执行npm命令报在此系统禁止运行脚本

问题场景: idea导入一个前端vue项目,在控制台terminal执行npm install 提示 “npm : 无法加载文件 D:\work\nodejs22\npm.ps1,因为在此系统上禁止运行脚本。” 问题原因:idea 的terminal 默认是通过powershell.exe 来执行npm脚本…

2025-5-27Vue3快速上手

1、对路由的理解 (1)路由(route)是一组key-value的对应关系。这种对应关系把 URL 路径和特定的组件、函数或者页面联系起来,其核心作用是依据不同的 URL 路径,将用户请求导向对应的处理逻辑。 &#xff0…

女子电动车被推走怒掀一排自行车,两辆碳纤维车架受损

女子电动车长期占公共车位被推走,怒掀一排自行车,结果想报复却反坑自己,其中两辆竟是碳纤维车架。赔吧~责任编辑:zx0002

许家印,再被签发限消令!

近日,中国恒大集团及许家印新增两则限制消费令,涉及与常熟苏润资产管理有限公司、苏州资产管理有限公司的国内非涉外仲裁裁决案件,执行法院均为广东省广州市中级人民法院。据悉,2023年4月,中国恒大集团、恒大恒驰新能源汽车(上海)有限公司等因这两起案件被分别执行7953万…

左手研发右手市场,“科学家CEO”撬动中山产业版图 突破技术“天花板”

左手研发右手市场,“科学家CEO”撬动中山产业版图 突破技术“天花板”。中山博顿光电科技有限公司CEO冀鸣每天早早来到公司,比员工来得早,走得也比他们晚。他的动力源自一个梦想——打破国外进口垄断,让国内企业都能用上高端光电加工装备。2025年5月30日是全国科技工作者日…

临江仙 于正赞粗剪版获好评

5月29日,编剧于正发文回顾了仙侠剧《临江仙》的粗剪看片会。他表示,粗剪版已经非常好看,不会出现口碑崩塌的情况。参与看片的人都给出了100%的好评,于正将《临江仙》项目称为他创作生涯中最爽的一次工作。《临江仙》由智磊和国浩两位导演执导,智磊曾导演过《嘉南传》和《漂…

杏仁海棠花饼的学习日记第十三天

一,前言 今天是学习前端三件套的第一天,今天来学HTML。我看的是b站罗大富Bigrich的视频。 二,安装VSCode开发环境 安装直接从官网上安装适配自己电脑版本的即可。 这边着重说一下一些有用的插件 Chinese (Simplified)汉化包,…

离散化算法的下标映射

我们思考一个问题:如果将下标也一同排序,数据将是怎么的形式呢? 将下标和元素绑定后,有一个好处,对应每个元素能 O(1) 的找出该元素在原始数组中的位置。 因此,我们只需要顺序遍历排序后的元素,…

Redisson学习专栏(一):快速入门及核心API实践

文章目录 前言一、Redisson简介1.1 什么是Redisson?1.2 解决了什么问题? 二、快速入门2.1 环境准备 2.2 基础配置三、核心API解析3.1 分布式锁(RLock)3.2 分布式集合3.2.1 RMap(分布式Map)3.2.2 RList&…

男子洗空调捅鼠窝 老鼠下饺子般逃散!

男子洗空调捅鼠窝 老鼠下饺子般逃散。5月28日,上海,男子清洗空调时捅了老鼠窝,6只老鼠掉下来四处逃散:吓死了!空调长期不用一定要定时清洗!事人说家里空调有声音,有点漏水,然后就打电话让修理空调的师傅来看一下,结果没有想到在修的过程中,一窝老鼠从空调中串了出来。…

2025年业财一体化如何重塑工程项目管理?

在工程项目管理领域,2025年被认为是数字化转型的关键节点。随着工程行业规模扩大、项目复杂度提升以及市场竞争加剧,传统管理模式已难以满足高效、精准、合规的需求。业财一体化作为数字化转型的核心驱动力,正在通过数据贯通、流程协同和智能…

70后存款多少才算有钱?银行人给出答案

70后存款多少才算有钱?银行人给出答案。我是个70后,70年代末出生,眼看着奔五的人了。最近网上一则消息挺扎心的,说是“70后存款曝光”,标题还特别刺眼——“多少存款才算有钱人?银行人给出答案,97%的人都不达标。”我点进去一看,说得还挺有道理,瞬间心头一紧,不由自主…

男子带不同小孩长期卖惨行乞 骗局曝光引关注

男子带不同小孩长期卖惨行乞骗局曝光引关注。近日,多名网友曝光了一名五六十岁的中年男子长期在郑州地铁内以“给孩子治病”等各种理由向乘客索要钱财。这名男子身边带的小孩还经常换人。一些网友表示曾出于爱心给过他钱,但后来多次发现该男子仍在行乞,并且每次的理由都不一…

React 生命周期与 Hook:从原理到实战全解析

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 持续学习,不断…

中国驻美使馆回应撤销留学生签证 坚决反对美方做法

中国驻美使馆回应撤销留学生签证。中国驻美国大使馆发言人5月29日回应美国务院关于撤销中国在美留学生签证的声明,表示中方坚决反对这一政治性、歧视性的做法。美方此举将严重损害中国在美留学人员的正当合法权益,并进一步损害美国自身的国际形象和国家信誉。中国驻美使馆已向…

C# 事件的选择与使用

在C#中选择使用EventHandler还是自定义事件委托,取决于具体需求。以下是详细对比 一、决策指南 在 C# 中,EventHandler 是一个泛型委托,用于简化事件的定义和处理。它允许你创建带有自定义事件参数的事件,而不需要每次都定义新的…