ãã®ã©ãã§ã¯ãã«ã¹ã¿ã ããã°ã©ã ãå®è¡ããæ©èœãå®è£
ããŸãã ã€ãŸã ããã»ã¹ããã³ãã¹ãŠã®äŸåã€ã³ãã©ã¹ãã©ã¯ãã£ã æåã«ãç¹æš©ã³ãŒãããåãæ¿ããæ¹æ³ãããã»ã¹ã³ã³ããã¹ããåãæ¿ããæ¹æ³ãçè§£ããŸãã æ¬¡ã«ãåçŽãªã©ãŠã³ãããã³ã¹ã±ãžã¥ãŒã©ãã·ã¹ãã ã³ãŒã«ãããã³ä»®æ³ã¡ã¢ãªç®¡çãå®è£
ããŸãã æåŸã«ãã·ã§ã«ãã«ãŒãã«ç©ºéãããŠãŒã¶ãŒç©ºéã«ç§»åããŸãã
ãªãªãžãã«
ãŒãã©ã
æåã®ã©ãïŒ è¥ãååãšå€ãåå
2çªç®ã®ã©ãïŒ è¥ãååãšå€ãåå
æçšæ§
ãã§ãŒãº0ïŒã¯ããã«
åã®éšåãšåæ§ã«ãä¿èšŒãããäœæ¥ã«ã¯ä»¥äžãå¿
èŠã§ãã
- ææ°ã®UnixïŒLinuxãBSDãŸãã¯macOSãæèŒãããã·ã³ã
- 64ãããOSã
- USBããŒãã®ååšã
- 以åã®ãªãªãŒã¹ããã€ã³ã¹ããŒã«ããããœãããŠã§ã¢ã
ã³ãŒãæ€çŽ¢
ã«ã3-spawn
ã§ã¯è³ªå以å€ã®äœç©ããããŸãããã誰ãéªéããŸããïŒ
git clone https://web.stanford.edu/class/cs140e/assignments/3-spawn/skeleton.git 3-spawn
ãã®åŸã圹ã«ç«ããªãããããã£ã¬ã¯ããªæ§é ã¯æ¬¡ã®ããã«ãªããŸãã
cs140e âââ 0-blinky âââ 1-shell âââ 2-fs âââ 3-spawn âââ os
ãããã os
repå
ã§ã¯ã 3-spawn
ãã©ã³ãã«åãæ¿ããå¿
èŠããã3-spawn
ã
cd os git fetch git checkout 3-spawn git merge 2-fs
ã»ãšãã©ã®å Žåãåã³ããŒãžã®ç«¶åãçºçããŸãã ãã®ãããªãã®ïŒ
Auto-merging kernel/src/kmain.rs CONFLICT (content): Merge conflict in kernel/src/kmain.rs Automatic merge failed; fix conflicts and then commit the result.
ããŒãžã®ç«¶åã¯ã kmain.rs
ãã¡ã€ã«ã倿ŽããŠæåã§è§£æ±ºããå¿
èŠããããŸãã ãã®å ŽåãLab 2ãããã¹ãŠã®å€æŽãä¿åããããšã確èªããå¿
èŠããããŸããç«¶åã解決ãããã git add
ãã¡ã€ã«ã远å ããŠããã¹ãŠãã³ãããããŸãã ãã®ãããã¯ã«é¢ãã詳现æ
å ±ãååŸããã«ã¯ã githowto.comã®ãã¥ãŒããªã¢ã«ãåç
§ããŠãã ãã ã
ARMããã¥ã¡ã³ã
ãã®èª²é¡ã§ã¯ã3ã€ã®å
¬åŒã®ARMããã¥ã¡ã³ããåžžã«åç
§ããŸãã ããã3ã€ã¯ïŒ
- ARMv8ãªãã¡ã¬ã³ã¹ããã¥ã¢ã«
ããã¯ãARMv8ã¢ãŒããã¯ãã£ã®å
¬åŒãªãã¡ã¬ã³ã¹ã¬ã€ãã§ãã ã¢ãŒããã¯ãã£å
šäœãç¶²çŸ
ããã¯ã³ã¹ãããã¬ã€ãã ã©ãºããªãŒã®ããã»ã¹ã§ãã®ã¢ãŒããã¯ãã£ãå
·äœçã«å®è£
ããã«ã¯ãããã¥ã¢ã«2ãå¿
èŠã§ãã ãã®å€§ããªARMv8ããã¥ã¢ã«ã®ã»ã¯ã·ã§ã³ã¯ã次ã®åœ¢åŒã®æ³šéã䜿çšããŠåç
§ããŸãïŒ ref ïŒC5.2ïŒã ãã®å Žåãããã¯ãã»ã¯ã·ã§ã³C5.2ã®ARMv8ãªãã¡ã¬ã³ã¹ããã¥ã¢ã«ãåç
§ããå¿
èŠãããããšãæå³ããŸãã - ARM Cortex-A53ããã¥ã¢ã«
ããã¯ãããã³ã§äœ¿çšãããARMv8ïŒv8.0-AïŒã®éåžžã«å
·äœçãªå®è£
ã®ããã®ããã¥ã¢ã«ã§ãã ãã®ããã¥ã¢ã«ã§ã¯ããã©ãŒã ã®æ³šèšïŒ A53 ïŒ4.3.30ïŒãåç
§ããŸãã - ARMv8-Aããã°ã©ãã¬ã€ã
ããã§ãARMv8-Aãããã°ã©ãã³ã°ããããã®ããªãé«åºŠãªããã¥ã¢ã«ãã§ããŸããã ãã©ãŒã ã®ã¡ã¢ã§ãããåç
§ããŸãïŒ ã¬ã€ã ïŒ10.1ïŒ
ãããã®ããã¥ã¢ã«ããã£ã¹ã¯ã«ããŠã³ããŒãããããšã匷ããå§ãããŸãã ãã®ãããæ¯åç°¡åã«éãããšãã§ããŸãã ç¹ã«æåã®ãã®ã¯éåžžã«å€§ããããã§ãã ããããã°ã
ã©ããã£ãŠèªãã®ïŒ å
šäœãèªãå¿
èŠã¯ãããŸããã ãããã£ãŠãåå¿è
ã«ãšã£ãŠã¯ããã®ããã¥ã¢ã«ã§äœãèŠã€ãããããç¥ãããšãéåžžã«éèŠã§ãã ãã®ããã¥ã¢ã«ã¯ã䜿ããããæ§é ã«ãªã£ãŠããŸãã ããã€ãã®éšåã«åãããŠããŸãã AArch64ã«èå³ããããããŸãæ·±ãæœãããšã«ã¯èå³ããããŸããïŒããã»ããµã¡ãŒã«ãŒã§ã¯ãããŸããïŒã ã§ããããç§ãã¡ã¯ãã®èšèã®å€ãã®ç« ã«å
šãèå³ããããŸããã å®éãããŒãAãBãããã³CãšDã®äžéšã®æ
å ±ã§ååã§ãããæåã®2ã€ã®ããŒãã§ã¯ãã¢ãŒããã¯ãã£ãç¹ã«AArch64ã«é¢ããäžè¬çãªæŠå¿µã説æããŸãã ããŒãCã§ã¯äžé£ã®æç€ºã«ã€ããŠèª¬æããŸãã ãã®éšåã¯ãæãåºæ¬çãªåœä»€ãšã¬ãžã¹ã¿ã®ãªãã¡ã¬ã³ã¹ãšããŠäœ¿çšããŸãïŒããšãã°ãSIMDã¯ä»ã¯èå³ããããŸããïŒã ããŒãDã§ã¯ãAArch64ã®è©³çްã®äžéšã«ã€ããŠèª¬æããŸãã ç¹ã«ãå²ã蟌ã¿ãšãã®ãã¹ãŠã«ã€ããŠã
ãã§ãŒãº1ïŒARMãšã¬ãã°ïŒã¢ãŒã ãšã¬ãã°ïŒ
ãã®ãã§ãŒãºã§ã¯ãARMv8ã¢ãŒããã¯ãã£ãæ€èšããç¹æš©ã¬ãã«ãäžããŠãããã»ããµäŸå€ãã¯ãã«ãæ§æããã¿ã€ããŒå²ã蟌ã¿ãšãã¬ãŒã¯ãã€ã³ãå²ã蟌ã¿ãåŠçããŸãã ARMã¢ãŒããã¯ãã£ã®äŸå€ã¬ãã«ã調ã¹ãŠã¿ãŸãããã ç§ãã¡ã¯ããããã®ãŸãã«äŸå€ãšäžæããã£ããããæ¹æ³ã«äž»ã«èå³ããããŸãã
ãµããã§ãŒãºAïŒARMv8ã¬ãã¥ãŒ
ãã®ãµããã§ãŒãºã§ã¯ãARMv8ã®ã¢ãŒããã¯ãã£ãæ€èšããŸãã ããã§ã¯ã³ãŒããèšè¿°ããŸããããã»ã«ããã¹ãã«ã¯è³ªåããããŸãã
ARMïŒAcron RISC MachineïŒã¯ã30幎以äžã®æŽå²ãæã€ãã€ã¯ãããã»ããµã¢ãŒããã¯ãã£ã§ãã çŸåšããã®ã¢ãŒããã¯ãã£ã«ã¯8ã€ã®ããŒãžã§ã³ããããŸãã ææ°ã®ARMv8ã¯2011幎ã«å°å
¥ãããŸããã Broadcomã®BCM2837ãããã«ã¯ãARMv8.0ããŒã¹ã®ã³ã¢ã§ããARM Cortex-A53ã³ã¢ãå«ãŸããŠããŸãã Cortex-A53ïŒãªã©ïŒã¯ãã¢ãŒããã¯ãã£ã®å®è£
ã§ã ã ãããŠãããããã®ãã¹ãŠã®éšåã§åŠç¿ããå®è£
ã§ãã
ARMãã€ã¯ãããã»ããµãã¢ãã€ã«åžå Žãæ¯é
ããŠããŸãã
ARMã¯ãäžçã®ã¹ããŒããã©ã³åžå Žã®çŽ95ïŒ
ãäž»åã¹ããŒããã©ã³ã®100ïŒ
ã§ãã Apple iPhoneãŸãã¯Google Pixelãå«ãã
ãããŸã§ã®ãšãããããã»ããµã¢ãŒããã¯ãã£ãåé¿ããããšããŠããŸãã Rustããã¹ãŠãè¡ã£ãŠãããŸããã ãŠãŒã¶ãŒç©ºéã§ããã»ã¹ãéçšããã«ã¯ãããçšåºŠã®äœæ¥ãäœã¬ãã«ã§è¡ãå¿
èŠããããŸãã ããã»ã¹ã®ããã°ã©ãã³ã°ã«ã¯ããã®ã¢ãŒããã¯ãã£ã®ã¢ã»ã³ãã©ãŒãšããã«é¢é£ãããã¹ãŠã®é¢é£æŠå¿µã«ç²Ÿéããå¿
èŠããããŸãã ã¢ãŒããã¯ãã£ã®ã¬ãã¥ãŒããå§ããæãåºæ¬çãªã¢ã»ã³ããªæé ãæ±ããŸãã
ç»é²
ARMv8ã¢ãŒããã¯ãã£ã«ã¯ã次ã®ã¬ãžã¹ã¿ããããŸãïŒ ref ïŒD1.2.1ïŒïŒ
r0
... r30
ãããæ±çšã¬ãžã¹ã¿ã ã¬ãžã¹ã¿ãžã®ã¢ã¯ã»ã¹ã¯ãä»®åïŒãšã€ãªã¢ã¹ïŒã«ãã£ãŠå®è¡ãããŸãã ã¬ãžã¹ã¿x0
... x30
ã¯ã64ãããããŒãžã§ã³ïŒã€ãŸããå®å
šãªããŒãžã§ã³ïŒã®ãšã€ãªã¢ã¹ã§ãã ãšã€ãªã¢ã¹w0
... w30
ããããŸãã åŸè
ã¯ãã¬ãžã¹ã¿ã®äžäœ32ãããã«ã¢ã¯ã»ã¹ããŸããlr
ã¯64ãããã®åç
§ã¬ãžã¹ã¿ã§ãã x30
ãšã€ãªã¢ã¹ã é·ç§»ã¢ãã¬ã¹ãä¿åããããã«äœ¿çšãããŸãã bl <addr>
åœä»€ã¯ãçŸåšã®åœä»€ã«ãŠã³ã¿ãŒïŒPCïŒãlr
ä¿åãã addr
ã¢ãã¬ã¹ã«ç§»åããŸãã ret
ã¹ããŒãã¡ã³ãã¯ãã®éãè¡ããŸãã 圌女ã¯ã¢ãã¬ã¹ãlr
ããååŸããŠPCã«å²ãåœãŠãŸããsp
ã¯ã¹ã¿ãã¯ãã€ã³ã¿ãŒã§ãã äžäœ32ãããã¯wsp
ã«ãã£ãŠå©çšå¯èœã§ãã ã¹ã¿ãã¯ãã€ã³ã¿ãŒã¯åžžã«16ãã€ãã§æŽåããå¿
èŠããããŸããpc
ãœãããŠã§ã¢ã«ãŠã³ã¿ãŒã ãã®ã¬ãžã¹ã¿ã¯çŽæ¥æžã蟌ãããšã¯ã§ããŸããããèªã¿åãããšã¯ã§ããŸãã å²ã蟌ã¿ãåŒã³åºããããšããè¿ããããšãã«ãé·ç§»åœä»€ã§æŽæ°ãããŸããv0
... v31
ãããSIMDããã³FPã¬ãžã¹ã¿ã ãããã¯ããã¯ãã«SIMDæäœããã³æµ®åå°æ°ç¹æäœã«äœ¿çšãããŸãã ãããã®ã¬ãžã¹ã¿ã¯ãšã€ãªã¢ã¹ã§å©çšã§ããŸãã q0
... q31
ã¬ãžã¹ã¿ã®128ããããã¹ãŠã®ãšã€ãªã¢ã¹ã d0
... d31
ã¯äžäœ64ãããã§ãã ããã«å ããŠãæ¥é èŸs
ã h
ãããã³b
ãããã察å¿ããäžäœ32ãããã16ããããããã³8ãããã®ãšã€ãªã¢ã¹ããããŸããxzr
ã¯ãŒãã±ãŒã¹ã§ãã ããã¯æ¬äŒŒã¬ãžã¹ã¿ã§ãããããŒããŠã§ã¢ã¬ãžã¹ã¿ã§ããå Žåãšããã§ãªãå ŽåããããŸãã åžžã«0
ãå«ãŸã0
ã ãã®ã¬ãžã¹ã¿ã¯èªã¿åãã®ã¿å¯èœã§ãã
ããã«å€ãã®ç¹å¥ãªç®çã®ã¬ãžã¹ã¿ããããŸãã ãããã«ã€ããŠã¯å°ãåŸã§èª¬æããŸãã
ãã¹ããŒã
ä»»æã®æç¹ã§ãããŒã»ã³ãARMv8ã䜿çšãããšãPSTATEãšããååã®æ¬äŒŒã¬ãžã¹ã¿ãŒïŒ ref ïŒD1.7ïŒãä»ããŠããã°ã©ã ã®ç¶æ
ã«ã¢ã¯ã»ã¹ã§ããŸãã ããã¯éåžžã®ã¬ãžã¹ã¿ã§ã¯ãããŸããã çŽæ¥èªã¿æžãããããšã¯ã§ããŸããã 代ããã«ãPSTATEæ¬äŒŒã¬ãžã¹ã¿ã®äžéšãæäœããããã«äœ¿çšã§ããããã€ãã®å°çšã¬ãžã¹ã¿ããããŸãã ARMv8.0ã§ã¯ãããã¯æ¬¡ã®ãšããã§ãã
NZCV
ã¹ããŒã¿ã¹ãã©ã°DAIF
äŸå€ã®ããããã¹ã¯ããããã®äŸå€ããªã³ãŸãã¯ãªãã«ããããã«äœ¿çšãããŸãCurrentEL
äŸå€ã®çŸåšã®ã¬ãã«ïŒåŸè¿°ïŒSPSel
ã¹ã¿ãã¯ãã€ã³ã¿ãŒã»ã¬ã¯ã¿ãŒïŒå®éã«ã¯ããã€ããããŸãïŒ
ãã®ãããªã¬ãžã¹ã¿ã¯ãã·ã¹ãã ãŸãã¯ç¹æ®ã¬ãžã¹ã¿ã®ã¯ã©ã¹ã«å±ããŸãïŒ åç
§ ïŒC5.2ïŒã éåžžã®ã¬ãžã¹ã¿ã¯ã ldr
ã䜿çšããŠRAMããldr
ãã str
ã䜿çšããŠã¡ã¢ãªã«æžã蟌ãããšãã§ãstr
ã ã·ã¹ãã ã¬ãžã¹ã¿ããã®ããã«äœ¿çšããããšã¯ã§ããŸããã 代ããã«ãç¹å¥ãªã³ãã³ãmsr
ããã³msr
ïŒ ref ïŒC6.2.162-C6.2.164ïŒãå¿
èŠã§ãã ããšãã°ã x1
NZCV
ãèªã¿åãã«ã¯ã次ã®ã¬ã³ãŒãã䜿çšããå¿
èŠããããŸãã
mrs x1, NZCV
å®è¡ç¶æ³
åžžã«ãARMv8ããŒã»ã³ããç¹å®ã®å®è¡ç¶æ
ã§å®è¡ãããŸãã åèšã§ããã®ãããªç¶æ
ã¯æ£ç¢ºã«2ã€ãããŸãã AArch32-32ãããARMv7ãšã®äºæã¢ãŒãã ãããŠãAArch64-64ãããARMv8ã¢ãŒãïŒ ã¬ã€ã ïŒ3.1ïŒã AArch64ã§ã®ã¿åäœããŸãã
ã»ãŒãã¢ãŒã
ããæç¹ã§ãç¹å®ã®ã»ãã¥ãªãã£ç¶æ
ã§ããŒã»ã³ããå®è¡ãããŸãïŒã¬ã€ãïŒ3ïŒã ãã®ã¬ããŒãžã¯ãã»ãã¥ãªãã£ã¢ãŒããŸãã¯ã»ãã¥ãªãã£ã¯ãŒã«ãã§ãæ€çŽ¢ã§ããŸãã ã»ãã¥ã¢ãšé ã»ãã¥ã¢ã® 2ã€ã®ç¶æ
ã®ã¿ã ã€ãŸã å®å
šãã€æ£åžžã å®å
šã«éåžžã¢ãŒãã§åäœããŸãã
äŸå€ã¬ãã«
ããã«å ããŠãäŸå€ã¬ãã«ããããŸãïŒ ã¬ã€ã ïŒ3ïŒã åäŸå€ã¬ãã«ã¯ãç¹å®ã®ç¹æš©ã¬ãã«ã«å¯Ÿå¿ããŠããŸãã äŸå€ã¬ãã«ãé«ãã»ã©ããã®ã¬ãã«ã§å®è¡ãããŠããããã°ã©ã ãåãåãç¹æš©ãå€ããªããŸãã åèšã§4ã€ã®ã¬ãã«ããããŸãã
- EL0ïŒãŠãŒã¶ãŒïŒ -éåžžãã«ã¹ã¿ã ããã°ã©ã ã®å®è¡ã«äœ¿çšãããŸãã
- EL1ïŒã«ãŒãã«ïŒ -ç¹æš©ã¢ãŒãã éåžžããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã«ãŒãã«ã¯ããã§èµ·åãããŸãã
- EL2ïŒãã€ããŒãã€ã¶ãŒïŒ -éåžžãä»®æ³ãã·ã³ã®ãã€ããŒãã€ã¶ãŒãå®è¡ããããã«äœ¿çšãããŸãã
- EL3ïŒã¢ãã¿ãŒïŒ -äžè¬ã«äœã¬ãã«ã®ãã¡ãŒã ãŠã§ã¢ã«äœ¿çšãããŸãã
Raspberry Piããã»ããµãEL3ã§èµ·åããŸãã ãã®æç¹ã§ãRaspberry Pi FoundationãæäŸãããã¡ãŒã ãŠã§ã¢ãèµ·åããŸãã ãã¡ãŒã ãŠã§ã¢ã¯ããã»ããµãŒãEL2ã«åãæ¿ããkernel8.img kernel8.img
ãèµ·åãkernel8.img
ã ãããã£ãŠãã«ãŒãã«ã¯EL2ã¬ãã«ããå§ãŸããŸãã å°ãåŸãEL2ããEL1ã«åãæ¿ããŠãã«ãŒãã«ãé©åãªã¬ãã«ã®äŸå€ã§åäœããããã«ããŸãã
ELxã¬ãžã¹ã¿
ELR
ã SPSR
SP
ãªã©ã®å€ãã®ã·ã¹ãã ã¬ãžã¹ã¿ã¯ãäŸå€ã¬ãã«ããšã«è€è£œãããŸãã åæã«ãæ¥å°ŸèŸ_ELn
ãååã«ä»ããããŸãn
ã¯ããã®ã¬ãžã¹ã¿ãå±ããäŸå€ã®ã¬ãã«ã§ãã ããšãã°ã ELR_EL1
ã¯EL1ã¬ãã«ã®äŸå€åç
§ã¬ãžã¹ã¿ã§ããã ELR_EL2
ã¯åãã§ãããEL2ã¬ãã«ã§ãã
äŸå€x
ã¿ãŒã²ããã¬ãã«ããã¬ãžã¹ã¿ãåç
§ããå¿
èŠãããå Žåã¯ããµãã£ãã¯ã¹x
ïŒããšãã°ELR_ELx
ïŒã䜿çšããŸãã ã¿ãŒã²ããäŸå€ã¬ãã«ã¯ãäŸå€ãã¯ãã«ãéå§ããããšãã«CPUãïŒå¿
èŠã«å¿ããŠïŒåãæ¿ããäŸå€ã¬ãã«ã§ãã
äŸå€s
åæã¬ãã«ã§ã¬ãžã¹ã¿ãåç
§ããå¿
èŠãããå Žåãããšãã°SP_ELs
ã§æ¥å°ŸèŸs
ã䜿çšããŸããäŸå€s
åæã¬ãã«ã¯ãäŸå€ãçºçããåã«CPUãå®è¡ãããäŸå€ã®ã¬ãã«ã§ãã
äŸå€ã¬ãã«ãåãæ¿ãã
é€å€ã¬ãã«ãäžããã¡ã«ããºã ã¯1ã€ãé€å€ã¬ãã«ãäžããã¡ã«ããºã ã¯1ã€ã§ãã
äžäœã¬ãã«ããäžäœã¬ãã«ã«åãæ¿ããã«ã¯ïŒç¹æš©ã®åæžïŒãå®è¡äžã®ããã°ã©ã ã¯ã eret
ïŒ ref ïŒD1.11ïŒã䜿çšããŠãã®ã¬ãã«ã®äŸå€ãã埩垰ããå¿
èŠããããŸãã ELx
ã¬ãã«ã®ããã»ããµã§eret
ãå®è¡ããå ŽåïŒ
- PCãç¹æ®ã¬ãžã¹ã¿ãŒ
ELR_ELx
ããã®å€ã«èšå®ããŸãã - PSTATEãç¹æ®ã¬ãžã¹ã¿ãŒ
SPSR_ELx
ããã®å€ã«èšå®ããŸãã
ã¬ãžã¹ã¿SPSR_ELx
ïŒ ref ïŒC5.2.18ïŒã¯ããšããããããªããè¡ããªããã°ãªããªãäŸå€ã®ã¬ãã«ãå«ãã§ããŸãã ããã«ãäŸå€ã¬ãã«ã倿Žãããšã次ã®è¿œå ã®çµæã«æ³šæãã䟡å€ããããŸãã
ELs
ã«æ»ããšãã SPSR_ELx[0] == 1
å Žåã¯SPSR_ELx[0] == 1
èšå®ããã SPSR_ELx[0] == 1
å Žåã¯SPSR_ELx[0] == 1
èšå®ããSPSR_ELx[0] == 0
ã
äžäœã¬ãã«ããäžäœã¬ãã«ãžã®ç§»è¡ã¯ãé€å€ã®çµæãšããŠã®ã¿çºçããŸãïŒ ã¬ã€ã ïŒ10ïŒã ç¹ã«èšå®ããªãéããããŒã»ã³ãã¯æ¬¡ã®ã¬ãã«ã®äŸå€ããã£ããããŸãã ããšãã°ãEL0ã§ã®åäœäžã«å²ã蟌ã¿ãåä¿¡ããå ŽåãããŒã»ã³ãã¯äŸå€ãåŠçããããã«EL1ã«åãæ¿ãããŸãã ELx
ããŒã»ã³ãã«åãæ¿ãããšã次ã®ããšãè¡ãããŸãã
- ãã¹ãŠã®äŸå€ãšå²ã蟌ã¿ããªãïŒãã¹ã¯ïŒã«ããŸãïŒ
PSTATE.DAIF = 0b1111
ã PSTATE
ããã³ãã¹ãŠãSPSR_ELx
ä¿åããŸãã- æ»ãã¢ãã¬ã¹ã
ELR_ELx
ä¿åããŸãïŒ ref ïŒD1.10.1ïŒã SPSel
ã1
å Žåã sp
ãSP_ELx
èšå®ããŸããESR_ELx
äŸå€ã·ã³ãããŒã ãèšå®ããŸãïŒããã«ã€ããŠã¯åŸã§èª¬æããŸãïŒïŒ ref ïŒD1.10.4ïŒãpc
ãäŸå€ãã¯ãã«ã«å¯Ÿå¿ããã¢ãã¬ã¹ã«èšå®ããŸãïŒåŸã§èª¬æããŸãïŒã
äŸå€ã·ã³ãããŒã ã¬ãžã¹ã¿ã¯ã åæäŸå€ã«å¯ŸããŠã®ã¿æå¹ã§ããããšã«æ³šæããŠãã ããã ãã¹ãŠã®æ±çšã¬ãžã¹ã¿ãšSIMD / FPã¬ãžã¹ã¿ã«ã¯ãäŸå€ãçºçãããšãã«æã£ãŠããå€ãå«ãŸããŸãã
äŸå€ãã¯ãã«
äŸå€ãçºçãããšãCPUã¯äŸå€ãã¯ãã«ãããå Žæã«å¶åŸ¡ãç§»ããŸãïŒ ref ïŒD1.10.2ïŒã äŸå€ã«ã¯4ã€ã®ã¿ã€ãããããããããã«4ã€ã®äŸå€ã®ãœãŒã¹ãå«ãŸããŠããŸãã ã€ãŸã åèš16ã®äŸå€ãã¯ãã«ã 以äžã«4ã€ã®ã¿ã€ãã®äŸå€ã瀺ããŸãã
- åæ
svc
ãbrk
ãªã©ã®åœä»€ã«ãã£ãŠåŒãèµ·ããããäŸå€ã ãŸããäžè¬çã«ãããã°ã©ããŒãæçœªãšãªããã¹ãŠã®ã€ãã³ãã«å¯ŸããŠã - IRQ-å€éšãœãŒã¹ããã®éåæå²ã蟌ã¿ã
- FIQ-å€éšãœãŒã¹ããã®éåæå²ã蟌ã¿ã è¿
éãªåŠçã®ããã®ããŒãžã§ã³ã
- SError-ã¿ã€ããã·ã¹ãã ãšã©ãŒãã®å²ã蟌ã¿ã
以äžã«ãå²ã蟌ã¿ã®4ã€ã®ãœãŒã¹ã瀺ããŸãã
SP = SP_EL0
çŸåšã®äŸå€ã¬ãã«SP = SP_ELx
çŸåšã®äŸå€ã¬ãã«- AArch64ãå®è¡ãããäœãäŸå€ã¬ãã«
- AArch32ãå®è¡ãããäœãäŸå€ã¬ãã«
ããã¥ã¢ã«ã®èª¬æããïŒ ã¬ã€ã ïŒ10.4ïŒïŒ
äŸå€ãçºçãããšãããã»ããµã¯äŸå€ã«äžèŽãããã³ãã©ã³ãŒããå®è¡ããå¿
èŠããããŸãã [äŸå€]ãã³ãã©ãŒãæ ŒçŽãããã¡ã¢ãªå
ã®å Žæã¯ãäŸå€ãã¯ãã«ãšåŒã°ããŸãã ARMã¢ãŒããã¯ãã£ã§ã¯ãäŸå€ãã¯ãã«ã¯äŸå€ãã¯ãã«ããŒãã«ãšåŒã°ããããŒãã«ã«æ ŒçŽãããŸãã åäŸå€ã¬ãã«ã«ã¯ãEL3ãEL2ãããã³EL1ããšã«ç¬èªã®ãã¯ã¿ãŒããŒãã«ããããŸãã ããŒãã«ã«ã¯ã[x86ã®ããã«]ã¢ãã¬ã¹ã®ã»ããã§ã¯ãªããå®è¡ã®ããã®åœä»€ãå«ãŸããŠããŸãã ãã¯ã¿ãŒããŒãã«ã®åãšã³ããªã®ãµã€ãºã¯16åœä»€ã§ãã åã
ã®äŸå€ã®ãã¯ãã«ã¯ãããŒãã«ã®å
é ããã®åºå®ãªãã»ããã§é
眮ãããŸãã åããŒãã«ã®ä»®æ³ã¢ãã¬ã¹ã¯ã[ç¹å¥]ãã¯ãã«ã¢ãã¬ã¹ã¬ãžã¹ã¿VBAR_EL3
ã VBAR_EL2
ãããã³VBAR_EL1
ãŸãã
ãããã®ãã¯ãã«ã¯ã次ã®ããã«ã¡ã¢ãªå
ã«ç©ççã«é
眮ãããŸãã
SP = SP_EL0
çŸåšã®äŸå€ã¬ãã«
VBAR_ELx ããã®ãªãã»ãã | äŸå€ |
---|
0x000 | åæäŸå€ |
0x080 | IRQ |
0x100 | FIQ |
0x180 | ã»ãããŒã« |
SP = SP_ELx
çŸåšã®äŸå€ã¬ãã«
VBAR_ELx ããã®ãªãã»ãã | äŸå€ |
---|
0x200 | åæäŸå€ |
0x280 | IRQ |
0x300 | FIQ |
0x380 | ã»ãããŒã« |
AArch64ãå®è¡ãããäœãäŸå€ã¬ãã«
VBAR_ELx ããã®ãªãã»ãã | äŸå€ |
---|
0x400 | åæäŸå€ |
0x480 | IRQ |
0x500 | FIQ |
0x580 | ã»ãããŒã« |
AArch32ãå®è¡ãããäœãäŸå€ã¬ãã«
VBAR_ELx ããã®ãªãã»ãã | äŸå€ |
---|
0x600 | åæäŸå€ |
0x680 | IRQ |
0x700 | FIQ |
0x780 | ã»ãããŒã« |
ãŸãšã
ä»ã®ãšãããARMv8ã¢ãŒããã¯ãã£ã«ã€ããŠç¥ãå¿
èŠãããã®ã¯ããã ãã§ãã ç¶è¡ããåã«ããããã®è³ªåã«çããŠã¿ãŠãã ããã èªå·±ãã¹ãçšã
x30
ãšã€ãªã¢ã¹ãšã¯äœã§ããïŒ [arm-x30]
0xFFFF
ãx30
ã¬ãžã¹ã¿ã«æžã蟌ããšããã®å€ãæœåºããããã«ãã®ã¬ãžã¹ã¿ã®ä»ã®2ã€ã®ååã䜿çšã§ããŸããïŒ
PCå€ãç¹å®ã®ã¢ãã¬ã¹ã«å€æŽããã«ã¯ã©ãããã°ããã§ããïŒ [arm-pc]
ret
ã¹ããŒãã¡ã³ãã䜿çšããŠã¢ãã¬ã¹A
PCãèšå®ããã«ã¯ã©ãããã°ããã§ããïŒ eret
åœä»€ã䜿çšããŠPCãã¢ãã¬ã¹A
ã«èšå®ããæ¹æ³ã¯ïŒ ãããéæããããã«å€æŽããã¬ãžã¹ã¿ãæå®ããŸãã
äŸå€ã®çŸåšã®ã¬ãã«ã確èªããã«ã¯ã©ãããã°ããã§ããïŒ [arm-el]
çŸåšã®é€å€ã¬ãã«ã倿ããã«ã¯ãã©ã®ãããªå
·äœçãªæç€ºã«åŸããŸããïŒ
ã¹ã¿ãã¯ãã€ã³ã¿ãŒãã©ã®ããã«å€æŽããŠäŸå€ãã¹ããŒããŸããïŒ [arm-sp-el]
å®è¡äžã®ããã°ã©ã ã®ã¹ã¿ãã¯ãã€ã³ã¿ãŒã¯ãäŸå€ãçºçããæç¹ã§A
ã§ãã äŸå€ãåŠçããåŸãããã°ã©ã ãå®è¡ãããŠããå Žæã«æ»ãããããã¹ã¿ãã¯ãã€ã³ã¿ãŒãB
ã«å€æŽããã ã©ããã£ãŠããã®ïŒ
äœãELããã®ã·ã¹ãã ã³ãŒã«ã«äœ¿çšããããã¯ãã«ã¯ã©ãã§ããïŒ [arm-svc]
ãŠãŒã¶ãŒããã»ã¹ã¯EL0ã§å®è¡ãããŸãã ãã®ããã»ã¹ã¯svc
åŒã³åºããŸãã çµå¶é£ã¯ã©ã®äœæã«ç§»è»¢ãããŸããïŒ
äžäœELããã®å²ã蟌ã¿ã«äœ¿çšããããã¯ãã«ã¯ã©ãã§ããïŒ [arm-int]
ãŠãŒã¶ãŒããã»ã¹ã¯EL0ã§å®è¡ãããŸãã ãã®æç¹ã§ãã¿ã€ããŒå²ã蟌ã¿ãçºçããŸãã çµå¶é£ã¯ã©ã®äœæã«ç§»è»¢ãããŸããïŒ
IRQäŸå€åŠçãæå¹ã«ããã«ã¯ã©ãããã°ããã§ããïŒ [ã¢ãŒã ãã¹ã¯]
IRQå²ã蟌ã¿ã®ããã¯ãè§£é€ããã«ã¯ãã©ã®ã¬ãžã¹ã¿ã«ã©ã®å€ãæžã蟌ãå¿
èŠããããŸããïŒ
eret
ã䜿çšããŠAArch32ã¢ãŒããæå¹ã«ããã«ã¯ã©ãããŸããïŒ [arm-aarch32]
äŸå€ãœãŒã¹ã¯AArch64ã§ãã ãã®äŸå€ã®ãã³ãã©ãŒãAArch64ã«ãããŸãã ã©ã®ã¬ãžã¹ã¿ã®ã©ã®å€ã倿Žãããšã eret
ãä»ããŠäŸå€ããæ»ããšãeret
ããŒã»ã³ããå®è¡ã¢ãŒãAArch32ã«åãæ¿ãããŸããïŒ
ãã³ã ïŒãŠã©ããïŒ ã¬ã€ã ïŒ10.1ïŒ
ãµããã§ãŒãºBïŒã¢ã»ã³ãã©ãŒåœä»€

