RISCV——內核及匯編

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.pswp.cn/diannao/85026.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85026.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85026.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法日記32:埃式篩、gcd和lcm、快速冪、乘法逆元

一、埃式篩(計算質數) 1.1、概念 1.1.1、在傳統的計算質數中,我們采用單點判斷,即判斷(2~sqrt(n))是否存在不合法元素,若存在則判否,否則判是 1.1.2、假設,此時我們需要求1~1000的所有質數&am…

使用 mysqldump 獲取 MySQL 表的完整創建 DDL

要獲取 MySQL 中某個表的完整創建 DDL(僅結構,不含數據),可以使用 mysqldump 工具的以下命令: 基本命令格式 bash mysqldump -h [主機名] -u [用戶名] -p --no-data --single-transaction --routines --triggers --…

Debian 系統 Python 開發全解析:從環境搭建到項目實戰

Debian 系統 Python 開發全解析:從環境搭建到項目實戰 在當今數字化時代,Python 憑借其簡潔易讀的語法和強大的功能,成為了最受歡迎的編程語言之一。Debian 作為一款穩定、安全且開源的 Linux 操作系統,為 Python 開發提供了理想的環境。本文將詳細介紹在 Debian 系統上進…

實時技術對比:SSE vs WebSocket vs Long Polling

早期網站僅展示靜態內容,而如今我們更期望:實時更新、即時聊天、通知推送和動態儀表盤。 那么要如何實現實時的用戶體驗呢?三大經典技術各顯神通: ? SSE(Server-Sent Events):輕量級單向數據…

【前端】es6新特性全解

第一章 簡介 1.1 ES6概述 1.1.1 ES6定義與發展歷程 1. ES6 定義 ES6 全稱 ECMAScript 6.0,它是 JavaScript 語言的下一代標準,對 JavaScript 語言進行了許多增強和擴展,帶來了更簡潔、更強大的語法特性。可以把 ES6 想象成是 JavaScript …

nlp中的頻率就是權重嗎

🔢 一、“頻率”是什么? 在 NLP 中,**詞頻(frequency)**通常指的是: 某個單詞或 token 在語料庫中出現的次數(或比例) 舉例: "The cat sat on the mat. The cat i…

多模態大語言模型arxiv論文略讀(九十八)

Accelerating Pre-training of Multimodal LLMs via Chain-of-Sight ?? 論文標題:Accelerating Pre-training of Multimodal LLMs via Chain-of-Sight ?? 論文作者:Ziyuan Huang, Kaixiang Ji, Biao Gong, Zhiwu Qing, Qinglong Zhang, Kecheng Zhe…

WEB安全--RCE--webshell HIDS bypass4

繼WEB安全--RCE--webshell HIDS bypass3的補充&#xff1a; 十三、時間開關 webshell&#xff1a; <?php ini_set("display_errors",1); function foo($test, $bar FSYSTEM) {echo $test . $bar; } $function new ReflectionFunction(foo); $q new ParseEr…

.NET 7 AOT 使用及 .NET 與 Go 語言互操作詳解

.NET 7 AOT 使用及 .NET 與 Go 語言互操作詳解 目錄 .NET 7 AOT 使用及 .NET 與 Go 語言互操作詳解 一、背景與技術概述 1.1 AOT 編譯技術簡介 1.2 Go 語言與 .NET 的互補性 二、.NET 7 AOT 編譯實踐 2.1 環境準備 2.2 創建 AOT 項目 2.3 AOT 編譯流程 2.4 調試信息處…

機器人--里程計

教程 輪式里程計視頻講解 里程計分類 ros--odometry 什么是里程計 里程計是一種利用從移動傳感器獲得的數據來估計物體位置隨時間的變化而改變的方法。該方法被用在許多機器人系統來估計機器人相對于初始位置移動的距離。 注意&#xff1a;里程計是一套算法&#xff0c;不…

云原生時代 Kafka 深度實踐:02快速上手與環境搭建

