在user/usys.S此處是由ussys.pl 腳本生成的片段
.global sbrk
sbrk:
li a7, SYS_sbrk
ecall
ret
.global sleep
sleep:
li a7, SYS_sleep
ecall
ret
.global uptime
uptime:
li a7, SYS_uptime
ecall
ret
用戶函式需要呼叫內核系統呼叫,因為只有內核才有執行所需指令的權限。所以用戶函式需要用匯編撰寫,以便可以使用ecall將觸發內核函式的 riscv指令。引數如何傳遞給這個內核系統呼叫函式?
uj5u.com熱心網友回復:
我們只談sleep. 在您之前的一個問題中,您發布了一個指向user.h 頭檔案的鏈接。該頭檔案告訴您的 C 編譯器該函式采用什么引數以及該函式回傳什么,在這一行:
int sleep(int);
在處理該行之后,C 編譯器知道它sleep需要一個int引數。因此,當您嘗試在 C 程式中呼叫該函式時,編譯器將確保使用將引數傳遞給平臺上的函式的標準方式將int引數傳遞給該函式。這稱為呼叫約定。例如,呼叫約定可能會說將引數放在堆疊上或將其放在特定暫存器中。您可以查看 C 編譯器生成的程式集,了解它在呼叫sleep.
我真的不知道做什么的細節ecall,但在某些時候它應該觸發內核中的一些代碼,并且該代碼也會知道您平臺的呼叫約定,因此它可以檢索您的 C 編譯器傳遞給sleep.
有關內核方面的更多詳細資訊,請查看sys_sleep 的源代碼,并了解它如何呼叫argint以獲取其引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/395673.html