ãã®ãµããã§ãŒãºã§ã¯ãARMv8ã³ãã³ãã»ããããæãåºæ¬çãªã³ãã³ããåŠç¿ããŸãã ä»ã¯ã³ãŒããæžããŸããããã»ã«ããã¹ãã«ã¯ããã€ãã®è³ªåããããŸãã
ã¡ã¢ãªã¢ã¯ã»ã¹
ARMv8ã¯ãRISCïŒåœä»€ã»ãããåæžãããã³ã³ãã¥ãŒã¿ãŒïŒãããŒã/ä¿åããããã®åœä»€ã»ããã§ãã ãã®äžé£ã®åœä»€ã®ç¹åŸŽã¯ãæç¢ºã«å®çŸ©ãããåœä»€ã«ãã£ãŠã®ã¿ã¡ã¢ãªã¢ã¯ã»ã¹ãå®çŸã§ãããšããå°ããªäºå®ã§ãã ç¹ã«ãã¡ã¢ãªã¯ãèªã¿èŸŒã¿åœä»€ã§ã¬ãžã¹ã¿ã«èªã¿èŸŒãããšã«ãã£ãŠã®ã¿èªã¿èŸŒãããšãã§ããä¿ååœä»€ã«ãã£ãŠã®ã¿æžã蟌ãããšãã§ããŸãã
ããŸããŸãªããªãšãŒã·ã§ã³ã®ããŒã/ã¢ã³ããŒãïŒããŒã/ã¹ãã¢ïŒã®ããã®å€ãã®æç€ºããããŸãïŒã»ãšãã©ã®å Žåãåãã¿ã€ãã§ãïŒã æãåçŽãªãã©ãŒã ããå§ããŸãããã
ldr <ra>, [<rb>]
ïŒã¢ãã¬ã¹<rb>
ãã<ra>
å€ãããŒãããŸããstr <ra>, [<rb>]
ïŒ <ra>
å€ã<rb>
ã¢ãã¬ã¹ã«ä¿åããŸãã
ã¬ãžã¹ã¿<rb>
ã¯ããŒã¹ã¬ãžã¹ã¿ãšåŒã°ããŸãã ããšãã°ã r3 = 0x1234
å ŽåïŒ
ldr r0, [r3] // r0 = *r3 ( , r0 = *(0x1234)) str r0, [r3] // *r3 = r0 ( , *(0x1234) = r0)
ããã«ãã®ã£ãã[-256, 255]
ãããªãã»ããã远å ã§ããŸãã
ldr r0, [r3,
ããŒããŸãã¯ä¿åãé©çšããåŸ ãåºæ¬ã±ãŒã¹ã®å€ã倿Žãããã¹ãã€ã³ããã¯ã¹ãæå®ããããšãã§ããŸãã
ldr r0, [r3],
ãŸãã¯ãããŒããŸãã¯ä¿åãé©çšããåã«ããŒã¹ã¬ãžã¹ã¿ã®å€ã倿Žããäºåã€ã³ããã¯ã¹ïŒ
ldr r0, [r3, #30]! // r3 += 30; r0 = *r3 str r0, [r3, #-12]! // r3 -= 12; *r3 = r0
ãªãã»ããããã¹ãã€ã³ããã¯ã¹ãããªã€ã³ããã¯ã¹ã¯ã ã¢ãã¬ãã·ã³ã°ã¢ãŒããšããŠç¥ãããŠããŸã ã
ããã«ã2ã€ã®ã¬ãžã¹ã¿ãäžåºŠã«ããŒã/ã¢ã³ããŒãã§ããããŒã ããããŸãã åœä»€ldp
ããã³stp
ïŒ ldp
ãã¹ãã¢ãã¢ïŒã ãããã®åœä»€ã¯ã ldr
ããã³str
ãšåãã¢ãã¬ã¹æå®ã¢ãŒãã§äœ¿çšã§ãstr
ã
// `x0` `x1` . : // // |------| <x ( SP) // | x1 | // |------| // | x0 | // |------| <- SP // stp x0, x1, [SP, #-16]! // `x0` `x1` . : // // |------| <- SP // | x1 | // |------| // | x0 | // |------| <x (original SP) // ldp x0, x1, [SP], #16 // , sub SP, SP, #16 stp x0, x1, [SP] ldp x0, x1, [SP] add SP, SP, #16 // , x0, x1, x2, x3. sub SP, SP, #32 stp x0, x1, [SP] stp x2, x3, [SP, #16] ldp x0, x1, [SP] ldp x2, x3, [SP, #16] add SP, SP, #32
å€ã®çŽæ¥èªã¿èŸŒã¿
å³å€ã¯ãå€ãèšç®ãªãã§æ¢ç¥ã®æŽæ°ã®å¥ã®ååã§ãã ïŒããšãã°ïŒ16ãããã®ã€ããã£ãšã€ããã¬ãžã¹ã¿ã«ããŒããããªãã·ã§ã³ã§ç¹å®ã®ãããæ°ãå·Šã«ã·ããããã«ã¯ã mov
ïŒç§»åïŒã³ãã³ããå¿
èŠã§ãã ã·ããã§åã16ããããããŒãããããã«ãæ®ãã®ãããã眮ãæããããšãªãã movk
ïŒmove / keepïŒãå¿
èŠmovk
ã ããããã¹ãŠäœ¿çšããäŸã次ã«ç€ºããŸãã
mov x0, #0xABCD, LSL #32
ããŒããããå€èªäœã«ã¯æ¥é èŸ#
ãä»ããŠããããšã«æ³šæããŠãã ããã åæã«LSL
ã¯å·Šãžã®ã·ãããæå³ããŸãã
ãªãã·ã§ã³ã®ãªãã»ãããæã€16ãããã®ã¿ãã¬ãžã¹ã¿ã«ããŒãã§ããŸãã ãšããã§ãå€ãã®å Žåãã¢ã»ã³ãã©ã¯å¿
èŠãªã·ããèªäœã決å®ã§ããŸãã mov x12, #(1 << 21)
mov x12, 0x20, LSL #16
.
<label>:
:
add_30: add x1, x1, #10 add x1, x1, #20
, , adr
ldr
:
adr x0, add_30
ldr
. adr
.
, , mov
:
mov x13,
ELR_EL1
/ mrs
msr
.
, - msr
:
msr ELR_EL1, x1
- mrs
:
mrs x0, CurrentEL
add
sub
:
add <dest> <a> <b> // dest = a + b sub <dest> <a> <b> // dest = a - b
äŸïŒ
mov x2, #24 mov x3, #36 add x1, x2, x3
<b>
:
sub sp, sp, #120 // sp -= 120 add x3, x1, #120 // x3 = x1 + 120 add x3, x3, #88 // x3 += 88
and
orr
AND
OR
. add
sub
:
mov x1, 0b11001 mov x2, 0b10101 and x3, x1, x2 // x3 = x1 & x2 = 0b10001 orr x3, x1, x2 // x3 = x1 | x2 = 0b11101 orr x1, x1, x2 // x1 |= x2 and x2, x2, x1 // x2 &= x1 and x1, x1, #0b110 // x1 &= 0b110 orr x1, x1, #0b101 // x1 |= 0b101
(Branching) â . PC . , b
:
b label // jump to label
( lr
), bl
. ret
lr
:
my_function: add x0, x0, x1 ret mov x0, #4 mov x1, #30 bl my_function
br
blr
b
bl
, , :
ldr x0, =label blr x0 // bl label br x0 // b label
cmp
. , bne
(branch not equal), beq
(branch if equal), blt
(branch if less than) .. ( ref : C1.2.4)
// 1 x0 , x1, // `function_when_eq`, not_equal: add x0, x0,
:
cmp x1,
: , .
ARMv8 . , . ( ref : C1.2.4). . ISA- Griffin Dietz. , :
memcpy
ARMv8? [arm-memcpy]
, x0
, , x1
, x2
( 8 ). memcpy
? , ret
: 6-7 .
0xABCDE
ELR_EL1
? [arm-movk]
, EL1
, 0xABCDE
ELR_EL1
ARMv8?
: .
cbz
? [arm-cbz]
cbz
( ref : C6.2.36). ? ?
init.S
? [asm-init]
os/kernel/ext/init.S
â , . _start
0x80000
. , EL1 .
os/kernel/ext/init.S
context_save
. , , - , , . (âread cpu affinityâ, âcore affinity != 0â) - :
MPIDR_EL1
( ref : D7.2.74) ( Aff0
), , . â setup
. wfe
.
: / , .
C: EL1
EL2 EL1. os/kernel/ext/init.S
os/kernel/src/kmain.rs
. , .
aarch64
( os/kernel/src/aarch64.rs
), . sp()
. current_el()
, . , EL2 . , kmain()
. , current_el()
unsafe
. , , EL1.
, EL1. os/kernel/ext/init.S
:
// FIXME: Return to EL1 at `set_stack`.
:
mov x2,
, . , , SPSR_EL2
eret
.
, FIXME
. , EL1 CPU set_stack
, . . , â eret
. , current_el()
1
.
: PC ?
D:
. , . , , brk #n
. kernel/ext/init.S
kernel/src/traps
.
埩ç¿
, 16 , 16 . init.S
_vectors
. , 16 , handle_exception
Rust kernel/src/traps/mod.rs
. handle_exception
. , , .
handle_exception
, Rust, , . , , info
, esr
tf
, .
, ( 2 C Rust). , , , . â , :
- . AArch64 8
r0
⊠r7
. - . AArch64 8
r0
⊠r7
. - (, ..) .
caller-saved callee-saved .
caller-saved â . , caller , .
ãããŠãã®éã callee-saved â . ã€ãŸã , .
.
AArch64 r19
... r29
SP
â callee-saved . â caller-saved . , lr
( x30
) . SIMD/FP . , caller-saved . - . AArch64
lr
, . ret
lr
.
AArch64 ( guide : 9) procedure call standard .
Rust- handle_exception
, , .
Rust , ?
, . Rust . , Rust , extern
. handle_exception
extern
, Rust .
, , HANDLER(source, kind)
, . HANDLER(a, b)
"", , #define
. ã€ãŸã :
_vectors: HANDLER(32, 39)
:
_vectors: .align 7 stp lr, x0, [SP, #-16]! mov x0, #32 movk x0, #39, LSL #16 bl context_save ldp lr, x0, [SP], #16 eret
lr
x0
x0
32- 16 source
16 kind
. context_save
, _vectors
. , , lr
x0
.
context_save
. ret
context_restore
. context_save
, Rust.
Syndrome
(, ), ( ESR_ELx
) ( ref : D1.10.4). kernel/src/traps/syndrome.rs
. Syndrome
-. , ESR_ELx
Rust esr
. Sydnrome::from(esr)
, , .
Info
handle_exception
Info
. 16 : source
kind
. , 32- , HANDLE
x0
. , HANDLE
- , Info
.
å®è£
. , â brk
, .. . , , .
brk
kmain
. :
unsafe { asm!("brk 2" :::: "volatile"); }
:
_vectors
HANDLE
. , Info
.handle_exception
context_save
.
, / caller-saved . 5 9 . 0
tf
. .
泚æããŠãã ããã AArch64 , SP
16 , /. , .VBAR
, :
// FIXME: load `_vectors` addr into appropriate register (guide: 10.4)
handle_exception
, .
handle_exception
info
esr
, , . . , , , aarch64::nop()
. , . .Syndrome::from()
Fault::from()
.
. ( ref : D1.10.4, ref : Table D1-8) , . âISS encoding descriptionâ , , . , brk 12
Syndrome::Brk(12)
, svc 77
Syndrome::Svc(77)
. , 32- , , .brk
.
Syndrome::from()
handle_exception
, brk
. , . . , Syndrome::from()
. ESR_ELx
.
exit
. exit
, . brk
. shell()
kmain
loop { }
, .
, brk 2
kmain
Brk(2)
, source, CurrentSpElx
kind Synchronous
. . exit
, .
, , . , , svc 3
. , .
ãã¹ãŠãæåŸ
ã©ããã«æ©èœããããæ¬¡ã®ã¹ãããã«é²ãæºåãã§ããŠããŸãã

UPDïŒæ¬¡ã®éšå