2.1 本地開發環境搭建 單機模式安裝 下載與解壓&#xff1a;前往Apache Kafka 官網&#xff0c;下載最新穩定版本的 Kafka 二進制包&#xff08;如kafka_2.13-3.6.0.tgz&#xff0c;其中2.13為 Scala 版本&#xff09;。解壓到本地目錄&#xff0c;例如/opt/kafka&#xff1a…

Vue Hook Store 設計模式最佳實踐指南

Vue Hook Store 設計模式最佳實踐指南 一、引言 在 Vue 3 組合式 API 與 TypeScript 普及的背景下&#xff0c;Hook Store 設計模式應運而生&#xff0c;它結合了 Vue 組合式 API 的靈活性與狀態管理的最佳實踐&#xff0c;為開發者提供了一種輕量級、可測試且易于維護的狀態…

無人機多人協同控制技術解析

一、運行方式 無人機多人點對點控制通常采用以下兩種模式&#xff1a; 1. 主從控制模式 指定一個主控用戶擁有最高優先級&#xff0c;負責飛行路徑規劃、緊急操作等關鍵指令&#xff1b;其他用戶作為觀察者&#xff0c;僅能查看實時畫面或提交輔助指令&#xff0c;需經主…

樹型表查詢方法 —— SQL遞歸

目錄 引言&#xff1a; 自鏈接查詢&#xff1a; 遞歸查詢&#xff1a; 編寫service接口實現&#xff1a; 引言&#xff1a; 看下圖&#xff0c;這是 course_category 課程分類表的結構&#xff1a; 這張表是一個樹型結構&#xff0c;通過父結點id將各元素組成一個樹。 我…

微服務難題?Nacos服務發現來救場

文章目錄 前言1.什么是服務發現2.Nacos 閃亮登場2.1 服務注冊2.2 服務發現 3.Nacos 的優勢3.1 簡單易用3.2 高可用3.3 動態配置 4.實戰演練4.1安裝 Nacos4.2 服務注冊與發現示例代碼&#xff08;以 Spring Boot 為例&#xff09; 總結 前言 大家好&#xff0c;我是沛哥兒。今天…

AStar低代碼平臺-腳本調用C#方法

修改報工表表單&#xff0c;右鍵定義彈出菜單&#xff0c;新增一個菜單項&#xff0c;并在點擊事件腳本中編寫調用腳本。 編譯腳本&#xff0c;然后在模塊代碼里面定義這個方法&#xff1a; public async Task<int> on_call_import(DataRow curRow) {PrintDataRow(cur…

python調用langchain實現RAG

一、安裝langchain 安裝依賴 python -m venv env.\env\Scripts\activatepip3 install langchainpip3 install langchain-corepip3 install langchain-openaipip3 install langchain-communitypip3 install dashscopepip3 install langchain_postgrespip3 install "psyc…

大學大模型教學:基于NC數據的全球氣象可視化解決方案

引言 氣象數據通常以NetCDF(Network Common Data Form)格式存儲,這是一種廣泛應用于科學數據存儲的二進制文件格式。在大學氣象學及相關專業的教學中,掌握如何讀取、處理和可視化NC數據是一項重要技能。本文將詳細介紹基于Python的NC數據處理與可視化解決方案,包含完整的代…

ORB-SLAM2學習筆記:ComputeKeyPointsOctTree分析過程記錄

ComputeKeyPointsOctTree是ORB特征提取器中計算關鍵點的部分&#xff0c;特別是使用八叉樹&#xff08;OctTree&#xff09;方法進行關鍵點分布。 首先&#xff0c;函數參數是vector<vector的引用allKeypoints&#xff0c;用來存儲各層的關鍵點。代碼開頭調整了allKeypoint…

LeetCode Hot100(多維動態規劃)

62. 不同路徑 比較板子的dp&#xff0c;實際上就是到達一個點有兩種方式&#xff0c;從上面來或者是左邊&#xff0c;加起來就可以了 class Solution {public int uniquePaths(int m, int n) {int [][]arr new int[m2][n2];arr[1][1]1;for(int i1;i<m;i){for(int j1;j<…