π ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π΅Π»Π΅Π³Π°Π»ΡΠ½ΡΡ ΠΈ Π½Π΅ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ Π² RISC-V
Π Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅ RISC-V ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π° ΡΡΡΠΊΠ°Ρ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, Π²ΠΊΠ»ΡΡΠ°Ρ ΡΠ»ΡΡΠ°ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π΅Π»Π΅Π³Π°Π»ΡΠ½ΡΡ ΠΈΠ»ΠΈ Π½Π΅ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ. ΠΡΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΊΠ°ΠΊ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΄ΡΠ°, ΡΠ°ΠΊ ΠΈ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌ.
π§ ΠΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΠΎΠ³Π΄Π° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎΠΏΡΡΠΊΠ° Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ:
- Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ (Π½Π΅ Π²Ρ ΠΎΠ΄ΠΈΡ Π² ISA),
- ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΈΠ· ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ, Π½Π΅ Π²ΠΊΠ»ΡΡΡΠ½Π½ΠΎΠ³ΠΎ Π² Π΄Π°Π½Π½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
F
,D
,C
), - Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ,
ΡΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ trap (ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅) ΡΠΈΠΏΠ° Illegal Instruction.
ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΡ:
Π Π΅Π³ΠΈΡΡΡ | ΠΠ°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ |
---|---|
mcause | ΠΏΡΠΈΡΠΈΠ½Π° trapβΠ° (mcause = 2 Π΄Π»Ρ Illegal Instruction) |
mepc | Π°Π΄ΡΠ΅Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ, Π²ΡΠ·Π²Π°Π²ΡΠ΅ΠΉ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ |
mtval | ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΊΠΎΠ΄ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ (ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π½ΠΎΠ»Ρ) |
mtvec | Π°Π΄ΡΠ΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ |
ΠΡΠΈΠΌΠ΅Ρ: ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ Machine
// ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π² mtvec
void handle_trap() {
uintptr_t cause = read_csr(mcause);
if (cause == 2) {
uintptr_t inst = read_csr(mtval);
uintptr_t epc = read_csr(mepc);
printf("Illegal instruction 0x%lx at PC=0x%lx\n", inst, epc);
// Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ: ΠΏΡΠΎΠΏΡΡΡΠΈΡΡ, ΡΠΌΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ»ΠΈ Π·Π°Π²Π΅ΡΡΠΈΡΡ
}
}
βοΈ ΠΠ΄Π΅ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ
-
Π ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ Π½Π° RISC-V, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Linux Kernel, Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΈΠ³Π½Π°Π»Π°
SIGILL
-
Π Π³ΠΈΠΏΠ΅ΡΠ²ΠΈΠ·ΠΎΡΠ°Ρ ΠΈ ΡΠΌΡΠ»ΡΡΠΎΡΠ°Ρ β Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ fallback ΠΈΠ»ΠΈ ΡΠΌΡΠ»ΡΡΠΈΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ
-
Π ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΡ ΡΠ΄ΡΠ°Ρ β ΠΏΡΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ soft-float, soft-MMU ΠΈ Ρ.ΠΏ.
β ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°
-
ΠΠΎΠ»Π½Π°Ρ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ trap-ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ°, ΡΡΠ°Π½Π΄Π°ΡΡΠΈΠ·ΠΎΠ²Π°Π½Π½Π°Ρ ΡΠ΅ΡΠ΅Π· Privileged ISA
-
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΌΡΠ»ΡΡΠΈΠΈ Π½Π΅Π΄ΠΎΡΡΠ°ΡΡΠΈΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ΡΠ΅Π· trap + software fallback)
-
ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΠ»Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ Π΄Π΅Π»Π°ΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ Π²ΡΡ ΠΎΠ΄ ΠΈΠ· Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ
β ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ
-
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° trapβΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π΄ΠΎΡΠΎΠ³ΠΎΠΉ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ (context switch)
-
Π’ΡΠ΅Π±ΡΠ΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ firmware ΠΈΠ»ΠΈ ΠΠ‘