這是我的 user/sleep.c 代碼:
#include "kernel/types.h"
#include "user/user.h"
int
main(int argc, char *argv[])
{
if (argc < 2)
{
printf("You have forgotten to pass an argument.");
exit(1);
}
int arg = atoi(argv[1]);
sleep(arg);
exit(0);
// return 0;
}
一切都很好,但是使用 return 0 而不是 exit(0),我收到以下錯誤:
usertrap(): unexpected scause 0x000000000000000d pid=4
sepc=0x00000000000000f6 stval=0x0000000000003008
這是為什么?
uj5u.com熱心網友回復:
這是因為xv6在這一點上不是標準的:
見https://tnallen.people.clemson.edu/2019/03/04/intro-to-xv6.html
在 main 之后回傳是 XV6 不支持的一種特殊情況,因此請記住始終在 main 結束時退出()而不是回傳。否則,您將得到一個“陷阱 14”,在本例中是 XV6 中的“Segmentation Fault”。最后,請注意我們的標題是不同的。沒有你可能習慣的 #include <stdio.h> 。同樣,這是因為標準庫不同。查看這些標題以了解您可以使用哪些型別的用戶實用程式。
那么為什么我們需要exit()在 xv6 中呢?
因為,例如,在為 linux 構建程式時gcc,工具鏈會添加所需的exit呼叫:請參閱https://en.wikipedia.org/wiki/Crt0
簡而言之,在 linux 上,您的程式不是從以下位置開始,main而是從以下位置開始start:
void start(void) {
/* get argc, argv, env) */
int r = main(argc, argv, envp); /* << start calls the actual main */
exit(r);
}
相反,在 xv6 上,真正的起點是main當作業系統嘗試從main.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/448221.html
