computer-builtins-mem -> compiler-builtins-mem
Learning a lot from this blog. Thank you ð±
45 KiB
+++ title = "Rustã§ã€ããæå°ã®ã«ãŒãã«" weight = 2 path = "ja/minimal-rust-kernel" date = 2018-02-10
[extra] chapter = "Bare Bones"
Please update this when updating the translation
translation_based_on_commit = "7212ffaa8383122b1eb07fe1854814f99d2e1af4"
GitHub usernames of the people that translated this post
translators = ["woodyZootopia", "JohnTitor"] +++
ãã®èšäºã§ã¯ãRustã§æå°éã®64bitã«ãŒãã«ãäœããŸããåã®èšäºã§äœã£ãããªãŒã¹ã¿ã³ãã£ã³ã°ãªRustãã€ããªãäžæ·ãã«ããŠãäœããç»é¢ã«åºåãããããŒã¿ãã«ãã£ã¹ã¯ã€ã¡ãŒãžãäœããŸãã
ãã®ããã°ã®å
容㯠GitHub äžã§å
¬éã»éçºãããŠããŸããäœãåé¡ã質åãªã©ãããã° issue ãããŠãŠãã ãã (蚳泚: ãªã³ã¯ã¯åæ(è±èª)ã®ãã®ã«ãªããŸã)ããŸããã¡ãã«ã³ã¡ã³ããæ®ãããšãã§ããŸãããã®èšäºã®å®å
šãªãœãŒã¹ã³ãŒãã¯post-02 ãã©ã³ãã«ãããŸãã
èµ·åã®ããã»ã¹
ã³ã³ãã¥ãŒã¿ãèµ·åãããšããã¶ãŒããŒãã® ROM ã«ä¿åããããã¡ãŒã ãŠã§ã¢ã®ã³ãŒããå®è¡ãå§ããŸãããã®ã³ãŒãã¯ãèµ·åæã®èªå·±ãã¹ããå®è¡ãã䜿çšå¯èœãªRAMãæ€åºããCPUãšããŒããŠã§ã¢ãäºååæåããŸãããã®åŸãããŒã¿ãã«ãã£ã¹ã¯ãæ¢ãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã«ãŒãã«ãèµ·åããŸãã
x86ã«ã¯2ã€ã®ãã¡ãŒã ãŠã§ã¢ã®æšæºèŠæ ŒããããŸãïŒ"Basic Input/Output System" (BIOS) ãšãããæ°ãã "Unified Extensible Firmware Interface" (UEFI) ã§ããBIOSèŠæ Œã¯å€ãæä»£é ãã§ãããã·ã³ãã«ã§ãããã¹ãŠã®x86ã®ãã·ã³ã§1980幎代ãããããµããŒããããŠããŸãã察ããŠãUEFIã¯ããçŸä»£çã§ãã£ãšå€ãã®æ©èœãæã£ãŠããŸãããã»ããã¢ãããè€éã§ãïŒå°ãªããšãç§ã¯ããæããŸãïŒã
ä»ã®æããã®ããã°ã§ã¯BIOSãããµããŒãããŠããŸããããUEFIã®ãµããŒããèšç»äžã§ãããæäŒãããã ããå Žåã¯ãGitHubã®issueãã芧ãã ããã
BIOSã®èµ·å
ã»ãŒãã¹ãŠã®x86ã·ã¹ãã ãBIOSã«ããèµ·åããµããŒãããŠããŸããããã¯è¿å¹Žã®UEFIããŒã¹ã®ãã·ã³ãäŸå€ã§ã¯ãªãããããã¯ãšãã¥ã¬ãŒããããBIOSã䜿ããŸããåäžçŽã®ãã¹ãŠã®ãã·ã³ã«ãåãããŒãããžãã¯ã䜿ãããªããŠçŽ æŽãããã§ããããããããã®åºãäºææ§ã¯ãBIOSã«ããèµ·åã®æå€§ã®æ¬ ç¹ã§ãããã®ã§ãããšããã®ãããã¯ã1980幎代ã®åç³ã®ãããªããŒãããŒããŒãåããããã«ãCPUããªã¢ã«ã¢ãŒããšåŒã°ãã16bitäºæã¢ãŒãã«ãããŠããŸããšããããšãæå³ããŠããããã§ãã
ãŸãé ã远ã£ãŠèŠãŠããããšãšããŸãããã
ã³ã³ãã¥ãŒã¿ã¯èµ·åæã«ãã¶ãŒããŒãã«ããç¹æ®ãªãã©ãã·ã¥ã¡ã¢ãªããBIOSãèªã¿èŸŒã¿ãŸããBIOSã¯èªå·±ãã¹ããšããŒããŠã§ã¢ã®åæåã«ãŒãã³ãå®è¡ããããŒã¿ãã«ãã£ã¹ã¯ãæ¢ããŸãããã£ã¹ã¯ãèŠã€ãããšã ããŒãããŒã㌠ãšåŒã°ããããã®å é 512ãã€ãã«ä¿åãããå®è¡å¯èœã³ãŒããžãšæäœæš©ãç§»ããŸããå€ãã®ããŒãããŒããŒã®ãµã€ãºã¯512ãã€ããã倧ãããããéåžžã¯512ãã€ãã«åãŸãå°ããªæåã®ã¹ããŒãžãšããã®æåã®ã¹ããŒãžã«ãã£ãŠèªã¿èŸŒãŸãã第2ã¹ããŒãžã«åããããŠããŸãã
ããŒãããŒããŒã¯ãã£ã¹ã¯å ã®ã«ãŒãã«ã€ã¡ãŒãžã®å Žæãç¹å®ããã¡ã¢ãªã«èªã¿èŸŒãŸãªããã°ãªããŸããããŸããCPUã16bitã®ãªã¢ã«ã¢ãŒããã32bitã®ãããã¯ãã¢ãŒããžããããŠ64bitã®ãã³ã°ã¢ãŒãââ64bitã¬ãžã¹ã¿ãšãã¹ãŠã®ã¡ã€ã³ã¡ã¢ãªãå©çšå¯èœã«ãªããŸãââãžãšå€æŽããªããã°ãªããŸããã3ã€ç®ã®ä»äºã¯ãç¹å®ã®æ å ±ïŒäŸãã°ã¡ã¢ãªãŒããããªã©ã§ãïŒãBIOSããèãåºããOSã®ã«ãŒãã«ã«æž¡ãããšã§ãã
ããŒãããŒããŒãæžãã®ã«ã¯ã¢ã»ã³ããªèšèªãå¿ èŠãšããããããäœãèããã«ããã»ããµãŒã®ãã®ã¬ãžã¹ã¿ã«ãã®å€ãæžã蟌ãã§ãã ãããã®ãããªå匷ã®åœ¹ã«ç«ããªãäœæ¥ãããããããã®ã§ãã¡ãã£ãšé¢åãããã§ããã§ãã®ã§ãã®èšäºã§ã¯ããŒãããŒããŒã®å¶äœã«ã€ããŠã¯é£ã°ããŠã代ããã«bootimageãšãããèªåã§ã«ãŒãã«ã®åã«ããŒãããŒãã眮ããŠãããããŒã«ã䜿ããŸãããã
èªåã®ããŒãããŒããŒãäœãããšã«èå³ããã人ããæåŸ äžãããããã«é¢ããèšäºãèšç»äžã§ãïŒ
MultibootæšæºèŠæ Œ
ãã¹ãŠã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããèªèº«ã«ã®ã¿å¯Ÿå¿ããŠããããŒãããŒããŒãå®è£ ãããšããããšãé¿ããããã«ã1995幎ã«ããªãŒãœãããŠã§ã¢è²¡å£ãMultibootãšããããŒãããŒããŒã®å ¬éæšæºèŠæ Œãçå®ããŠããŸãããã®æšæºèŠæ Œã§ã¯ãããŒãããŒããŒãšãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ãããŠãããMultibootã«æºæ ããããŒãããŒããŒã§ããã°ãåããããã«æºæ ãããã¹ãŠã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãèªã¿èŸŒããããã«ãªã£ãŠããŸãããã®ãªãã¡ã¬ã³ã¹å®è£ ãšããŠãLinuxã·ã¹ãã ã§äžçªäººæ°ã®ããŒãããŒããŒã§ããGNU GRUBããããŸãã
ã«ãŒãã«ãMultibootã«æºæ ãããã«ã¯ãã«ãŒãã«ãã¡ã€ã«ã®å é ã«ããããMultiboot headerãæ¿å ¥ããã ãã§æžã¿ãŸãããã®ãããã§ãOSãGRUBã§èµ·åããã®ã¯ãšãŠãç°¡åã§ããããããGRUBãšMultibootæšæºèŠæ Œã«ã¯ããã€ãåé¡ããããŸãïŒ
- ãããã¯32bitãããã¯ãã¢ãŒããããµããŒãããŠããŸããããã®ããã64bitãã³ã°ã¢ãŒãã«å€æŽããããã®CPUã®èšå®ã¯äŸç¶è¡ãå¿ èŠããããŸãã
- ãããã¯ãã«ãŒãã«ã§ã¯ãªãããŒãããŒããŒãã·ã³ãã«ã«ãªãããã«èšèšãããŠããŸããäŸãã°ãã«ãŒãã«ã¯éåžžãšã¯ç°ãªãããã©ã«ãããŒãžãµã€ãºã§ãªã³ã¯ãããå¿ èŠããããããããªããšGRUBã¯Multiboot headerãèŠã€ããããšãã§ããŸãããä»ã«ããã«ãŒãã«ã«æž¡ãããããŒãæ å ±ã¯ãã¯ãªãŒã³ãªæœè±¡åãäžããŠããããã¢ãŒããã¯ãã£äŸåã®æ§é ãå€ãå«ãã§ããŸãã
- GRUBãMultibootæšæºèŠæ Œãããã¥ã¡ã³ããå å®ããŠããŸããã
- ã«ãŒãã«ãã¡ã€ã«ããããŒã¿ãã«ãã£ã¹ã¯ã€ã¡ãŒãžãäœãã«ã¯ããã¹ãã·ã¹ãã ã«GRUBãã€ã³ã¹ããŒã«ãããŠããå¿ èŠããããŸããããã«ãããMacãšWindowsäžã§ã®éçºã¯æ¯èŒçé£ãããªã£ãŠããŸãã
ãããã®æ¬ ç¹ãèæ ®ããç§éã¯GRUBãšMultibootæšæºèŠæ Œã䜿ããªãããšã«æ±ºããŸãããããããããªãã®ã«ãŒãã«ãGRUBã·ã¹ãã äžã§èªã¿èŸŒããããã«ãç§éã®bootimageããŒã«ã«Multibootã®ãµããŒãã远å ããããšãèšç»ããŠããŸããMultibootæºæ ãªã«ãŒãã«ãæžãããå Žåã¯ããã®ããã°ã·ãªãŒãºã®ç¬¬1çãã芧ãã ããã
UEFI
ïŒä»ã®æUEFIã®ãµããŒãã¯æäŸããŠããŸãããããã²ãšãããããšæã£ãŠããŸãïŒãæäŒãããã ããå Žåã¯ã GitHub issueã§æããŠãã ãããïŒ
æå°ã®ã«ãŒãã«
ã©ã®ããã«ã³ã³ãã¥ãŒã¿ãèµ·åããã®ãã«ã€ããŠãã£ãããšçè§£ã§ããã®ã§ãèªåã§æå°ã®ã«ãŒãã«ãæžããŠã¿ãŸããããç®æšã¯ãèµ·åãããç»é¢ã«"Hello, World!"ãšåºåãããããªãã£ã¹ã¯ã€ã¡ãŒãžãäœãããšã§ãããšããããã§ãåã®èšäºã®ç¬ç«ããRustãã€ããªãããšã«ããŠäœã£ãŠãããŸãã
èŠããŠããŸããããã®ç¬ç«ãããã€ããªã¯cargoã䜿ã£ãŠãã«ãããŸãããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«äŸã£ãŠç°ãªããšã³ããªãã€ã³ãåãšã³ã³ãã€ã«ãã©ã°ãå¿
èŠãªã®ã§ãããããã¯cargoã¯æšæºã§ã¯ ãã¹ãã·ã¹ãã ïŒããªãã®äœ¿ã£ãŠããã·ã¹ãã ïŒåãã«ãã«ãããããã§ããäŸãã°Windowsäžã§èµ°ãã«ãŒãã«ãšããã®ã¯ããŸãæå³ããªããç§éã®æãåäœã§ã¯ãããŸããã代ããã«ãæç¢ºã«å®çŸ©ããã ã¿ãŒã²ããã·ã¹ãã åãã«ã³ã³ãã€ã«ã§ãããšçæ³çã§ãã
Rustã®Nightlyçãã€ã³ã¹ããŒã«ãã
Rustã«ã¯stableãbetaãnightlyã®3ã€ã®ãªãªãŒã¹ãã£ã³ãã«ããããŸããRust Bookã¯ãããã®3ã€ã®ãã£ã³ãã«ã®éãããšãŠãè¯ã説æããŠããã®ã§ãäžåºŠç¢ºèªããŠã¿ãŠãã ããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããã«ãããã«ã¯ãnightlyãã£ã³ãã«ã§ããå©çšã§ããªãããã€ãã®å®éšçæ©èœã䜿ãå¿ èŠãããã®ã§ãRustã®nightlyçãã€ã³ã¹ããŒã«ããããšã«ãªããŸãã
Rustã®å®è¡ç°å¢ã管çããã®ã«ã¯ãrustupã匷ãããããããŸããnightlyãbetaãstableçã®ã³ã³ãã€ã©ãããããã€ã³ã¹ããŒã«ããããšãã§ããŸãããã¢ããããŒãããã®ãç°¡åã§ããçŸåšã®ãã£ã¬ã¯ããªã«nightlyã³ã³ãã€ã©ã䜿ãããã«ããã«ã¯ãrustup override set nightlyãšå®è¡ããŠãã ããããããã¯ãrust-toolchainãšãããã¡ã€ã«ã«nightlyãšèšå
¥ããŠãããžã§ã¯ãã®ã«ãŒããã£ã¬ã¯ããªã«çœ®ãããšã§ãæå®ã§ããŸããNightlyçã䜿ã£ãŠããããšã¯ãrustc --versionãšå®è¡ããããšã§ç¢ºãããããŸãã衚瀺ãããããŒãžã§ã³åã®æ«å°Ÿã«-nightlyãšããã¯ãã§ãã
nightlyã³ã³ãã€ã©ã§ã¯ãããããfeature flagããã¡ã€ã«ã®å
é ã«ã€ããããšã§ããããããªå®éšçæ©èœã䜿ãããšãéžæã§ããŸããäŸãã°ã#![feature(asm)]ãmain.rsã®å
é ã«ã€ããããšã§ãã€ã³ã©ã€ã³ã¢ã»ã³ããªã®ããã®å®éšçãªasm!ãã¯ããæå¹åããããšãã§ããŸãããã ãããããã®å®éšçæ©èœã¯å
šããã£ãŠäžå®å®ã§ãããå°æ¥ã®RustããŒãžã§ã³ã«ãããŠã¯äºåã®èŠåãªã倿Žããããåãé€ããããããå¯èœæ§ãããããšã«æ³šæããŠãã ããããã®ããã絶察ã«å¿
èŠãªãšãã«ã®ã¿ãããã䜿ãããšã«ããŸãã
ã¿ãŒã²ããã®ä»æ§
Cargoã¯--targetãã©ã¡ãŒã¿ã䜿ã£ãŠããŸããŸãªã¿ãŒã²ããããµããŒãããŸããã¿ãŒã²ããã¯ããããtarget tripleã«ãã£ãŠè¡šãããŸããããã¯CPUã¢ãŒããã¯ãã£ã補é å
ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããããŠABIã衚ããŸããäŸãã°ãx86_64-unknown-linux-gnuãšããtarget tripleã¯ãx86_64ã®CPUã補é å
äžæãGNU ABIã®Linuxãªãã¬ãŒãã£ã³ã°ã·ã¹ãã åãã®ã·ã¹ãã ã衚ããŸããRustã¯å€ãã®target tripleããµããŒãããŠããããã®äžã«ã¯Androidã®ããã®arm-linux-androideabiãWebAssemblyã®ããã®wasm32-unknown-unknownãªã©ããããŸãã
ããããªãããç§éã®ã¿ãŒã²ããã·ã¹ãã ã«ã¯ãããã€ãç¹æ®ãªèšå®ãã©ã¡ãŒã¿ãå¿
èŠã«ãªããŸãïŒäŸãã°ããã®äžã§ã¯OSãèµ°ã£ãŠããªãããªã©ïŒããªã®ã§ãæ¢åã®target tripleã¯ã©ããåœãŠã¯ãŸããŸããããããããããšã«ãRustã§ã¯JSONãã¡ã€ã«ã䜿ã£ãŠç¬èªã®ã¿ãŒã²ãããå®çŸ©ã§ããŸããäŸãã°ãx86_64-unknown-linux-gnuãšããã¿ãŒã²ããã衚ãJSONãã¡ã€ã«ã¯ãããªæãã§ãã
{
"llvm-target": "x86_64-unknown-linux-gnu",
"data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128",
"arch": "x86_64",
"target-endian": "little",
"target-pointer-width": "64",
"target-c-int-width": "32",
"os": "linux",
"executables": true,
"linker-flavor": "gcc",
"pre-link-args": ["-m64"],
"morestack": false
}
ã»ãšãã©ã®ãã£ãŒã«ãã¯LLVMããã®ãã©ãããã©ãŒã åãã®ã³ãŒããçæããããã«å¿
èŠãªãã®ã§ããäŸãã°ãdata-layoutãã£ãŒã«ãã¯çš®ã
ã®æŽæ°ãæµ®åå°æ°ç¹æ°ããã€ã³ã¿åã®å€§ãããå®çŸ©ããŠããŸããæ¬¡ã«ãtarget-pointer-widthã®ãããªãæ¡ä»¶ä»ãã³ã³ãã€ã«ã«çšãããããã£ãŒã«ãããããŸãã第3ã®çš®é¡ã®ãã£ãŒã«ãã¯ã¯ã¬ãŒããã©ã®ããã«ãã«ããããã¹ãããå®çŸ©ããŸããäŸãã°ãpre-link-argsãã£ãŒã«ãã¯ãªã³ã«ã«æž¡ãããåŒæ°ãæå®ããŠããŸãã
ç§éã®ã«ãŒãã«ãx86_64ã®ã·ã¹ãã ãã¿ãŒã²ãããšããã®ã§ãç§éã®ã¿ãŒã²ãã仿§ãäžã®ãã®ãšéåžžã«ãã䌌ããã®ã«ãªãã§ããããx86_64-blog_os.jsonãšãããã¡ã€ã«ïŒã奜ããªååãéžãã§ãã ããïŒãäœããå
±éããèŠçŽ ãåãããšããããå§ããŸãããã
{
"llvm-target": "x86_64-unknown-none",
"data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128",
"arch": "x86_64",
"target-endian": "little",
"target-pointer-width": "64",
"target-c-int-width": "32",
"os": "none",
"executables": true
}
ãã¢ã¡ã¿ã«ç°å¢ã§å®è¡ããã®ã§ãllvm-targetã®OSãå€ããosãã£ãŒã«ããnoneã«ããããšã«æ³šç®ããŠãã ããã
以äžã®ããã«ãã«é¢ä¿ããé ç®ã远å ããŸãã
"linker-flavor": "ld.lld",
"linker": "rust-lld",
ç§éã®ã«ãŒãã«ããªã³ã¯ããã®ã«ããã©ãããã©ãŒã æšæºã®ïŒLinuxã¿ãŒã²ããããµããŒãããŠããªããããããªãïŒãªã³ã«ã§ã¯ãªããRustã«ä»å±ããŠããã¯ãã¹ãã©ãããã©ãŒã ã®LLDãªã³ã«ã䜿çšããŸãã
"panic-strategy": "abort",
ãã®èšå®ã¯ãã¿ãŒã²ããããããã¯æã®stack unwindingããµããŒãããŠããªãã®ã§ãããã°ã©ã ã¯ä»£ããã«çŽæ¥äžæããªããã°ãªããªããšããããšãæå®ããŠããŸããããã¯ãCargo.tomlã«panic = "abort"ãšããèšå®ãæžãã®ã«çããã§ããããåŸè
ã®èšå®ãæ¶ããŠãæ§ããŸããïŒãã®ã¿ãŒã²ããèšå®ã¯ãCargo.tomlã®èšå®ãšç°ãªãããã®ããšè¡ãcoreã©ã€ãã©ãªã®åã³ã³ãã€ã«ã«ãé©çšãããŸããã§ãã®ã§ãCargo.tomlã«èšå®ããæ¹ã奜ã¿ã ã£ããšããŠãããã®èšå®ã远å ããããã«ããŠãã ããïŒã
"disable-redzone": true,
ã«ãŒãã«ãæžããŠãã以äžãããæç¹ã§å²ã蟌ã¿ãåŠçããªããã°ãªããªããªãã§ãããããããå®å šã«è¡ãããã«ã "red zone" ãšåŒã°ãããããçš®ã®ã¹ã¿ãã¯ãã€ã³ã¿æé©åãç¡å¹åããå¿ èŠããããŸããããããªããšãã¹ã¿ãã¯ã®ç ŽæãåŒãèµ·ãããŠããŸãæããããããã§ãããã詳ããã¯ãred zoneã®ç¡å¹åãšããå¥èšäºãã芧ãã ããã
"features": "-mmx,-sse,+soft-float",
featuresãã£ãŒã«ãã¯ãã¿ãŒã²ããã®æ©èœãæå¹å/ç¡å¹åããŸãããã€ãã¹ãåã«ã€ããããšã§mmxãšsseãšããæ©èœãç¡å¹åãããã©ã¹ãåã«ã€ããããšã§soft-floatãšããæ©èœãæå¹åããŠããŸããããããã®ãã©ã°ã®éã«ã¹ããŒã¹ã¯å
¥ããŠã¯ãªããããããããããšLLVMãæ©èœæååã®è§£éã«å€±æããŠããŸãããšã«æ³šæããŠãã ããã
mmxãšsseãšããæ©èœã¯ãSingle Instruction Multiple Data (SIMD)åœä»€ããµããŒãããããæ±ºå®ããŸãããã®åœä»€ã¯ããã°ãã°ããã°ã©ã ãèããéãããŠãããŸãããããã倧ããªSIMDã¬ãžã¹ã¿ãOSã«ãŒãã«ã§äœ¿ãããšã¯æ§èœäžã®åé¡ã«ç¹ãããŸãã ãã®çç±ã¯ãã«ãŒãã«ã¯ãå²ã蟌ãŸããããã°ã©ã ãåéããåã«ããã¹ãŠã®ã¬ãžã¹ã¿ãå
ã«æ»ããªããšãããªãããã§ããããã¯ãã«ãŒãã«ãSIMDã®ç¶æ
ã®ãã¹ãŠããã·ã¹ãã ã³ãŒã«ãããŒããŠã§ã¢å²ã蟌ã¿ããããã³ã«ã¡ã€ã³ã¡ã¢ãªã«ä¿åããªããšãããªããšããããšãæå³ããŸããSIMDã®ç¶æ
æ
å ±ã¯ãšãŠã巚倧ïŒ512ã1600 bytesïŒã§ãå²ã蟌ã¿ã¯éåžžã«é »ç¹ã«èµ·ãããããããªãã®ã§ãä¿åã»åŸ©å
ã®æäœããã®ããã«è¿œå ãããã®ã¯æ§èœã«ããªãã®æªåœ±é¿ãåãŒããŸãããããé¿ããããã«ãïŒã«ãŒãã«ã®äžã§èµ°ã£ãŠããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãªãïŒïŒã«ãŒãã«äžã§SIMDãç¡å¹åããã®ã§ãã
SIMDãç¡å¹åããããšã«ããåé¡ã«ãx86_64ã«ãããæµ®åå°æ°ç¹æŒç®ã¯æšæºã§ã¯SIMDã¬ãžã¹ã¿ãå¿
èŠãšãããšããããšããããŸãããã®åé¡ã解決ãããããsoft-floatæ©èœã远å ããŸããããã¯ããã¹ãŠã®æµ®åå°æ°ç¹æŒç®ãéåžžã®æŽæ°ã«åºã¥ãããœãããŠã§ã¢äžã®é¢æ°ã䜿ã£ãŠãšãã¥ã¬ãŒããããšãããã®ã§ãã
ãã詳ããã¯ãSIMDãç¡å¹åããããšã«é¢ããç§éã®èšäºãèªãã§ãã ããã
ãŸãšãããš
ç§éã®ã¿ãŒã²ãã仿§ãã¡ã€ã«ã¯ä»ãã®ããã«ãªã£ãŠããã¯ãã§ãã
{
"llvm-target": "x86_64-unknown-none",
"data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128",
"arch": "x86_64",
"target-endian": "little",
"target-pointer-width": "64",
"target-c-int-width": "32",
"os": "none",
"executables": true,
"linker-flavor": "ld.lld",
"linker": "rust-lld",
"panic-strategy": "abort",
"disable-redzone": true,
"features": "-mmx,-sse,+soft-float"
}
ã«ãŒãã«ããã«ããã
ç§éã®æ°ããã¿ãŒã²ããã®ã³ã³ãã€ã«ã«ã¯Linuxã®æ
£ç¿ã«å£ããŸãïŒçç±ã¯ç¥ããŸãããLLVMã®ããã©ã«ãã§ãããšããã ãã§ã¯ãªãã§ããããïŒãã€ãŸããåã®èšäºã§èª¬æããããã«_startãšããååã®ãšã³ããªãã€ã³ããèŠããšããããšã§ãã
// src/main.rs
#![no_std] // don't link the Rust standard library
#![no_main] // disable all Rust-level entry points
use core::panic::PanicInfo;
/// This function is called on panic.
#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {
loop {}
}
#[no_mangle] // don't mangle the name of this function
pub extern "C" fn _start() -> ! {
// this function is the entry point, since the linker looks for a function
// named `_start` by default
loop {}
}
ãã¹ãOSãäœã§ãããã«ãããããããšã³ããªãã€ã³ãã¯_startãšããååã§ãªããã°ãªããªãããšã«æ³šæããŠãã ããã
ããã§ãç§éã®æ°ããã¿ãŒã²ããã®ããã®ã«ãŒãã«ããJSONãã¡ã€ã«åã--targetãšããŠæž¡ãããšã§ãã«ãã§ããããã«ãªããŸããã
> cargo build --target x86_64-blog_os.json
error[E0463]: can't find crate for `core`
倱æããŸãããïŒãšã©ãŒã¯Rustã³ã³ãã€ã©ãcoreã©ã€ãã©ãªãèŠã€ããããªããªã£ããšèšã£ãŠããŸãããã®ã©ã€ãã©ãªã¯ãResult ã Optionãã€ãã¬ãŒã¿ã®ãããªåºæ¬çãªRustã®åãæã£ãŠãããæé»ã®ãã¡ã«ãã¹ãŠã®no_stdãªã¯ã¬ãŒãã«ãªã³ã¯ãããŠããŸãã
åé¡ã¯ãcoreã©ã€ãã©ãªã¯Rustã³ã³ãã€ã©ãšäžç·ã«ã³ã³ãã€ã«æžã¿ã©ã€ãã©ãªãšããŠé
åžãããŠãããšããããšã§ãããã®ãããããã¯ãç§éç¬èªã®ã¿ãŒã²ããã§ã¯ãªãããµããŒããããŠããhost tripleïŒäŸãã° x86_64-unknown-linux-gnuïŒã§ã®ã¿äœ¿ããã®ã§ããä»ã®ã¿ãŒã²ããã®ããã«ã³ãŒããã³ã³ãã€ã«ããããšãã«ã¯ãcoreããããã®ã¿ãŒã²ããã«åããŠåã³ã³ãã€ã«ããå¿
èŠããããŸãã
build-stdãªãã·ã§ã³
ããã§cargoã®build-stdæ©èœã®åºçªã§ããããã䜿ããšcoreããã®ä»ã®æšæºã©ã€ãã©ãªã¯ã¬ãŒãã«ã€ããŠãRustã€ã³ã¹ããŒã«æã«äžç·ã«ã€ããŠããã³ã³ãã€ã«æžã¿ããŒãžã§ã³ã䜿ã代ããã«ãå¿
èŠã«å¿ããŠåã³ã³ãã€ã«ããããšãã§ããŸããããã¯ãšãŠãæ°ãããŸã 宿ããŠããªãã®ã§ãäžå®å®æ©èœãšãããŠãããnightly Rustã³ã³ãã€ã©ã§ã®ã¿å©çšå¯èœã§ãã
ãã®æ©èœã䜿ãããã«ã¯ãcargoã®èšå®ãã¡ã€ã«ã.cargo/config.tomlã«äœããæ¬¡ã®å
å®¹ãæžããŸãããã
# in .cargo/config.toml
[unstable]
build-std = ["core", "compiler_builtins"]
ããã¯cargoã«coreãšcompiler_builtinsã©ã€ãã©ãªãåã³ã³ãã€ã«ããããåœä»€ããŸããåŸè
ãå¿
èŠãªã®ã¯coreãããã«äŸåããŠããããã§ãã ãããã®ã©ã€ãã©ãªãåã³ã³ãã€ã«ããããã«ã¯ãcargoãRustã®ãœãŒã¹ã³ãŒãã«ã¢ã¯ã»ã¹ã§ããå¿
èŠããããŸããããã¯rustup component add rust-srcã§ã€ã³ã¹ããŒã«ã§ããŸãã
泚æ: unstable.build-stdèšå®ããŒã䜿ãã«ã¯ãå°ãªããšã2020-07-15以éã®Rust nightlyãå¿
èŠã§ãã
unstable.build-stdèšå®ããŒãã»ããããrust-srcã³ã³ããŒãã³ããã€ã³ã¹ããŒã«ãããããã«ãã³ãã³ããããäžåºŠå®è¡ããŸãããã
> cargo build --target x86_64-blog_os.json
Compiling core v0.0.0 (/âŠ/rust/src/libcore)
Compiling rustc-std-workspace-core v1.99.0 (/âŠ/rust/src/tools/rustc-std-workspace-core)
Compiling compiler_builtins v0.1.32
Compiling blog_os v0.1.0 (/âŠ/blog_os)
Finished dev [unoptimized + debuginfo] target(s) in 0.29 secs
ä»åã¯ãcargo buildãcoreãrustc-std-workspace-core (compiler_builtinsã®äŸåã§ã)ããã㊠compiler_builtinsãç§éã®ã«ã¹ã¿ã ã¿ãŒã²ããåãã«åã³ã³ãã€ã«ããŠãããšããããšãããããŸãã
ã¡ã¢ãªé¢ä¿ã®çµã¿èŸŒã¿é¢æ°
Rustã³ã³ãã€ã©ã¯ããã¹ãŠã®ã·ã¹ãã ã«ãããŠãç¹å®ã®çµã¿èŸŒã¿é¢æ°ãå©çšå¯èœã§ãããšããããšãåæã«ããŠããŸãããããã®é¢æ°ã®å€ãã¯ãç§éãã¡ããã©åã³ã³ãã€ã«ããcompiler_builtinsã¯ã¬ãŒãã«ãã£ãŠæäŸãããŠããŸããããããªãããéåžžã·ã¹ãã ã®Cã©ã€ãã©ãªã«ãã£ãŠæäŸãããŠããã®ã§æšæºã§ã¯æå¹åãããŠããªããã¡ã¢ãªé¢ä¿ã®é¢æ°ãããã€ããããŸãããããã®é¢æ°ã«ã¯ãã¡ã¢ãªãããã¯å
ã®ãã¹ãŠã®ãã€ããäžããããå€ã«ã»ããããmemsetãã¡ã¢ãªãŒãããã¯ãä»ã®ãããã¯ãžãšã³ããŒããmemcpyã2ã€ã®ã¡ã¢ãªãŒãããã¯ãæ¯èŒããmemcmpãªã©ããããŸãããããã®é¢æ°ã¯ã©ãããçŸåšã®æ®µéã§æã
ã®ã«ãŒãã«ãã³ã³ãã€ã«ããã®ã«å¿
èŠãšããããã§ã¯ãããŸããããã³ãŒãã远å ããŠãããšããã«å¿
èŠã«ãªãã§ãããïŒããšãã°ãæ§é äœãã³ããŒããããªã©ïŒã
ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®Cã©ã€ãã©ãªã«ãªã³ã¯ããããšã¯ã§ããŸããã®ã§ããããã®é¢æ°ãã³ã³ãã€ã©ã«äžããŠããå¥ã®æ¹æ³ãå¿
èŠã«ãªããŸãããã®ããã®æ¹æ³ãšããŠèãããããã®ã®äžã€ããèªåã§memsetãå®è£
ããïŒã³ã³ãã€ã«äžã®èªåãªããŒã ãé²ãããïŒ#[no_mangle]ã¢ããªãã¥ãŒãããããã«é©çšããããšã§ãããããããããããããšããããã®é¢æ°ã®å®è£
ã®ã¡ãã£ãšãããã¹ãæªå®çŸ©åäœã«ç¹ããããããå±éºã§ããããšãã°ãforã«ãŒãã䜿ã£ãŠmemcpyãå®è£
ãããšç¡éååž°ãèµ·ãããŠããŸããããããŸããããªããªããforã«ãŒãã¯æé»ã®ãã¡ã«IntoIterator::into_iterãã¬ã€ãã¡ãœãããåŒã³åºããŠããããããmemcpyãåã³åŒã³åºããŠãããããããªãããã§ãããªã®ã§ã代ããã«æ¢åã®ãããã¹ããããå®è£
ãåå©çšããã®ãè¯ãã§ãããã
ãããããããšã«ãcompiler_builtinsã¯ã¬ãŒãã«ã¯ãããã®å¿
èŠãªé¢æ°ãã¹ãŠã®å®è£
ãå«ãŸããŠãããæšæºã§ã¯Cã©ã€ãã©ãªã®å®è£
ãšç«¶åããªãããã«ç¡å¹åãããŠããã ããªã®ã§ããããã¯cargoã®build-std-featuresãã©ã°ã["compiler-builtins-mem"]ã«èšå®ããããšã§æå¹åã§ããŸããbuild-stdãã©ã°ãšåãããã«ããã®ãã©ã°ã¯ã³ãã³ãã©ã€ã³ã§-Zãã©ã°ãšããŠæž¡ãããšãã§ããã°ã.cargo/config.tomlãã¡ã€ã«ã®unstableããŒãã«ã§èšå®ããããšãã§ããŸãããã«ãæã¯åžžã«ãã®ãã©ã°ãã»ãããããã®ã§ãèšå®ãã¡ã€ã«ãäœ¿ãæ¹ãè¯ãã§ãããïŒ
# in .cargo/config.toml
[unstable]
build-std-features = ["compiler-builtins-mem"]
ïŒcompiler-builtins-memæ©èœã®ãµããŒãã远å ãããã®ã¯ã€ãæè¿ãªã®ã§ã2019-09-30以éã®Rust nightlyãå¿
èŠã§ããïŒ
ãã®ãšããè£ã§compiler_builtinsã¯ã¬ãŒãã®memæ©èœãæå¹åãããŠããŸããããã«ããããã®ã¯ã¬ãŒãã®memcpyãªã©ã®å®è£
ã«#[no_mangle]ã¢ããªãã¥ãŒããé©çšããããªã³ã«ãããããå©çšã§ããããã«ãªã£ãŠããŸãããããã®é¢æ°ã¯ä»ã®ãšããæé©åãããŠããããæ§èœã¯æé«ã§ã¯ãªããããããªããã®ã®ãå°ãªããšãæ£ããå®è£
ã§ã¯ãããšããããšã¯ç¥ã£ãŠãã䟡å€ãããã§ããããx86_64ã«ã€ããŠã¯ããããã®é¢æ°ãç¹æ®ãªã¢ã»ã³ããªåœä»€ã䜿ã£ãŠæé©åãããã«ãªã¯ãšã¹ããæåºãããŠããŸãã
ãã®å€æŽããã£ãŠãç§éã®ã«ãŒãã«ã¯ã³ã³ãã€ã©ã«å¿ èŠãšãããŠãããã¹ãŠã®é¢æ°ã®æå¹ãªå®è£ ãæã«å ¥ããã®ã§ãã³ãŒãããã£ãšè€éã«ãªã£ãŠãå€ãããã³ã³ãã€ã«ã§ããã§ãããã
æšæºã®ã¿ãŒã²ãããã»ãããã
cargo buildãåŒã³åºããã³ã«--targetãã©ã¡ãŒã¿ãæž¡ãã®ãé¿ããããã«ãããã©ã«ãã®ã¿ãŒã²ãããæžãæããããšãã§ããŸãããããããã«ã¯ã以äžã.cargo/config.tomlã®cargoèšå®ãã¡ã€ã«ã«ä»ãå ããŸã:
# in .cargo/config.toml
[build]
target = "x86_64-blog_os.json"
ããã¯ãæç€ºçã«--targetåŒæ°ãæž¡ãããŠããªããšãã¯ãx86_64-blog_os.jsonã¿ãŒã²ããã䜿ãããã«cargoã«åœä»€ããŸããã€ãŸããç§éã¯ã«ãŒãã«ãã·ã³ãã«ãªcargo buildã³ãã³ãã§ãã«ãã§ãããšããããšã§ããcargoã®èšå®ã®ãªãã·ã§ã³ã«ã€ããŠãã詳ããç¥ãã«ã¯ãå
¬åŒã®ããã¥ã¡ã³ããèªãã§ãã ããã
ããã«ãããã·ã³ãã«ãªcargo buildã³ãã³ãã§ããã¢ã¡ã¿ã«ã®ã¿ãŒã²ããã«ç§éã®ã«ãŒãã«ããã«ãã§ããããã«ãªããŸãããããããããŒãããŒããŒã«ãã£ãŠåŒã³åºãããç§éã®_startãšã³ããªãã€ã³ãã¯ãŸã 空ã£ãœã§ããããããããããäœããç»é¢ã«åºåããŠã¿ãŸãããã
ç»é¢ã«åºåãã
çŸåšã®æ®µéã§ç»é¢ã«æåãåºåããæãç°¡åãªæ¹æ³ã¯VGAããã¹ããããã¡ã§ããããã¯ç»é¢ã«åºåãããŠããå 容ãä¿æããŠããVGAããŒããŠã§ã¢ã«ããããããç¹æ®ãªã¡ã¢ãªã§ããéåžžãããã¯25è¡ãããªããããããã®è¡ã¯80æåã»ã«ãããªããŸããããããã®æåã»ã«ã¯ãèæ¯è²ãšåæ¯è²ä»ãã®ASCIIæåã衚瀺ããŸããç»é¢åºåã¯ãã®ããã«èŠããã§ãããïŒ
次ã®èšäºã§ã¯ãVGAãããã¡ã®æ£ç¢ºãªã¬ã€ã¢ãŠãã«ã€ããŠè°è«ãããã®ããã®ã¡ãã£ãšãããã©ã€ããæžããŸãã"Hello World!"ãåºåããããã«ã¯ããããã¡ãã¢ãã¬ã¹0xb8000ã«ãããããããã®æåã»ã«ã¯ASCIIã®ãã€ããšè²ã®ãã€ããããªãããšãç¥ã£ãŠããå¿
èŠããããŸãã
å®è£ ã¯ãããªæãã«ãªããŸãïŒ
static HELLO: &[u8] = b"Hello World!";
#[no_mangle]
pub extern "C" fn _start() -> ! {
let vga_buffer = 0xb8000 as *mut u8;
for (i, &byte) in HELLO.iter().enumerate() {
unsafe {
*vga_buffer.offset(i as isize * 2) = byte;
*vga_buffer.offset(i as isize * 2 + 1) = 0xb;
}
}
loop {}
}
ãŸãã0xb8000ãšããæŽæ°ãçãã€ã³ã¿ã«ãã£ã¹ãããŸããæ¬¡ã«éçãªHELLOãšãããã€ãå倿°ã®èŠçŽ ã«å¯Ÿãã€ãã¬ãŒãããŸããenumerateã¡ãœããã䜿ãããšã§ãfor ã«ãŒãã®å®è¡åæ°ã衚ã倿° i ãååŸããŸããã«ãŒãã®å
éšã§ã¯ãoffsetã¡ãœããã䜿ã£ãŠæååã®ãã€ããšå¯Ÿå¿ããè²ã®ãã€ãïŒ0xbã¯æããã·ã¢ã³è²ïŒãæžã蟌ãã§ããŸãã
ãã¹ãŠã®ã¡ã¢ãªãžã®æžã蟌ã¿åŠçã®ã³ãŒãããunsafeãããã¯ãå²ãã§ããããšã«æ³šæããŠãã ããããã®çç±ã¯ãç§éã®äœã£ãçãã€ã³ã¿ãæ£ãããã®ã§ããããšãRustã³ã³ãã€ã©ã蚌æã§ããªãããã§ããçãã€ã³ã¿ã¯ã©ããªå Žæã§ãæãããã®ã§ãããŒã¿ã®ç Žæã«ã€ãªãããããããŸããããããã®æäœãunsafeãããã¯ã«å
¥ããããšã§ãç§éã¯ãããæ£ããããšã確信ããŠãããšã³ã³ãã€ã©ã«äŒããŠããã®ã§ãããã ããunsafeãããã¯ã¯Rustã®å®å
šæ§ãã§ãã¯ãæ¶ãããã§ã¯ãªãã远å ã§5ã€ã®ããšãã§ããããã«ãªãã ããšããããšã«æ³šæããŠãã ããã
蚳泚: 翻蚳æç¹(2020-10-20)ã§ã¯ããªã³ã¯å ã®The Rust bookæ¥æ¬èªçã«ã¯ã远å ã§ã§ããããã«ãªãããšãã¯4ã€ããæžãããŠããŸããã
匷調ããŠããããã®ã§ããã ãã®ãããªæ©èœã¯Rustã§ããã°ã©ãã³ã°ãããšãã«äœ¿ããããã®ã§ã¯ãããŸããïŒ unsafeãããã¯å ã§çãã€ã³ã¿ãæ±ããšéåžžã«ãããããããã§ããããšãã°ã泚æäžè¶³ã§ãããã¡ã®çµç«¯ã®ããã«å¥¥ã«æžã蟌ã¿ãè¡ã£ãŠããŸã£ãããããããããŸããã
ã§ãã®ã§ãunsafeã®äœ¿çšã¯æå°éã«ãããã§ãããããããããã«ãRustã§ã¯å®å
šãªabstractionãäœãããšãã§ããŸããããšãã°ãVGAãããã¡åãäœãããã®äžã«ãã¹ãŠã®unsafeãªæäœãã«ãã»ã«åããå€åŽããã®èª€ã£ãæäœãäžå¯èœã§ããããšãä¿èšŒã§ããã§ããããããããã°ãunsafeã®éãæå°éã«ã§ããã¡ã¢ãªå®å
šæ§ã䟵ããŠããªãããšã確ãã«ã§ããŸãããã®ãããªå®å
šãªVGAãããã¡ã® abstraction ãæ¬¡ã®èšäºã§äœããŸãã
ã«ãŒãã«ãå®è¡ãã
ã§ã¯ãç®ã§èŠãŠåããåŠçãè¡ãå®è¡å¯èœãã¡ã€ã«ãæã«å ¥ããã®ã§ãå®è¡ããŠã¿ãŸãããããŸããã³ã³ãã€ã«ããç§éã®ã«ãŒãã«ããããŒãããŒããŒãšãªã³ã¯ããããšã«ãã£ãŠããŒã¿ãã«ãã£ã¹ã¯ã€ã¡ãŒãžã«ããå¿ èŠããããŸãããããŠããã®ãã£ã¹ã¯ã€ã¡ãŒãžããQEMUããŒãã£ã«ãã·ã³å ããUSBã¡ã¢ãªã䜿ã£ãŠå®éã®ããŒããŠã§ã¢äžã§å®è¡ã§ããŸãã
ããŒãã€ã¡ãŒãžãäœã
ã³ã³ãã€ã«ãããç§éã®ã«ãŒãã«ãããŒã¿ãã«ãã£ã¹ã¯ã€ã¡ãŒãžã«å€ããã«ã¯ãããŒãããŒããŒãšãªã³ã¯ããå¿ èŠããããŸããèµ·åã®ããã»ã¹ã®ã»ã¯ã·ã§ã³ã§åŠãã ããã«ãããŒãããŒããŒã¯CPUãåæåãã«ãŒãã«ãããŒããã圹å²ããããŸãã
èªåã®ããŒãããŒããŒãæžããšãããã ãã§1ã€ã®ãããžã§ã¯ãã«ãªã£ãŠããŸãã®ã§ã代ããã«bootloaderã¯ã¬ãŒãã䜿ããŸãããããã®ã¯ã¬ãŒãã¯ãCã«äŸåãããRustãšã€ã³ã©ã€ã³ã¢ã»ã³ããªã ãã§åºæ¬çãªBIOSããŒãããŒããŒãå®è£
ããŠããŸããç§éã®ã«ãŒãã«ãèµ·åããããã«ãããäŸåé¢ä¿ã«è¿œå ããå¿
èŠããããŸãïŒ
# in Cargo.toml
[dependencies]
bootloader = "0.9.8"
bootloaderãäŸåãšããŠå ããããšã ãã§ããŒã¿ãã«ãã£ã¹ã¯ã€ã¡ãŒãžãå®éã«äœããããã§ã¯ãªããç§éã®ã«ãŒãã«ãã³ã³ãã€ã«åŸã«ããŒãããŒããŒã«ãªã³ã¯ããå¿ èŠããããŸããåé¡ã¯ãcargoããã«ãåŸã«ã¹ã¯ãªãããèµ°ãããæ©èœãæã£ãŠããªãããšã§ãã
ãã®åé¡ã解決ãããããç§éã¯bootimageãšããããŒã«ãäœããŸãããããã¯ããŸãã«ãŒãã«ãšããŒãããŒããŒãã³ã³ãã€ã«ãããããŠãããããªã³ã¯ããŠããŒã¿ãã«ãã£ã¹ã¯ã€ã¡ãŒãžãäœããŸãããã®ããŒã«ãã€ã³ã¹ããŒã«ããã«ã¯ã以äžã®ã³ãã³ããã¿ãŒããã«ã§å®è¡ããŠãã ããïŒ
cargo install bootimage
bootimageãå®è¡ãããŒãããŒãããã«ãããã«ã¯ãllvm-tools-previewãšããrustupã³ã³ããŒãã³ããã€ã³ã¹ããŒã«ããå¿
èŠããããŸããããã¯rustup component add llvm-tools-previewãšå®è¡ããããšã§ã§ããŸãã
bootimageãã€ã³ã¹ããŒã«ããllvm-tools-previewã远å ãããã以äžã®ããã«å®è¡ããããšã§ããŒã¿ãã«ãã£ã¹ã¯ã€ã¡ãŒãžãäœããŸãïŒ
> cargo bootimage
ãã®ããŒã«ãç§éã®ã«ãŒãã«ãcargo buildã䜿ã£ãŠåã³ã³ãã€ã«ããŠããããšãããããŸãããã®ãããããªãã®è¡ã£ã倿Žãèªåã§æ€ç¥ããŠãããŸãããã®åŸãbootloaderããã«ãããŸããããã«ã¯å°ãæéãããããããããŸãããä»ã®äŸåã¯ã¬ãŒããšåãããã«ããã«ãã¯äžåºŠããè¡ãããããã®éœåºŠãã£ãã·ã¥ãããã®ã§ã以éã®ãã«ãã¯ãã£ãšæ©ããªããŸããæçµçã«ãbootimageã¯bootloaderãšããªãã®ã«ãŒãã«ãåäœãããããŒã¿ãã«ãã£ã¹ã¯ã€ã¡ãŒãžã«ããŸãã
ãã®ã³ãã³ããå®è¡ããããtarget/x86_64-blog_os/debugãã£ã¬ã¯ããªå
ã«bootimage-blog_os.binãšããååã®ããŒã¿ãã«ãã£ã¹ã¯ã€ã¡ãŒãžãããã¯ãã§ãããããããŒãã£ã«ãã·ã³å
ã§èµ·åããŠãããã§ãããå®éã®ããŒããŠã§ã¢äžã§èµ·åããããã«USBã¡ã¢ãªã«ã³ããŒããŠãããã§ãããïŒãã ããããã¯CDã€ã¡ãŒãžã§ã¯ãããŸãããCDã€ã¡ãŒãžã¯ç°ãªããã©ãŒããããæã€ã®ã§ããããCDã«çŒããŠãããŸããããŸããïŒã
ã©ãããä»çµã¿ãªã®ïŒ
bootimageããŒã«ã¯ãè£ã§ä»¥äžã®ã¹ããããè¡ã£ãŠããŸãïŒ
- ç§éã®ã«ãŒãã«ãELFãã¡ã€ã«ã«ã³ã³ãã€ã«ããã
- äŸåã§ããbootloaderãã¹ã¿ã³ãã¢ãã³ã®å®è¡ãã¡ã€ã«ãšããŠã³ã³ãã€ã«ããã
- ã«ãŒãã«ã®ELFãã¡ã€ã«ã®ãã€ãåãããŒãããŒããŒã«ãªã³ã¯ããã
èµ·åæãããŒãããŒããŒã¯è¿œå ãããELFãã¡ã€ã«ãèªã¿ãè§£éããŸããæ¬¡ã«ããã°ã©ã éšãããŒãžããŒãã«ã®ä»®æ³ã¢ãã¬ã¹ã«ããããã.bsséšããŒãã«ããã¹ã¿ãã¯ãã»ããã¢ããããŸããæåŸã«ããšã³ããªãã€ã³ãã®ã¢ãã¬ã¹ïŒç§éã®_start颿°ïŒãèªã¿ãããã«ãžã£ã³ãããŸãã
QEMUã§èµ·åãã
ããã§ããã£ã¹ã¯ã€ã¡ãŒãžãä»®æ³ãã·ã³ã§èµ·åã§ããŸããQEMUã䜿ã£ãŠãããèµ·åããã«ã¯ã以äžã®ã³ãã³ããå®è¡ããŠãã ããïŒ
> qemu-system-x86_64 -drive format=raw,file=target/x86_64-blog_os/debug/bootimage-blog_os.bin
warning: TCG doesn't support requested feature: CPUID.01H:ECX.vmx [bit 5]
ããã«ããã以äžã®ãããªèŠãç®ã®å¥ã®ãŠã£ã³ããŠãéããŸãïŒ
ç§éã®æžãã"Hello World!"ãç»é¢ã«èŠããŸããã
å®éã®ãã·ã³
USBã¡ã¢ãªã«ãããæžã蟌ãã§å®éã®ãã·ã³äžã§èµ·åããããšãå¯èœã§ãïŒ
> dd if=target/x86_64-blog_os/debug/bootimage-blog_os.bin of=/dev/sdX && sync
sdXã¯ããªãã®USBã¡ã¢ãªã®ããã€ã¹åã§ãããã®ããã€ã¹äžã®ãã¹ãŠã®ããŒã¿ãäžæžããããŠããŸãã®ã§ã æ£ããããã€ã¹åãéžãã§ããã®ããã確èªããŠãã ãã ã
ã€ã¡ãŒãžãUSBã¡ã¢ãªã«æžã蟌ãã ããšã¯ãããããèµ·åããããšã«ãã£ãŠå®éã®ããŒããŠã§ã¢äžã§èµ°ãããããšãã§ããŸããç¹æ®ãªããŒãã¡ãã¥ãŒã䜿ã£ãããBIOSèšå®ã§èµ·åæã®åªå
é äœãå€ããUSBã¡ã¢ãªããèµ·åããããšãéžæããå¿
èŠãããã§ãããããã ããbootloaderã¯ã¬ãŒãã¯UEFIããµããŒãããŠããªãã®ã§ãUEFIãã·ã³äžã§ã¯ããŸãåäœããªããšããããšã«æ³šæããŠãã ããã
cargo runã䜿ã
QEMUäžã§ããç°¡åã«ç§éã®ã«ãŒãã«ãèµ°ãããããã«ãcargoã®runnerèšå®ã䜿ããŸãã
# in .cargo/config.toml
[target.'cfg(target_os = "none")']
runner = "bootimage runner"
target.'cfg(target_os = "none")'ããŒãã«ã¯ã"os"ãã£ãŒã«ãã"none"ã§ãããããªãã¹ãŠã®ã¿ãŒã²ããã«é©çšãããŸããç§éã®x86_64-blog_os.jsonã¿ãŒã²ããããã®1ã€ã§ããrunnerããŒã¯cargo runã®ãšãã«åŒã°ããã³ãã³ããæå®ããŠããŸãããã®ã³ãã³ãã¯ããã«ããæåããåŸã«ãå®è¡å¯èœãã¡ã€ã«ã®ãã¹ã第äžåŒæ°ãšããŠå®è¡ãããŸãã詳ããã¯ãcargoã®ããã¥ã¡ã³ããèªãã§ãã ããã
bootimage runnerã³ãã³ãã¯ãrunnerããŒãšããŠå®è¡ããããã«èšèšãããŠããŸãããã®ã³ãã³ãã¯ãäžããããå®è¡ãã¡ã€ã«ããããžã§ã¯ãã®äŸåããbootloaderãšãªã³ã¯ããŠãQEMUãç«ã¡äžããŸãããã詳ããç¥ããããšãããèšå®ãªãã·ã§ã³ã«ã€ããŠã¯bootimageã®Readmeãèªãã§ãã ããã
ããã§ãcargo runã䜿ã£ãŠã«ãŒãã«ãã³ã³ãã€ã«ãQEMUå
ã§èµ·åããããšãã§ããŸãã
次ã¯ïŒ
次ã®èšäºã§ã¯ãVGAããã¹ããããã¡ããã詳ããåŠã³ããã®ããã®å®å
šãªã€ã³ã¿ãŒãã§ãŒã¹ãæžããŸãããŸããprintlnãã¯ãã®ãµããŒããè¡ããŸãã

