vue-video-player修改src就會報錯_4、修改入口點代碼

在riscv上電時,會進行CPU自檢,然后跳轉到bootloader處執行。bootloader設置好kernel的運行環境后,從硬盤加載kernel到內存,最后再跳轉到kernel入口地址。

我們采用的bootloader為OpenSBI,被加載到0x80000000地址,OpenSBI探測好外設并初始化內核的環境變量后,加載內核到0x80200000地址,最后再跳轉到0x80200000地址。從上文我們知道,我們的入口點_start地址正好為0x80200000,也就是OpenSBI會調用我們kernel的_start函數。

在riscv64中,有如下幾種特權級:

f05f87f5e7f30c472c1bd88aae6d48fd.png

User模式:該特權模式為權限最小的模式,在linux系統中用戶態就運行在該特權級;

Supervisor模式:該特權級時linux操作系統運行的模式,特權級別比User模式高;

Machine模式:CPU上電啟動后運行在該特權模式,該特權比Supervisor更高。

從 U 到 S 再到 M,權限不斷提高,這意味著你可以使用更多的特權指令,訪需求權限更高的寄存器等等。我們可以使用一些指令來修改 CPU 的當前特權級

riscv64 的 M ModeM-mode(機器模式,縮寫為 M 模式)是 RISC-V 中 hart(hardware thread,硬件線程)可以執行的最高權
限模式。在 M 模式下運行的 hart 對內存,I/O 和一些對于啟動和配置系統來說必要的底層功能有著完全的
使用權。riscv64 的 S ModeS-mode(監管者模式,縮寫為 S 模式)是支持現代類 Unix 操作系統的權限模式,支持現代類 Unix 操作系
統所需要的基于頁面的虛擬內存機制是其核心。

OpenSBI運行在Machine模式,當跳轉到kernel地址0x80200000執行時,會切換到Supervisor模式執行。

在我們之前的 _start() 代碼中只執行了loop,也就是無限循環,沒有做任何實質的操作。現在我們需要添加不同的功能,因此就需要設置一下kernel內核的運行環境。這個運行環境我們首先需要設置的是內核堆棧,在rust函數調用時會使用到這個堆棧,如果我們不設置sp的地址,那么就可能使用sp指向的任何地址,這將給程序帶來意想不到的后果。

由于riscv64的sp地址不能通過rust語言設置,因此這部分的環境變量就需要在匯編程序下設置:

# src/boot/entry_riscv64.asm.section .text.entry.global _start
_start:la sp, bootstacktopcall rust_main.section .bss.stack.align 12.global bootstack
bootstack:.space 4096 * 4.global bootstacktop
bootstacktop:

_start 程序放在 .text.entry 這個段中,我們鏈接腳本中將 .text.entry 放在了.text 段的第一個位置,也就是將_start函數放在了.text的第一個位置。

在_start開始處,將堆棧的頂部地址加載到sp寄存器中,并且堆棧的大小為16k,然后調用rust_main函數。

在main.rs中,我們將_start函數刪除,并且添加rust_main函數。

#![no_main]
#![no_std]use core::panic::PanicInfo;#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {loop{}
}#[no_mangle]
extern "C" fn rust_main() -> ! {loop{}
} 

為了支持匯編代碼,我們需要開啟global_asm特性,因此我們在main.rs中開啟該特性,并包含src/boot/entry_riscv64.asm匯編代碼:

#![no_main]
#![no_std]use core::panic::PanicInfo;#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {loop{}
}#![feature(global_asm)]
global_asm!(include_str!("boot/entry_riscv64.asm"));#[no_mangle]
extern "C" fn rust_main() -> ! {loop{}
} 

注意,上面中我們將匯編特性代碼添加在panic_handler下面,此時會報錯:

error: an inner attribute is not permitted in this context--> src/main.rs:11:1|
11 | #![feature(global_asm)]| ^^^^^^^^^^^^^^^^^^^^^^^|= note: inner attributes, like `#![no_std]`, annotate the item enclosing them, and are usually found at the beginning of source files. Outer attributes, like `#[test]`, annotate the item following them.error[E0658]: use of unstable library feature 'global_asm': `global_asm!` is not stable enough for use and is subject to change--> src/main.rs:13:1|
13 | global_asm!(include_str!("boot/entry_riscv64.asm"));| ^^^^^^^^^^|= note: see issue #35119 <https://github.com/rust-lang/rust/issues/35119> for more information= help: add `#![feature(global_asm)]` to the crate attributes to enableerror: aborting due to 2 previous errorsFor more information about this error, try `rustc --explain E0658`.
error: could not compile `rust_os`.

