å·çè : é«æ© 浩å
â» ãRISC-V OSãä½ãããé£è¼è¨äºä¸è¦§ã¯ãã¡ã
â» ãRISC-V OSãã®ã³ã¼ãã¯githubã«ã¦å
¬éãã¦ãã¾ãã
ã¯ããã«
ä»åã¯ãOSãã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãã§åä½ããããã¨ã«ãã¾ãããã·ã³ã¢ã¼ãã§åä½ããã¢ãã¿ããã°ã©ã ã®ä¸ã«OSãè¼ãã¾ãã
OSãã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãã§åä½ãããã¨ãRISC-Vã®ä¸é¨ã®æ©è½ãæä½ã§ããªããªãã¾ãããããã¯ã¢ãã¿ããã°ã©ã ã«ä»£è¡ãã¦ãããã¾ããOSã¨ã¢ãã¿ã®ã¤ã³ã¿ã¼ãã§ã¤ã¹ã¯RISC-V SBIä»æ§ã«åããããã¨ã«ãã¾ã*1ã
æ¹é
OSãã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãã§å®è¡ãããã¨ããã·ã³ã¢ã¼ãç¨ã«ç¨æããã¦ããMSTATUS
, MCAUSE
, MIP
, MEP
ãªã©ã®'M'ã®æåããå§ã¾ãååã®ç¹æ¨©ã¬ã¸ã¹ã¿ç¾¤ãæä½ã§ããªããªãã¾ãã代ãã«ãã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãç¨ã«ã¯SSTATUS
, SCAUSE
, SIP
, SEP
ãªã©ã®'S'ã®æåããå§ã¾ãååã®ç¹æ¨©ã¬ã¸ã¹ã¿ç¾¤ãç¨æããã¦ãããããããç¨ãã¦OSãå¶å¾¡ãã¾ãããããã¬ã¸ã¹ã¿ã®ç¨éã使ãæ¹ã¯ããã·ã³ã¢ã¼ãç¨ã®ã¬ã¸ã¹ã¿ã¨ã»ã¼åãã§ãã
OSããã·ã³ã¢ã¼ãã§ãªããã°è¡ãªããªãæä½ãå¿
è¦ã«ãªã£ãæã¯ãã¢ãã¿ããã°ã©ã ã«ä¾é ¼ããå¿
è¦ãããã¾ãããã·ã³ã¢ã¼ãããå©ç¨ãããã¨ãåæã¨ããã³ã³ããã¼ã©ã®ã¬ã¸ã¹ã¿ç¾¤(MTIMECMP
ã¬ã¸ã¹ã¿ãMSIP
ã¬ã¸ã¹ã¿ãªã©)ãã¢ãã¿ããã°ã©ã çµç±ã§æä½ããå¿
è¦ãããã¾ãã
ã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãã§ecall
å½ä»¤ãå®è¡ããã¨ãã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãEnvironment Callä¾å¤ãçºçãããã·ã³ã¢ã¼ãã«åãæ¿ããã¢ãã¿ããã°ã©ã ãèµ·åãã¾ããã¢ãã¿ããã°ã©ã ã¯ä¾é ¼ãããå¦çãå®è¡ããå¾ã«mret
å½ä»¤ãå®è¡ããå¼ã³åºãå
(ã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãã§å®è¡ä¸ã®OS)ã«å¾©å¸°ãã¾ããã¢ããªã±ã¼ã·ã§ã³ãã·ã¹ãã ã³ã¼ã«ãçºè¡ããæãecall
å½ä»¤ã®å®è¡ã«ããOSãå¼ã³åºãã¦å¦çã代è¡ãã¦ãããã®ã¨åãé¢ä¿ã«ãªãã¾ãã
OSããã¢ãã¿ã¸ã®è¦æ±æé ã¯ãå ã«ãè¿°ã¹ã¾ããããSBI: Supvervisor Binary Interfaceã«å¾ããã¨ã«ãã¾ãã
å²ãè¾¼ã¿ã¯ã¢ãã¿ããã°ã©ã ãä¸åº¦ååããã¢ãã¿ããã°ã©ã ãã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãã«åãã¦å²ãè¾¼ã¿ãçºçããããã¨ã«ãããOSãå²ãè¾¼ã¿ãåãåããããã«ãã¾ãã
ç¾å¨ã®OSå®è£ ã§ã¯ããã·ã³ã¿ã¤ãå²ãè¾¼ã¿ã¨ãã·ã³ã½ããã¦ã§ã¢å²è¾¼ã¿ãå©ç¨ãã¦ãã¾ãããã·ã³ã¿ã¤ãå²ãè¾¼ã¿ãåãåã£ãã¢ãã¿ããã°ã©ã ã¯ã¹ã¼ãã¼ãã¤ã¶ã¼ã¿ã¤ãå²ãè¾¼ã¿ãçæããOSã«éç¥ãããã®ã¨ãã¾ããåæ§ã«ããã·ã³ã½ããã¦ã§ã¢å²ãè¾¼ã¿ãåãåã£ãã¢ãã¿ããã°ã©ã ã¯ã¹ã¼ãã¼ãã¤ã¶ã¼ã½ããã¦ã§ã¢å²ãè¾¼ã¿ãçæãããã®ã¨ãã¾ãã
OpenSBIä¸ã§ã®å®è£
æ¹éã§è¿°ã¹ãåä½ãããã¢ãã¿ããã°ã©ã OpenSBIãæ¢ã«åå¨ãã¦ãã¾ããã¾ãããã®OpenSBIä¸ã§RISC-V OSãåãããã¨ã«ãã¾ã*2ã
OSã®èµ·å
OSã®èµ·åã¯OpenSBIãè¡ãªãã¾ãã64bit RISC-V virtãã¼ãã¦ã§ã¢ç°å¢ã§ã¯ãOSã¯0x80200000çªå°ããé ç½®ããã¦ããããã®å é ã«ãªã»ããã¨ã³ããªããããã®ã¨ããã¾ã*3ã
OSã®ãªã»ããã¨ã³ããªå¼åºãã¯ãã¼ãã³ã¢1ã¤ã®ã¿ãè¡ãªãã¾ãããã®ä»ã®ã³ã¢ã¯OpenSBIã®ä¸ã§åæ¢ããããã¦ãã¾ããOpenSBIã§ã¯ãã¼ãã³ã¢ã®ã³ã¢çªå·(HART ID)ã0ã§ããä¿è¨¼ã¯ããã¾ãããå®éãOpenSBIã¯ãã¼ãã³ã¢ãã©ã³ãã ã«æ±ºå®ãã¾ãã
æåã®main
é¢æ°å¼åºãæãå¼æ°ã«æ¸¡ãããcoreid
ã®å¤ã¯ã«ã¬ã³ãã³ã¢ãæãã¦ãã¾ãããOSã®æåã®ä»äºã¯ãã¼ãã³ã¢ã®ã³ã¢çªå·(HART ID)ãç¥ããã¨ã§ããæ¬OSã§ã¯ãå
¨ã³ã¢ã«å¯¾ãã¦SBI sbi_hart_get_status
é¢æ°ãå¼ã³åºããã¨ã§ãã¼ãã³ã¢ãè¦ä»ãããã¨ã«ãã¾ãã(restart_bootcoreé¢æ°)ãsbi_hart_get_status
é¢æ°ã¯ãæå®ããã³ã¢(hart)ã®ç¶æ
ãåå¾ããSBIå¼ã³åºãã§ãããã¼ãã³ã¢ã«å¯¾å¿ããhartidã«å¯¾ãã¦ã®ã¿ãæ»ãå¤ã¨ãã¦STARTEDãæ»ã£ã¦æ¥ãã¯ãã§ã*4ã
static volatile CoreIdType BootCore = CORE_UNASSIGNED; void main(CoreIdType coreid) { TaskIdType task; SetTrapVectors((unsigned long)trap_vectors + TVEC_VECTORED_MODE); if (BootCore == CORE_UNASSIGNED) { restart_bootcore(); } : : } static void restart_bootcore(void) { struct sbiret ret; CoreIdType coreid; for (coreid = CORE0; coreid < NUMBER_OF_CORES; coreid++) { struct sbiret ret = sbi_hart_get_status(coreid); if (ret.error == SBI_SUCCESS && ret.value == STARTED) { BootCore = coreid; _secondary_start(BootCore); } } }
ãã¼ãã³ã¢ã®ã³ã¢çªå·ãè¦ä»ãã£ãã¨ããã§ãBootCore
å¤æ°ã«ã³ã¢çªå·ãè¨é²ãã_secondary_start
é¢æ°ãããªã»ããå¦çãåå®è¡ãã¾ããå¼æ°ã«ã¯ãã¼ãã³ã¢ã®ã³ã¢çªå·ã渡ãã¾ãããã¼ãã³ã¢ã«ããå度main
é¢æ°ãå¼ã°ããæã®coreid
å¼æ°ã«ã¯ãæ£ããã³ã¢çªå·ãå
¥ã£ã¦ãã¾ãã
.section .reset,"ax",@progbits .option norelax .globl _start .globl _secondary_start _start: mv a0, zero _secondary_start: /* a0 = mhartid */ la gp, __global_pointer$ /* tp = _tls_start + mhartid*_TLS_SIZE */ la tp, _tls_start : : j main
åèµ·åãããã¼ãã³ã¢ã¯ãä»ã³ã¢ã®èµ·åãè¡ãªãã¾ã(start_coresé¢æ°)ãstart_cores
é¢æ°ã¯ãSBI sbi_hart_start
é¢æ°ãå¼ã³åºããã¨ã§ãä»ã³ã¢ã®èµ·åè¦æ±ãè¡ãªãã¾ããå¼æ°ã«èµ·åã¢ãã¬ã¹_secondary_start
é¢æ°ã¨ã³ã¢çªå·ã渡ãã¾ããèµ·åããã³ã¢ãmain
é¢æ°ãå¼ã³åºããæã«ã¯ãå¼æ°coreid
ã«ã¯main
é¢æ°ãå®è¡ãã¦ããã³ã¢ã®çªå·ãå
¥ã£ã¦ãã¾ãã
void main(CoreIdType coreid) { : if (ThisCore == BootCore) { : start_cores(); } sync_cores(); : : } static void start_cores(void) { int coreid; for (coreid = CORE0; coreid < NUMBER_OF_CORES; coreid++) { if (coreid != BootCore) { struct sbiret ret = sbi_hart_start(coreid, (unsigned long)_secondary_start, coreid); if (ret.error) { _print_message("sbi_hart_start(core%x) failed. error(0x%x)\n", coreid, ret.error); } } } }
ã¿ã¹ã¯ã¨ã³ããªå¼åºã
ã¿ã¹ã¯èµ·åæã«ã¯ãã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãããã¦ã¼ã¶ã¢ã¼ãã«å®è¡ã¢ã¼ããé·ç§»ãããå¿ è¦ãããã¾ãã
SEPC
ã«ã¿ã¹ã¯ã®ã¨ã³ããªã¢ãã¬ã¹ãä¾å¤ããã®å¾©å¸°æã®å®è¡ã¢ã¼ãã¨ãã¦ã¦ã¼ã¶ã¢ã¼ãã»å²è¾¼ã¿è¨±å¯ãSUMãã£ã¼ã«ã*5ãè¨å®ããSSTATUS
ãç¨æããã®ã¡ãsret
å½ä»¤ãå®è¡ãã¾ãã
SSTATUS
ã«ã¯ãMSTATUS
ã®ãã¡ã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãã§ãæä½å¯è½ãªæ
å ±ãè¦ãã¾ããã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãã§ã®ã¿æå³ã®ãããã£ã¼ã«ããããã¾ãã
SSTATUSãã£ã¼ã«ã | å¤ | 説æ |
---|---|---|
SPP (MSTATUSã®MPPã«ç¸å½) | 0 | 復帰å ã®å®è¡ã¢ã¼ããã¦ã¼ã¶ã¢ã¼ã |
1 | 復帰å ã®å®è¡ã¢ã¼ããã¹ã¼ããã¤ã¶ã¢ã¼ã | |
SPIE (MSTATUSã®MPIEã«ç¸å½) | 0 | 復帰å ãå²è¾¼ã¿ç¦æ¢ |
1 | 復帰å ãå²è¾¼ã¿è¨±å¯ | |
SUM | 0 | ã¦ã¼ã¶ã¢ã¼ã空éã«ã¹ã¼ãã¼ãã¤ã¶ã¼ããã¢ã¯ã»ã¹ä¸å¯ |
1 | ã¦ã¼ã¶ã¢ã¼ã空éã«ã¹ã¼ãã¼ãã¤ã¶ã¼ããã¢ã¯ã»ã¹å¯è½ |
.equ STATUS_SPIE, (1U<<5) .equ STATUS_SPP_USER, (0<<8) /* user mode */ .equ STATUS_SPP_SMODE, (1U<<8) /* supervisor mode */ .equ STATUS_SUM, (1U<<18) .globl TaskStart .type TaskStart,@function .balign 4 TaskStart: csrw sepc, a0 li a0, STATUS_SPIE|STATUS_SPP_USER|STATUS_SUM csrw sstatus, a0 mv sp, a1 sret .size TaskStart,.-TaskStart
ãã©ãããã¯ã¿
ãã©ãããã¯ã¿ãã¼ãã«trap_vectors
ã¯ãSTVEC
ã¬ã¸ã¹ã¿ã«ç»é²ãã¾ããã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãã®ä¾å¤ã»å²è¾¼ã¿ãçºçããå ´åããã®ãã¼ãã«ã«ç»é²ãããã³ãã©ãå¼ã³åºããã¾ãã
#define TVEC_VECTORED_MODE 0x1U void main(CoreIdType coreid) { : SetTrapVectors((unsigned long)trap_vectors + TVEC_VECTORED_MODE); :
.global SetTrapVectors .type SetTrapVectors,@function SetTrapVectors: csrw stvec, a0 ret .size SetTrapVectors,.-SetTrapVectors
ã¿ã¤ãå¶å¾¡
èµ·åããåã³ã¢ã¯ãããããã¿ã¤ãã®èµ·åãè¡ãªãã¾ã(StartTimeré¢æ°)ãStartTimer
é¢æ°ã¯ãç¾å¨æå»(_get_time
é¢æ°)ããINTERVALæéå¾ã«ã¿ã¤ãå²ãè¾¼ã¿ãçºçãããããã«SBI sbi_set_timer
é¢æ°ã§è¦æ±ãã¾ããMTIMECMP
ã¬ã¸ã¹ã¿ã®æ´æ°ã¯ãOpenSBIã«è¡ãªã£ã¦ãããã¾ãã
static __thread unsigned long nexttime; static void StartTimer(void) { nexttime = _get_time() + INTERVAL; sbi_set_timer(nexttime); }
ç¾å¨æå»ã®åå¾ãMTIME
ã¬ã¸ã¹ã¿ãç´æ¥åç
§ãããrdtime
å½ä»¤ã使ã£ã¦è¡ãªãã¾ãã
.globl _get_time .type _get_time,@function .balign 4 _get_time: rdtime a0 ret .size _get_time,.-_get_time
ã¿ã¤ããã³ãã©ã次ã®ã¿ã¤ãå²è¾¼ã¿çºçãSBI sbi_set_timer
é¢æ°ã§è¦æ±ãã¾ãã
int Timer(void) { : do { nexttime += INTERVAL; sbi_set_timer(nexttime); } while ((long)(_get_time() - nexttime) >= 0); : : }
SBI sbi_set_timer
ã§è¦æ±ããã¿ã¤ãå²ãè¾¼ã¿ã¯ãã¹ã¼ãã¼ãã¤ã¶ã¼ã¿ã¤ãå²ãè¾¼ã¿(å²è¾¼ã¿çªå·5)ã¨ãã¦RISC-V OSã«éç¥ããã¾ããtrap_vectors
ã®5çªã«å²è¾¼ã¿ã¨ã³ããªint_handler
ãç»é²ãã¾ããOSããã·ã³ã¢ã¼ãã§åããã¦ããæã¯ããã·ã³ã¿ã¤ãå²ãè¾¼ã¿(å²è¾¼ã¿çªå·7çª)ãçºçãã¦ãã¾ããã
int_handler
ã®ä¸ã§å©ç¨ããç¹æ¨©ã¬ã¸ã¹ã¿ã¯ã'M'ããå§ã¾ããã®ãã'S'ããå§ã¾ããã®ã«ç½®ãæãã¾ããint_handler
æå¾ã®ãã©ããããã®å¾©å¸°å½ä»¤ãmret
ããsret
ã«ç½®ãæãã¾ãã
OSå®è¡æã«ã¯ãã¹ã¼ãã¼ãã¤ã¶ã¼ã¿ã¤ãå²ãè¾¼ã¿ã許å¯ãã¦ããå¿
è¦ãããã¾ããSIE
ã¬ã¸ã¹ã¿ã®STIE
ããããç«ã¦ã¦ããã¾ã(EnableInterruptsé¢æ°)ãSIE
ã¯ããã·ã³ã¢ã¼ãã®MEI
ã¬ã¸ã¹ã¿ã«ç¸å½ãããã®ã§ãã
ã³ã¢éå²è¾¼ã¿
ä»ã³ã¢ã«åã¹ã±ã¸ã¥ã¼ã«è¦æ±ãè¡ãªãbroardcast_IPI
é¢æ°ã§ã¯ãSBI sbi_send_ipi
é¢æ°ãå¼ã³åºããèªã³ã¢ä»¥å¤ã®å
¨ã³ã¢ã«ã½ããã¦ã§ã¢å²è¾¼ã¿çºçãè¦æ±ãã¾ããMSIP
ã¬ã¸ã¹ã¿ã®æä½ã¯OpenSBIã«ä»»ãã¾ãã
void broardcast_IPI(void) { unsigned long core_mask = 0U; CoreIdType core = ThisCore + 1; do { core_mask |= (1U << core); core = (core + 1) % NUMBER_OF_CORES; } while (core != ThisCore); sbi_send_ipi(core_mask, 0U); }
SBI sbi_send_ipi
ã§è¦æ±ããã½ããã¦ã§ã¢å²ãè¾¼ã¿ã¯ãã¹ã¼ãã¼ãã¤ã¶ã¼ã½ããã¦ã§ã¢å²ãè¾¼ã¿(å²è¾¼ã¿çªå·1)ã¨ãã¦RISC-V OSã«éç¥ããã¾ããtrap_vectors
ã®1çªã«å²è¾¼ã¿ã¨ã³ããªint_handler
ãç»é²ãã¾ããOSããã·ã³ã¢ã¼ãã§åããã¦ããæã¯ããã·ã³ã½ããã¦ã§ã¢å²ãè¾¼ã¿(å²è¾¼ã¿çªå·3çª)ãçºçãã¦ãã¾ããã
OSå®è¡æã«ã¯ãã¹ã¼ãã¼ãã¤ã¶ã¼ã½ããã¦ã§ã¢å²ãè¾¼ã¿ã許å¯ãã¦ããå¿
è¦ãããã¾ããSIE
ã¬ã¸ã¹ã¿ã®SSIE
ããããç«ã¦ã¾ã(EnableInterruptsé¢æ°)ã
ã¡ã¢ãªä¿è·
ã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãã§ã¯PMP
ã¯å©ç¨ã§ããªããããVMA(ä»®æ³ã¡ã¢ãª)ã®æ©è½ãå©ç¨ãã¦ã¡ã¢ãªä¿è·è¨å®ãè¡ãªããã¨ã«ãã¾ããæ¬é£è¼ã§ã¯ãSv39ã¨å¼ã°ããã¢ã¼ããé¸æããã¢ãã¬ã¹å¤æã¯è¡ãªããã¢ã¯ã»ã¹æ¨©ã®è¨å®ã®ã¿ãè¡ãªãã¾ããOSç¨ç©çã¡ã¢ãªã¯ã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãããã®ã¿ã¢ã¯ã»ã¹å¯è½ãªç©ºéã¨ãã¦ãããããã¢ããªã±ã¼ã·ã§ã³ç¨ç©çã¡ã¢ãªã¯ã¦ã¼ã¶ã¢ã¼ãã¨ã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãã®ã©ã¡ããããã¢ã¯ã»ã¹å¯è½ãªç©ºéã¨ãã¦ããããã¾ããã©ã¡ãã2ã¡ã¬ãã¤ããã¼ã¸ãå©ç¨ãã¦ããããããã¨ã«ãã¾ãã
SetupPageTable
é¢æ°ã«ã¦ãã¼ã¸ãã¼ãã«ãçæããEnableMMU
é¢æ°ã«ã¦SATPã¬ã¸ã¹ã¿ã«ãã¼ã¸ãã¼ãã«ãç»é²ãã¾ãããã®å³ã«ã¯ããã¾ããããuartã³ã³ããã¼ã©ã®ããI/O空éããã¼ã¸ãã¼ãã«ã使ã£ã¦ããããã¾ãã
ãã®ãããã¯ã¯ä»åã®è¨äºã®æ¬é¡ã§ã¯ç¡ãã®ã§è©³ãã説æãã¾ããããèå³ã®ããã¯ä¸è¨ãã¾ããçºããå¾ã§ãRISC-V Specificatio Volume 2, Privileged Specificationãåç §ãã¦ãã ããã
åããã¦ã¿ãã
OpenSBIãã¤ã³ã¹ãã¼ã«ãã¾ãã
$ sudo apt install opensbi
ãã«ããã¾ãã
$ make riscv64-unknown-elf-gcc -march=rv64g -O2 -mcmodel=medany -ffreestanding -g -c main.c riscv64-unknown-elf-gcc -march=rv64g -O2 -mcmodel=medany -ffreestanding -g -c vma.c riscv64-unknown-elf-gcc -march=rv64g -O2 -mcmodel=medany -ffreestanding -g -c primitives.s riscv64-unknown-elf-gcc -march=rv64g -O2 -mcmodel=medany -ffreestanding -g -c start.s riscv64-unknown-elf-gcc -march=rv64g -O2 -mcmodel=medany -ffreestanding -g -c sbi.s riscv64-unknown-elf-gcc -march=rv64g -O2 -mcmodel=medany -ffreestanding -g -c syscall.s riscv64-unknown-elf-gcc -march=rv64g -O2 -mcmodel=medany -ffreestanding -g -msmall-data-limit=0 -c application.c riscv64-unknown-elf-gcc -march=rv64g -O2 -mcmodel=medany -ffreestanding -g -c message.c riscv64-unknown-elf-ld main.o vma.o primitives.o sbi.o start.o syscall.o application.o message.o -T riscv-virt.lds -o sophia
qemuã®-bios
ãªãã·ã§ã³ã«OpenSBI(fw_jump.elf)ãæå®ãã¦ãRISC-V OSãèµ·åãã¾ã*6ã
$ qemu-system-riscv64 -smp 3 -nographic -machine virt -m 128M -kernel sophia -bios /usr/lib/riscv64-linux-gnu/opensbi/generic/fw_jump.elf
OpenSBIèµ·åã¡ãã»ã¼ã¸ã«ç¶ãã¦ãä»è¿ã®é£è¼ã§è¦æ £ãããé£äºãããå²å¦è ãã®åºåãç¶ãã¦ãã¾ãã
OpenSBI v1.4 ____ _____ ____ _____ / __ \ / ____| _ \_ _| | | | |_ __ ___ _ __ | (___ | |_) || | | | | | '_ \ / _ \ '_ \ \___ \| _ < | | | |__| | |_) | __/ | | |____) | |_) || |_ \____/| .__/ \___|_| |_|_____/|____/_____| | | |_| Platform Name : riscv-virtio,qemu Platform Features : medeleg Platform HART Count : 3 Platform IPI Device : aclint-mswi Platform Timer Device : aclint-mtimer @ 10000000Hz Platform Console Device : uart8250 : : : Boot HART MHPM Info : 16 (0x0007fff8) Boot HART MIDELEG : 0x0000000000001666 Boot HART MEDELEG : 0x0000000000f0b509 core0: Core0 started. core2: Core2 started. core2: Task2 Eating core0: Task1 Meditating core0: Task4 Eating core1: Core1 started. core0: Timer core2: Timer core1: Timer core2: Timer core1: Timer core0: Timer core2: Inter-Core Interrupt core1: Inter-Core Interrupt core1: Task1 Meditating core2: Inter-Core Interrupt core0: Task5 Eating core1: Inter-Core Interrupt core1: Task4 Meditating core2: Task3 Eating core1: Inter-Core Interrupt core1: Task2 Meditating core0: Timer
æå¾ã«
æ¬OSã§å©ç¨ããSBIå¼ã³åºããã¾ã¨ãã¦ããã¾ããæ¬OSã§ã¯ãã¬ã¬ã·ã¼æ¡å¼µã¨å¼ã°ããéæ¨å¥¨SBIã®å©ç¨ã¯é¿ãã¾ãããå®éãUbuntuã®KVMã§ã¯ã¬ã¬ã·ã¼æ¡å¼µã¯å¤ããã¦ãã¾ãã
å®ã¯ãqemuã®ä¸ã«ãå¤ãOpenSBIã®ã³ã¼ããåãè¾¼ã¾ãã¦ããã-bios
ãªãã·ã§ã³ãæå®ããã«qemuãèµ·åããå ´åã«ã¯ãã®ã³ã¼ããåãã¾ã*7ããã ãå®è£
ãå¤ããããæ¯è¼çæè¿è¿½å ããããããã°ã³ã³ã½ã¼ã«æ¡å¼µ(DBCN)ãªã©ã®æ©è½ã¯ã¾ã åå¨ãã¾ããã
SBIä»æ§ã¯æ¡å¼µãç¶ãã¦ãããæè¿è¿½å ãããä»æ§ã§èå³æ·±ãã®ã¯ãã¤ãã¼ãã¤ã¶ã¼ã®ãã¹ããæ¯æ´ããããã®æ¡å¼µ(NACL)ã§ãããã*8ã
SBI | EID | FID | 説æ |
---|---|---|---|
struct sbiret sbi_set_timer(uint64_t stime_value) | 0x54494D45 | 0 | stime_valueã§æå®ããæå»ã«ã¿ã¤ãå²è¾¼ã¿ãçºçããã |
struct sbiret sbi_send_ipi(unsigned long hart_mask, unsigned long hart_mask_base) | 0x735049 | 0 | mart_maskã®ãããã«å¯¾å¿ããå ¨ã¦ã®hartã«ã³ã¢éå²ãè¾¼ã¿ãéã |
struct sbiret sbi_hart_start(unsigned long hartid, unsigned long start_addr, unsigned long opaque) | 0x48534D | 0 | hartidã§æå®ããã³ã¢ãèµ·åãããopaqueãå¼æ°ã¨ãã¦start_addré¢æ°ãå¼ã³åºãã |
struct sbiret sbi_hart_get_status(unsigned long hartid) | 0x735049 | 2 | hartidã§æå®ããã³ã¢ã®ç¶æ ãåå¾ãã |
SBIå¼ã³åºãæãEIDã¯a7ã¬ã¸ã¹ã¿ã«ãFIDã¯a6ã¬ã¸ã¹ã¿ã«è¨å®ãã¾ããa0-a5ã¬ã¸ã¹ã¿ã¯ãSBIå®è£ ã¨å¼æ°ãæ»ãå¤ãããã¨ãããããã«ä½¿ããã¾ããæ¬OSã®sbi.sã®å®è£ ã¨ãRISC-V SBIä»æ§ã®èª¬æãåç §ãã¦ãã ããã
次åããã¯ãæ¬é£è¼RISC-V OSãä½ãã ã®çªå¤ç·¨ãRISC-V ãã¤ãã¼ãã¤ã¶ã¼ãä½ãããã«ã¦å®éã«ãã¤ãã¼ãã¤ã¶ã¼ãå®è£ ãã¾ãããã·ã³ã¢ã¼ãã§åä½ããOpenSBIã¨ãã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãã§åä½ããSophia OSã®éã«ãHSã¢ã¼ãã§åä½ãããã¤ãã¼ãã¤ã¶ã¼ãæã¿è¾¼ã¿ã¾ãã
ãã¾ã
RISC-V64ã§ã¯ãä»®æ³ã¡ã¢ãªç©ºéã®å¤§ãããç°ãå¹¾ã¤ãã®ã¢ã¼ããé¸æã§ãã¾ããããã§ã¯ãæ¬é£è¼ã§æ¡ç¨ããSv39ã¢ã¼ãã§ã®ä»®æ³ç©ºéã®æ©è½(VMAæ©è½)ãè¦ã¦è¡ãã¾ããSv39ã¢ã¼ãã§ã®ä»®æ³ç©ºéã®å¤§ããã¯512Gãã¤ãã¨ãªãã¾ã*9ã
VMAæ©è½ã¯ããã¼ã¸ã¨ããåä½ã§ç©çã¡ã¢ãªãä»®æ³ã¡ã¢ãªç©ºéã«ããããã¾ããSv39ã¢ã¼ãã§ã¯ã4Kãã¤ããã¼ã¸ã®ä»ã«2Mãã¤ããã¼ã¸ã»1Gãã¤ããã¼ã¸ãæ±ããã¨ãã§ãã¾ãã
Sv39ã¢ã¼ãã®ä»®æ³ã¢ãã¬ã¹ã¯39ãããé·ã§ãã39ãããé·ã®ä»®æ³ã¢ãã¬ã¹ãã3段ã®ãã¼ã¸ãã¼ãã«ã§ã¢ãã¬ã¹å¤æãã¾ã(ä»®æ³ã¢ãã¬ã¹ã«å¯¾å¿ããç©çã¢ãã¬ã¹ãæ±ãã)ã
ã¢ãã¬ã¹å¤æã¯æ¬¡ã®ããã«è¡ãªããã¾ãã
- ä»®æ³ã¢ãã¬ã¹(ã®ãã¼ã¸çªå·ã38ï½12ãããã®å¤)ã¨ASID(SATPã¬ã¸ã¹ã¿ãæã¤)ã«å¯¾å¿ããã¨ã³ããªãTLBã«è¼ã£ã¦ããªããæ¤ç´¢ãã¾ãããããããæã¯ããããæ±ããç©çãã¼ã¸ã§ãããã®ç©çãã¼ã¸ã®ã¢ãã¬ã¹ã«ãä»®æ³ã¢ãã¬ã¹ã®11ï½0ãããã®å¤ããªãã»ããã¨ãã¦å ãããã®ããå®éã«ã¢ã¯ã»ã¹ãã¹ãç©çã¢ãã¬ã¹ã¨ãªãã¾ãã
- TLBã«ãããããªãã£ãæã¯ãSATPã¬ã¸ã¹ã¿ãæãã«ã¼ããã¼ã¸ãã¼ãã«ããæ¤ç´¢ãå§ãã¾ãã
- ä»®æ³ã¢ãã¬ã¹ã®38ï½30ãããã®å¤ããã«ã¼ããã¼ã¸ãã¼ãã«å ã®ã¨ã³ããª(PTE)ã®ä½ç½®(ãã¼ã¸ãã¼ãã«å ã®ãªãã»ãã)ã表ãã¾ãã
- ãã®ã¨ã³ããª(PTE)ã«ã¯ã2段ç®ã®ãã¼ã¸ãã¼ãã«ã®ç©çãã¼ã¸çªå·ãæ ¼ç´ããã¦ãã¾ãã
- 次ã«ãä»®æ³ã¢ãã¬ã¹ã®29ï½21ãããã®å¤ããªãã»ããã¨ãã¦ã2段ç®ã®ãã¼ã¸ãã¼ãã«å ã®ã¨ã³ããª(PTE)ãè¦ä»ãã¾ãã
- ãã®ã¨ã³ããª(PTE)ã«ã¯ã3段ç®ã®ãã¼ã¸ãã¼ãã«ã®ç©çãã¼ã¸çªå·ãæ ¼ç´ããã¦ãã¾ãã
- 次ã«ãä»®æ³ã¢ãã¬ã¹ã®20ï½12ãããã®å¤ããªãã»ããã¨ãã¦ã3段ç®ã®ãã¼ã¸ãã¼ãã«å ã®ã¨ã³ããª(PTE)ãè¦ä»ãã¾ãã
- ãã®ã¨ã³ããª(PTE)ã«ã¯ãç®çã®ç©çãã¼ã¸ã®çªå·ãæ ¼ç´ããã¦ãã¾ããç©çãã¼ã¸ã®å¤§ããã¯4Kãã¤ãã§ãããã®ç©çãã¼ã¸ã®ã¢ãã¬ã¹ã«ãä»®æ³ã¢ãã¬ã¹ã®11ï½0ãããã®å¤ããªãã»ããã¨ãã¦å ãããã®ããå®éã«ã¢ã¯ã»ã¹ãã¹ãç©çã¢ãã¬ã¹ã¨ãªãã¾ãã
ã¢ã¯ã»ã¹ããæã¯ã¨ã³ããª(PTE)ã«ã¯ã¢ã¯ã»ã¹æ¨©è¨å®(æå¹ç¡å¹ãèªã¿ã»æ¸ãã»å®è¡ã®è¨±å¯è¨å®ãã¦ã¼ã¶ã¢ã¼ãã¢ã¯ã»ã¹æ¨©)ã確èªããã許å¯ãããªãã¢ã¯ã»ã¹ã§ãã£ãå ´åã¯ãã¼ã¸ãã©ã«ãä¾å¤ãçºçãã¾ãã - ä»åã®ã¢ãã¬ã¹å¤æã«ç»å ´ããæ å ±ï¼ä»®æ³ãã¼ã¸çªå·ãASIDãç©çãã¼ã¸çªå·ããã¼ã¸ãµã¤ãºãã¢ã¯ã»ã¹æ¨©ãªã©ï¼ã®çµãTLBã«ç»é²ããã¾ãã
3段ç®ã®ãã¼ã¸ãã¼ãã«ãå©ç¨ããªãè¨å®ãå¯è½ã§ãã2段ç®ã®ãã¼ã¸ãã¼ãã«å ã®ã¨ã³ããª(PTE)ã«ãçµç«¯(leaf)ã§ãããã¨ã示ãè¨å®*10ãããå ´åããã®ã¨ã³ããª(PTE)ã«æ ¼ç´ããã¦ããç©çãã¼ã¸çªå·ã¯ç®çã®ãã¼ã¸ãã®ãã®ãæãã¾ãããã¼ã¸ã®å¤§ããã¯2Mãã¤ãã¨ãªãã¾ãã
RISC-Vã§ã¯ãã©ã®æ®µã®ãã¼ã¸ãã¼ãã«ã®PTEã§ãleafã¨ãªãç©çãã¼ã¸ãæããã¨ãã§ãã¾ããleaf PTEã«ã¯èªã¿ã»æ¸ãã»å®è¡ã®è¨±å¯ãã¦ã¼ã¶ã¢ã¼ãããã®ã¢ã¯ã»ã¹è¨±å¯ãè¨å®ã§ãã¾ãã
ASID(ã¢ãã¬ã¹ç©ºéID)ã¯ãç¾å¨ã©ã®ç©ºéç¨ã®ãã¼ã¸ãã¼ãã«ãå©ç¨ãã¦ãããã示ãIDã§ããåãä»®æ³ã¢ãã¬ã¹ã§ãã£ã¦ããASIDãç°ãªãã°å¥ã®ç©ºéã§ããã¨èªèããã¾ãããã®ASIDã¯SATP
ã¬ã¸ã¹ã¿ã«è¨å®ãã¾ãã
ãã¼ã¸ãã¼ãã«ãå¤æ´ããæããã³ASIDã®å¤ãåå©ç¨ããæã«ã¯ãsfence.vma
å½ä»¤ãå®è¡ããCPUã³ã¢å
ã®TLB(ã¢ãã¬ã¹å¤æãã¼ãã«)ããã©ãã·ã¥ããªããã°ãªãã¾ãããã¢ãã¬ã¹ç©ºé(ASID)ã¨ã¢ãã¬ã¹ç¯å²ãæå®ãããã¨ã«ãããå¿
è¦æå°éã®ãã©ãã·ã¥ã§æ¸ã¾ããããããèæ
®ããã¦ãã¾ãã
ãã ããä»åã®è¨äºã®ä¾ã§ã¯ä»®æ³ç©ºéã®ãããã³ã°æ
å ±ãæ¸ãæãããã¨ã¯ç¡ããããsfence.vma
å½ä»¤ã®åºçªã¯ããã¾ããã
*1:SBIã«åããã¦ããã°ãBerkeley Boot LoaderãOpenSBIãããã«ã¯Linux KVMä¸ã§ãRISC-V OSãåä½ããããã¨ãã§ããã¯ãã§ãã
*2:å¾ã»ã©ãæ¬é£è¼ã®ç¬èªå®è£ ã®ãã®ãç¨æãããã¨ãèãã¦ãã¾ãã
*3:Linuxã®å ´åã¯ãä¸è¬ã«ã¯0x80200000ã«ã¯u-bootããã°ã©ã ãç½®ããu-bootããLinuxã«ã¼ãã«ãèµ·åãã¾ãã
*4:ããããä¸æãæ¹æ³ãæãä»ããªã£ãã®ã§ãããä»ã«è¯ãã¢ã¤ãã¢ãããã°æãã¦ãã ãããLinuxã«ã¼ãã«ã¯ããã¼ãã³ã¢çªå·ãæ¸ãè¾¼ã¾ããããã¤ã¹ããªã¼æ å ±ãåãåããã¨ã§å¯¾å¿ãã¦ããããã§ãã
*5:å¾ã«è¿°ã¹ãä»®æ³ã¡ã¢ãªãæå¹ã«ããã¨ãå¿ è¦ã¨ãªã
*6:å®ã¯ã-biosãªãã·ã§ã³ãçç¥ãã¦ãqemuãOpenSBIãèªåèµ·åããããã«ãªã£ã¦ãã¾ãã
*7:-kernelãªãã·ã§ã³ã§æå®ããããã°ã©ã ããã·ã³ã¢ã¼ãã§èµ·åããã«ã¯ã-bios noneã¨æ示çã«æå®ããå¿ è¦ãããã¾ãã-biosãªãã·ã§ã³ãæå®ããªãã£ãå ´åã¯ãã¹ã¼ãã¼ãã¤ã¶ã¼ã¢ã¼ãã§èµ·åããã¦ãã¾ãã¾ãã
*8:ãã¤ãã¼ãã¤ã¶ã¼ä¸ã§å¥ã®ãã¤ãã¼ãã¤ã¶ã¼ãåããæ´ã«ãã®ä¸ã§ã²ã¹ãOSãåã
*9:å·çæç¹ã§ã®RISC-Vã¢ã¼ããã¯ãã£ã§ã¯ãSv57ã¢ã¼ããé¸æãããã¨ã§128ãã¿ãã¤ã空éã®çæãå¯è½ã§ããSv39ã¢ã¼ãã®ã¾ã¾ã§ç©ºéã2TBã«æ¡å¼µããæ©è½ãããã¾ãã
*10:èªã¿ã»æ¸ãã»å®è¡ã®è¨±å¯è¨å®ãããPTEã¯ãleafã¨ãªã