這里顯示錯誤的原因為global_asm是不穩定的功能,需要使用nightly來編譯程序。但我們此時已經是使用nightly了。正真的原因是#![feature(global_asm)]特性代碼放在了panic_handler代碼的后面,解決的辦法是#![feature(global_asm)]特性必須放在文件開頭的位置,修改后的代碼如下:

#![no_main]
#![no_std]
#![feature(global_asm)]use core::panic::PanicInfo;#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {loop{}
}global_asm!(include_str!("boot/entry_riscv64.asm"));#[no_mangle]
extern "C" fn rust_main() -> ! {loop{}
} 

此時可以編譯通過了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542394.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542394.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542394.shtml

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

相關文章

數碼管超聲波c語言黑51,51單片機開發板-超聲波測距-數碼管顯示

《51單片機開發板-超聲波測距-數碼管顯示》由會員分享&#xff0c;可在線閱讀&#xff0c;更多相關《51單片機開發板-超聲波測距-數碼管顯示(16頁珍藏版)》請在人人文庫網上搜索。1、計算機技術系項目工作報告課程名稱單片機開發板設計與制作實訓班級學號姓名項目名稱超聲波測距…

java 方法 示例_Java ArrayDeque帶有示例的removeFirstOccurrence()方法

java 方法 示例ArrayDeque類removeFirstOccurrence()方法 (ArrayDeque Class removeFirstOccurrence() method) removeFirstOccurrence() method is available in java.lang package. removeFirstOccurrence()方法在java.lang包中可用。 removeFirstOccurrence() method is use…

社交應用動態九宮格圖片的規則

這里主要以微信和QQ空間為作為研究對象&#xff0c;得到的結論如下。 QQ空間里的動態 iOS設備&#xff0c;以iPhone6為分界 iPhone6及以上分辨率的設備&#xff1a; 當寬且高同時 > 512px時&#xff0c;判斷 寬/高的比例值&#xff1a;大于 2時&#xff0c;以高度為基準&…

c語言實現鏈表結構6,用c語言實現的鏈表結構--數據結構實驗

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓#include"stdio.h"//使用new指針來將臨時變量重新初始化#include"stdio.h"typedef int ElemType;typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList;void InitList(LinkList &L)//…

splunk中 如何隱藏input_翻糖制作中,如何避免裂縫,如何隱藏裂縫,如何防粘?...

翻糖蛋糕 因精致的樣子和栩栩如生的各種造型深得人們的喜愛&#xff0c;它不僅滿足了人們對蛋糕口味及裝飾日益多樣化的需求&#xff0c;同時也在動手制作的過程中&#xff0c;享受到美食與生活的無窮樂趣。不過裂縫&#xff0c;不平整&#xff0c;干燥對翻糖作品來說無疑是噩夢…

Java DataInputStream readUnsignedByte()方法(帶示例)

DataInputStream類readUnsignedByte()方法 (DataInputStream Class readUnsignedByte() method) readUnsignedByte() method is available in java.io package. readUnsignedByte()方法在java.io包中可用。 readUnsignedByte() method is used to read 1 byte (i.e. 8 bit) of …

wpf中groupbox有什么用_展示設計中的標攤是什么 用的什么材料

經常聽從事展示設計的工作人員說起標攤&#xff0c;那什么是標攤呢&#xff1f;顧名思義&#xff0c;標攤就是通用標準的國際展會攤位的縮寫。但是不少人看到干巴巴的詞語還是不能理解。那么這篇文章從用途、材料等方面來詳細介紹標攤究竟是什么。 標攤的主要材質是什么一般來說…

Java BigInteger類| nextProbablePrime()方法與示例

BigInteger類nextProbablePrime()方法 (BigInteger Class nextProbablePrime() method) nextProbablePrime() method is available in java.math package. nextProbablePrime()方法在java.math包中可用。 nextProbablePrime() method is used to get the next probable prime n…

SQL 行轉列的兩種做法

if object_id(tb)is not null drop table tbGocreate table tb(姓名 varchar(10),課程 varchar(10),分數 int)insert into tb values(張三,語文,74)insert into tb values(張三,數學,83)insert into tb values(張三,物理,93)insert into tb values(李四,語文,74)insert into tb…

android一個工程的xml怎么引用另外一個工程的xml,如何在Android中使用XML引用庫中另一個包的字符串?...

Androiddocumentation告訴我,我可以使用“包名”訪問另一個包中的字符串,無論這意味著什么&#xff1a;[:]/所以在我的清單中,我想訪問一個字符串,我已將其放在一個單獨的庫項目中,在com.globalmentor.android包中 – 畢竟我的R類就是這樣&#xff1a;android:label"com.g…

kotlin 類和對象_Kotlin程序| 類和對象的示例(帶有學生數據)

kotlin 類和對象In the below program, we are creating a student class to input and print the student data like name, age. It is a simple example of creating class in Kotlin. 在下面的程序中&#xff0c;我們將創建一個學生班級&#xff0c;以輸入和打印學生數據&am…

python 復數數組_python的數組運算及推導式的運用

運行方式&#xff1a;縮進 TAb(四格)或者space(1格)注釋&#xff1a;#可以在程序后注釋文字 或者 ... &#xff0c;""" ... """ 可以多行注釋 中間全為注釋數值輸出 print(...)圖形輸出 import matplotlib as pltplt.show()列表 list[] #字符串…

ActiveX: 如何用.inf和.ocx文件生成cab文件

ActiveX: 如何用.inf和.ocx文件生成cab文件 轉載于:https://www.cnblogs.com/time-is-life/p/5977962.html

Android工具里沒有Android,android – AppCompat工具欄沒有顯示

在主題中聲明.NoActionBar之后,以及將工具欄放在布局中,我的工具欄不會顯示.我最終得到的正是你在宣布沒有動作欄時所期望的 – 沒有動作欄.這是布局&#xff1a;activity_home.xml&#xff1a;layout"layout/app_bar_home"android:layout_width"match_parent&q…

操作系統中的處理機調度調度_操作系統中的多處理器調度

操作系統中的處理機調度調度多處理器操作系統 (Multiprocessor Operating system) A multiprocessor system consists of several processors which share memory. In the multiprocessor, there is more than one processor in the system. The reason we use multiprocessor …

轉:Delphi2010新發現-類的構造和析構函數功能

Delphi2010發布了. 雖然憑著對Delphi的熱愛第一時間就安裝了,但是現在可能是年紀大了,對新事物缺乏興趣了.一直都沒有仔細研究. 今天有點時間試了一下新功能. 本來C#和Delphi.NET是支持類的構造函數/析構函數的(注意不是實例的構造和析構).也就是在模塊初始化/卸載的時候會調用…

sed 替換_sed命令批量替換文件內容

“ 開發人員有時會大批量替換文件內容&#xff0c;sed命令是一個很好用的工具。”01—暴力替換方式近期有個臨時任務,將系統中所有"帳"替換為"賬",那"帳"和"賬"有啥區別呢;1、賬的部首是貝&#xff1b;帳的部首是巾。2、賬是關于貨幣、…

android 模仿uc標簽頁,模仿UCweb菜單 - 白羽雕弓 - 博客園

UCWeb的菜單看起來不錯&#xff0c;自己想模仿做一個&#xff0c;苦惱一直沒有思路google了幾天&#xff0c;終于找到一個帖子 http://www.eoeandroid.com/viewthread.php?tid28824按照上面提供的思路實現了1、保留menu按鍵作用2、用popupwindow作為菜單顯示容器3、用GridVie…

ipv6路由協議配置_IPV6尋址,標頭和路由協議

ipv6路由協議配置The IPV6 address is 128 bits. Whereas IPV4 is represented by 4 groups of decimal numbers, same IPV6 is represented by 8 groups of hexadecimal numbers. The example of IPV6 address is 2001:0db8:85a3:0000:0000:8a2e:0370:7334. IPV6地址是128位。…

rpc框架

Motan&#xff0c;dubbo轉載于:https://www.cnblogs.com/zhangshiwen/p/5980886.html