
ãã®ããŒãã§ã¯ããäžå¯èœããå®è¡ããŸãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãªãã§ã°ã©ãã£ãã¯ãã£ã¹ãã¬ã€ã䜿çšããæ¹æ³ãåŠç¿ããŸãã å®éãããã¯ç¹ã«32ãããä¿è·ã¢ãŒãã§äœæ¥ããŠããå Žåãç¹ã«320x200x8ã§ã¯ãªããŸãšããªç»é¢è§£å床ã䜿çšããå Žåã¯ç°¡åãªäœæ¥ã§ã¯ãããŸããã ãããããŸãæåã«ãã°ã©ãã£ãã¯ãå¿ èŠãªå Žåã¯ããããªã«ãŒãã䜿çšããå¿ èŠããããŸãã
ææ°ã®ã°ã©ãã£ãã¯ã¹ã«ãŒãã¯ãäž»ãªãã®ããå£ãããšã®ãªãå®è³ªçã«æ¬æ Œçãªã³ã³ãã¥ãŒã¿ãŒã§ããããã§ã¯ãMPEG2ã1080pãšããŠãã³ãŒããã3Dã°ã©ãã£ãã¯ã¹ãšã·ã§ãŒããŒã®ãµããŒããCUDAãªã©ã®ãã¯ãããžãŒãªã©ãåããŠããŸãã ããã¯ãã¹ãŠéåžžã«è€éã«èŠããŸãã äžæ¹ããããªã«ãŒãã¯ä»ã®PCIããã€ã¹ãšåããã®ã§ãã ããã€ã¹ã¯ã©ã¹çªå·0x03ïŒclass_name = graphics adapterïŒã® 以åã®èšäºã§ããã®ããã€ã¹ããçºèŠãããŸããã ä»ã®ããã€ã¹ãšåæ§ã«ãI / OããŒããŸãã¯MMIOã¡ã¢ãªé åã䜿çšããŠãããªã«ãŒããæäœã§ãããããªã«ãŒãèªäœã¯DMAããã³å²ã蟌ã¿ã䜿çšããŠã¡ã€ã³ããã»ããµãšå¯Ÿè©±ã§ããŸãã ãããªã«ãŒãã§äœ¿çšã§ããå ¥åºåããŒãã®ç¯å²ãèŠããšãåèš50ãã€ãæªæºãå²ãåœãŠãããŠããããšãããããŸããææ°ã®ãããªã«ãŒããæã€èšå€§ãªæ©èœãããŸãèæ ®ããŠããŸããã

VGAèŠæ Œã«ããã°ããããªã«ãŒããæäœããããã« ã 0x03B0-0x03BBãš0x3C0-0x3DFã® 2ã€ã®ç¯å²ã®åºåå ¥åããŒãã䜿çšãããŸãã ãããã®ç¯å²ã«å ããŠãã¡ã€ã³ã¡ã¢ãªã«è¡šç€ºããããããªã¡ã¢ãªã®ç¯å²ïŒ 0xA0000-0xBFFFF ïŒããããŸãã

ãããªã¡ã¢ãªã¯ãã°ã©ãã£ãã¯ç»é¢ãéåžžã®ã¡ã¢ãªåœ¢åŒã§è¡šãããã®ã§ãã ç»é¢ã«ãã¯ã»ã«ãŸãã¯æåãæç»ããã«ã¯ããã®ã¡ã¢ãªç¯å²ã«ãã€ããæžã蟌ãå¿ èŠãããããšãããããŸãã
ææ°ã®ãããªã«ãŒããæºæ ããŠããæšæºãããããããã®æšæºã䜿çšãããšãå®è£ ã®è©³çŽ°ã«å ¥ããã«ãããªã«ãŒãã䜿çšã§ããããšãæåŸ ãããŸãã
æ®å¿µãªããšã«ãVGAã¯å€ãæšæºã§ãããçŸä»£ã®æšæºã§ã¯å°ããªç»é¢è§£å床ã®ã·ã³ãã«ãªã°ã©ãã£ãã¯ãã£ã¹ãã¬ã€ã䜿çšããããã«èšèšãããŠããŸãã ãã®æšæºã§ã¯ãæ°åçš®é¡ã®ç°ãªãã°ã©ãã£ãã¯ã¢ãŒããšããã¹ãã¢ãŒããå®çŸ©ãããŠããŸãïŒ ããã§ãã¹ãŠãåç §ã§ããŸã ïŒãæããã¯ãŒã«ãªãã¢ãŒãã¯ã256è²ã§320x200ã16è²ã§640x480ã§ãã ããã«ãæšæºã«ã¯ã¢ãŒãåãæ¿ãæ©èœãšãã¬ãããæäœããããã®æ©èœã®ã¿ãå«ãŸããŠããŸãã ããããéåžžã®ç»é¢è§£å床ã¯ã©ãã§ããïŒ1920x1080 24ãããããããšãå°ãªããšã800x600 24ãããã§ããïŒ MPEG2ã°ã©ãã£ãã¯ã¹ã®ãµããŒãã¯ã©ãã«ãããŸããïŒ 3Dã°ã©ãã£ãã¯ã¹ã¯ã©ãã«ãããŸããïŒ VGAæšæºã¯ãµããŒãããŠããŸããã ã°ã©ãã£ãã¯ã¢ãŒãã«ã€ããŠã¯ãåŸã§èª¬æããBIOS VBEæ¡åŒµæ©èœãéããŠå®è¡ãããSVGAæšæºã®äžéšã§ãããšèšããŸãã ãŸãã3DãMPEG2ãCUDAãããã³ãã®ä»ã®ãã¡ãã·ã§ããã«ãªãããã¯ãåãããªã«ãŒãã¡ãŒã«ãŒã«ãã£ãŠç¬èªã®æ¹æ³ã§ãµããŒããããŠããŸãã å€ããã£ã¹ãã¬ã€ã®èšç®ã«å ããŠãVGAæšæºã®640x480ã®æ倧ç»é¢è§£å床ã¯ããããªã¡ã¢ãªã®ãµã€ãºã«ãã£ãŠæ±ºãŸããŸãïŒããã128ãããã€ãïŒé«è§£å床ã§äœæ¥ããã«ã¯ã1920x1080 24ããã-ããã¯6Mb以äžã§ãïŒã ãããã£ãŠããããªã¡ã¢ãªã®åºãé åãå¿ èŠã§ãããææ°ã®ãããªã«ãŒãã«ã¯æ¬¡ã®é åããããŸãã

äžèšã®ç¯å²ã®1ã€ã¯ããªãã¢ãã¬ãŒã ãããã¡ïŒLFBïŒ-ãããªã¡ã¢ãªãšããŠã䜿çšãããŸãã 2çªç®ã®ã¢ãã¬ã¹ç¯å²ã¯ããããªã«ãŒãã®æ§æã«äœ¿çšãããæ°çŸã®ã¬ãžã¹ã¿ãšããããã£ãŒã«ãã衚瀺ããããã«äœ¿çšãããŸãã ããã«ãäžé£ã®ã¬ãžã¹ã¿ãšãããã®æäœæ¹æ³ã¯ããããªã«ãŒãã®åã¡ãŒã«ãŒã ãã§ãªããåãã¡ãŒã«ãŒã®ã·ãªãŒãºãã¢ãã«éã§ãå€§å¹ ã«ç°ãªãå¯èœæ§ããããCUDAãMPEG2ã3Dãªã©ã®æäœãä¿èšŒããããã«å¿ èŠã§ãã Linuxãã©ã€ããŒã¯8ã¡ã¬ãã€ã以äžãå æããŸãã

ãããŠãããã«ã¡ãŒã«ãŒã®1人ã®ããã®ãããªã«ãŒããã©ã€ããŒã®äŸããããŸãïŒ

æ®ãã«ã¯ããã«å€ãã®ã³ãŒããå«ãŸããŠãããããã«ã¯ãã©ã€ããŒã§äœ¿çšãããLinuxã®è¿œå ã©ã€ãã©ãªããããŸããã
ãã®ããã3DãŸãã¯ã¹ããªãŒãã³ã°ãããªã®ãµããŒããæäŸããã«ã¯ãå€ãã®äœæ¥ãå¿ èŠã§ãã ããšããã«ããããã«ãããããªããããã䜿ãå¥ã®äººçãæã£ãŠãããªãã...
ãã ãããã®èšäºã§ã¯ãé©åãªã°ã©ãã£ãã¯ã¢ãŒãããªã³ã«ããŠããã®äžã«çŸãããã®ïŒããšãã°ããã©ã¯ã¿ã«ïŒãæç»ããããšã«çŠç¹ãåœãŠãŸãã ãããã©ãã»ã©ç°¡åãèŠãŠã¿ãŸãããã
ãŸããé©åãªã°ã©ãã£ãã¯ã¢ãŒãã¯SVGAæšæºã§ãããVBE BIOS ExtensionïŒVESA BIOS ExtensionïŒãä»ããŠå«ããããšãã§ããŸãã VBEã¯ãã³ãŒãããããªã«ãŒãèªäœã«ããBIOSæ¡åŒµæ©èœã§ãããããã䜿çšããŠäœæ¥ã§ããŸãã VBEæ¡åŒµæšæºã«ã¯ã䜿çšã§ããããã€ãã®æ©èœãå«ãŸããŠããŸãã
1.ã°ã©ãã£ãã¯ããã€ã¹ã«é¢ããæ å ±ãååŸããŸãã VESAã¯ãµããŒããããŠããŸããããããªã«ãŒãã®ãããªã¡ã¢ãªã®éãªã©ã
2.ã¢ãŒãçªå·ã«ããæ å ±ã®ååŸïŒç»é¢è§£å床ãLFBãžã®ãã€ã³ã¿ãŒãããã³ãããã
3.çªå·ã§ãããªã¢ãŒãããªã³ã«ããŸãã
4.éè¡çªå·ããšã«ãããªã¢ãŒãã®éè¡ããªã³ã«ããŸãããããã«ã€ããŠã¯ã以äžãåç §ããŠãã ããã
5.ãã¬ããã®å¶åŸ¡ãªã©ã8ãããã¢ãŒãã«å¿ èŠãªãã®ä»ã®æ©èœã
å®å šãªä»æ§ã«ã€ããŠã¯ã ãã¡ããã芧ãã ãã ã äœæ¥å 容ã«ã€ããŠç°¡åã«èª¬æããŸãã
ãããªã«ãŒãã§ãµããŒãããããã¹ãŠã®ã¢ãŒãã«ã¯ã0x000ãã0x1FFã®é ã«çªå·ãä»ããããŸãã ãã¹ãŠã®æ°å€ãããžãŒã§ããããã§ã¯ãªãã0x100以éã®ãã¹ãŠã®æ°å€ãæšæºã§æ£ç¢ºãªç»é¢è§£å床å€ãæã£ãŠããããã§ã¯ãããŸããããããã£ãŠãå¿ èŠãªç»é¢è§£å床ã«ãã£ãŠãæ°å€ãèŠã€ããå¿ èŠããããŸãã 0x100ãŸã§ã®ã¢ãŒãçªå·ã¯VGAèŠæ Œã§å®çŸ©ãããŠãããå®å šã«äžè²«ããŠããŸãã LFB-ãªãã¢ãã¬ãŒã ãããã¡ãŒãããã¯ã倧ç»é¢è§£å床çšã«èšèšããããããªã¡ã¢ãªã®é åã§ãïŒéåžžãRAMã®å€åŽã«ãããŸãããæ倧4GBïŒã
LFBã䜿çšããªãå Žåã0xA0000ã0xC0000ã®æšæºãããªã¡ã¢ãªé åããã¹ãŠã®ã°ã©ãã£ãã¯ã¢ãŒãã§äœ¿çšãããŸãã ãã®å Žåããéè¡ãã¢ãŒãã䜿çšãããŸãã ç»é¢å šäœãçªå·ä»ãã®éšåïŒãã³ã¯ïŒã«åå²ãããåç¬éã«ããããªã¡ã¢ãªé åã¯ãã®ãããªéšåã®1ã€ãæããŸãã ã€ãŸããç»é¢ã«ãã¯ã»ã«ãæç»ããåã«ããã³ã¯çªå·ãèšå®ããŠããããããªã¡ã¢ãªãåç §ããŠãã¯ã»ã«ãæç»ããå¿ èŠããããŸãã ãããã£ãŠãåãã¡ã¢ãªé åãåå©çšããŠããã£ã¹ãã¬ã€äžã®ç°ãªãé åãæäœã§ããŸãã

LFBã®äœ¿çšã¯ãäœãåãæ¿ããå¿ èŠããªãããã£ã¹ãã¬ã€å šäœãLFBå šäœã«è¡šç€ºããããããããã·ã³ãã«ã§é«éã§ãã LFBã®ãããªã¡ã¢ãªã¯ç·åœ¢ã«æ§æãããŠããŸãããã¯ã»ã«ã®ã«ãŠã³ãã¯ãç»é¢ã®å·Šäžé ããè¡ããšã«éå§ãããŸãã åãã¯ã»ã«ã¯ãçŸåšã®ã°ã©ãã£ãã¯ã¢ãŒãã®ãããæ°ã«å¿ããŠã1ã2ã3ããŸãã¯4ãã€ãã§è¡šãããŸãã ãã€ãã¯è¡ã«é 眮ããããã¯ã»ã«ã®è²ã¯ãããã«ãšã³ã³ãŒããããŸãã æãåçŽã§é©åãªã¢ãŒãã¯ã32ããããš24ãããïŒ3ãã€ããš4ãã€ãïŒã§ãã ãããã®ã¢ãŒãã§ã¯ãåã«ã©ãŒãã£ãã«ïŒèµ€ãç·ãéïŒã¯1ãã€ãç®ã§è¡šãããŸãã 32ãããã¢ãŒãã§ã¯ãå¥ã®ãã€ããäºçŽãããŠäœ¿çšãããŸããïŒã¢ã©ã€ã¡ã³ãã«äœ¿çšãããŠãããšèšããŸãïŒã LFBã®å¥ã®æ©èœïŒæšæºã«åŸã£ãŠãã¢ãŒãçªå·ã§LFBãæå¹ã«ããã«ã¯ããã1ããããèšå®ããå¿ èŠããããŸãïŒmode_number | 0x4000ã

ãããã£ãŠãæ©èœçªå·2ïŒäžèšã®ãªã¹ãïŒã䜿çšãããšãLFBã§ã¢ãŒãçªå·ãèŠã€ããæ©èœçªå·3ã§æå¹ã«ããããšãã§ããŸãããã®åŸãLFBãããã¡ãŒã®ç®çã®ãªãã»ããã§RGBå€ã®ãã€ããæžã蟌ãã ãã§ç»é¢ã«æç»ã§ããŸãã
ãããŸã§ã®ãšããããã¹ãŠãææã«èŠããŸãããVBEã¯BIOSæ¡åŒµæ©èœã§ãããç¹å®ã®BIOSæ©èœïŒãã®å Žåã¯10hïŒãåŠçãããªã¢ã«ã¢ãŒãçšã®16ãããã³ãŒãã§ãã 以åã®èšäºã§åãåã£ããããªãã¿ã®32ãããä¿è·ã¢ãŒãããVBEïŒ16ããããªã¢ã«ã¢ãŒãïŒã䜿çšããå¿ èŠãããããšãããããŸããã ãããè¡ãã«ã¯3ã€ã®æ¹æ³ããããŸãã
1.ãªã¢ã«ã¢ãŒãã«åãæ¿ããå¿ èŠãªã¢ã¯ã·ã§ã³ãå®è¡ããä¿è·ã¢ãŒãã«æ»ããŸãã ããã»ããµã®ç¶æ ãä¿åããããã«ãã¢ãŒãéã§é·ç§»é¢æ°ãèšè¿°ããå¿ èŠããããŸãããäžè¬çãªå Žåãå²ã蟌ã¿ãæ£ããåŠçããå¿ èŠããããŸãã
2.ä¿è·ã¢ãŒããã16ãããã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠVBEæ¡åŒµæ©èœã䜿çšããŸãã ãããè¡ãã«ã¯ãèšè¿°åããŒãã«ãæ§æããã³ãŒã«ã²ãŒããäœæãã16ãããã³ãŒããã³ã³ãã€ã«ããVBEæšæºã«åŸã£ãŠå¥ã®è¿œå æ§é ãæ§æããå¿ èŠããããŸãã ãŸããããŸã䟿å©ã§ã¯ãªãããã¹ãŠã®ãããªã«ãŒãããã®æ¡åŒµæ©èœããµããŒãããŠããããã§ã¯ãããŸããã
3.ä¿è·ã¢ãŒãã§åäœãã16ããããªã¢ã«ã¢ãŒããšãã¥ã¬ãŒã¿ã䜿çšããŸãã ãã®ãšãã¥ã¬ãŒã¿ã®å¯äžã®å¶éã¯ããããªã«ãŒãèªäœã®å²ã蟌ã¿ãã³ãã©ãäœæããã®ãé£ããããšã§ãããVBEã®ãã¹ãŠã®æ©èœã¯ãããªã«ãŒãã®å²ã蟌ã¿ã䜿çšããªããããå¿ èŠãããŸããã
3çªç®ã®æ¹æ³ã¯æãç°¡åã«èŠããŸããããã¯ãæ¢è£œã®x86emuãšãã¥ã¬ãŒã¿ãŒïŒåçŽã§ç§»æ€æ§ãé«ãïŒã䜿çšããŠVBEé¢æ°ãåŒã³åºãããã«äœ¿çšã§ããããã§ãã
ãã¡ãããäœæ¥ããå¿ èŠããããŸãããæ¯èŒçå°æ°ã®ã¢ã¯ã·ã§ã³çšã®ããã°ã©ã ãæ§ç¯ã§ããŸããããã¯ãææ°ã®ãããªã«ãŒãã§ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãªãã§ã°ã©ãã£ãã¯ã¢ãŒãããªã³ã«ããŠãã©ã¯ã¿ã«ãæç»ã§ããŸãã ãããŸã§ã®ãšãããã·ã§ãŒããŒãš3Dã¯ãããŸããããã°ã©ãã£ãã¯ã¯ãããŸãã
ïŒ éèŠïŒ ïŒãã以éã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯ãèšäºããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãªãã§ããã°ã©ã ãå®è¡ããæ¹æ³ãã®æåã®éšåãã6ã€ã®ã¹ãããããã¹ãŠæ£åžžã«å®äºããåŸã«ã®ã¿æ£åžžã«å®è¡ã§ããŸãã
ç§ãã¡ã®èšç»ïŒ
1. x86emuããã³ãã©ã¯ã¿ã«æç»ã«å¿ èŠãªããã€ãã®äžè¬çãªé¢æ°ãè¿œå ããŸãã
2.ããŒãx86emuã
3. VBEãæäœããããã®é¢æ°ãããã€ãäœæããŸãã
4.ãã©ã¯ã¿ã«æç»é¢æ°ãäœæããŸãã
5.ãã¹ãŠãçµã¿åãããŠå®è¡ããŸãã
å§ããŸãããã
æé 1. commonãæšæºæ©èœã§è£å®ããŸãã
æåã«ã64ãããæ°å€ãæäœããããã®ããã€ãã®é¢æ°ãè¿œå ããå¿ èŠããããŸãã Gccã¯x86emuãã³ã³ãã€ã«ããããã«ããããå¿ èŠãšããŸãã
1.次ã®ãã¡ã€ã«ãå ±éãã©ã«ããŒã«è¿œå ããŸãïŒ udivdi3.c ã umoddi3.c ã moddi3.c ã qdivrem.c ã divdi3.c ã ããã§åãããšãã§ããŸã ã
2.次ã«ãå«ããå¥ã®quad.hãã¡ã€ã«ãè¿œå ããå¿ èŠããããŸãã ãŸãã www.openbsd.org / cgi-bin / cvsweb / src / lib / libc / quadããååŸããããšãã§ããŸãã 次ã®è¡ã眮ãæããå¿ èŠããããŸãã
#include <sys/types.h> #if !defined(_KERNEL) && !defined(_STANDALONE) #include <limits.h> #else #include <sys/limits.h> #endif
è¡ããšïŒ
#include âtypes.hâ
3.次ã«ã newlibã©ã€ãã©ãªãŒãããŠã³ããŒãããŸãããããã¯å¥ã®æ©èœã«å¿ èŠã§ãã ã©ã€ãã©ãªã®ãœãŒã¹ããããã¡ã€ã«newlib-2.0.0 \ newlib \ libm \ math \ s_floor.cãå ±éãã©ã«ããŒã«ã³ããŒããå¿ èŠããããŸãã ãã®äžã§æ¬¡ã®è¡ã眮ãæããŸãïŒ
#include "fdlibm.h"
è¡ããšïŒ
#include "types.h"
4.ãŸãã setjmp / longjmpé¢æ°ãè¿œå ããå¿ èŠããããŸãã x86emuãšãã¥ã¬ãŒã¿ãŒã¯ãããã®é¢æ°ã䜿çšããŠãšã©ãŒãåŠçããŸãã ãããã®é¢æ°ã®å®è£ ã以äžã«ç€ºããŸã; newlibããã®å®è£ ã«åºã¥ããŠäœæãããŸããããå°ãåçŽåãããŠããŸãã ãã®é¢æ°ã䜿çšãããšãããã»ããµã®ç¶æ ãä¿åããŠãã埩å ã§ããŸãã åºæ¬çã«ãC ++äŸå€ã®æåå®è£ ã«äŒŒãŠããŸãã ãããã®é¢æ°ãã³ãŒãã«è¡šç€ºããã«ã¯ã次ã®ã³ã³ãã³ãïŒå°ãåçŽãªã¢ã»ã³ãã©ãŒïŒãšå ±éã®setjmp.sãã¡ã€ã«ãäœæããå¿ èŠããããŸãã
.globl setjmp setjmp: movl 4(%esp),%ecx movl 4(%ebp), %edx movl %edx, 0(%ecx) movl %ebx, 4(%ecx) addl $4,%ebp movl %ebp, 8(%ecx) subl $4,%ebp movl (%ebp),%edx movl %edx,12(%ecx) movl %esi,16(%ecx) movl %edi,20(%ecx) movl %eax,24(%ecx) xorl %eax,%eax ret .globl longjmp longjmp: movl 4(%esp),%edx movl 8(%esp),%eax movl 0(%edx),%ecx movl 4(%edx),%ebx movl 8(%edx),%esp movl 12(%edx),%ebp movl 16(%edx),%esi movl 20(%edx),%edi testl %eax,%eax jnz 1f incl %eax 1: movl %ecx,0(%esp) ret
ã¢ã»ã³ãã©ã³ãŒãã¯ãç¹å®ã®é åºã§ã¬ãžã¹ã¿ãåçŽã«ä¿åããŠãã埩å ããŸãã
5.ããã§ãCã®é¢æ°ã宣èšããå¿ èŠããããŸãããããè¡ãã«ã¯ãã€ã³ã¯ã«ãŒãã«æ¬¡ã®å 容ã®setjmp.hãã¡ã€ã«ãäœæããŸãã
#ifndef _SETJMP_H_ #define _SETJMP_H_ #define _JBLEN 10 typedef long jmp_buf[_JBLEN]; #ifdef __cplusplus extern "C" { #endif int setjmp (jmp_buf); void longjmp (jmp_buf, int); #ifdef __cplusplus } #endif #endif
6.å¿ èŠãšããããã1ã€ã®éèŠãªé¢æ°ã»ããã¯ãæååãšã¡ã¢ãªïŒmemsetãstrlenãªã©ïŒãæäœããé¢æ°ã§ãã ãããã®é¢æ°ã¯bitvisorããæºåã§ããŸãã®ã§ããã®ãã€ããŒãã€ã¶ãŒã®ãœãŒã¹ã³ãŒããããŠã³ããŒãããå¿ èŠããããŸãã ãããã®ãœãŒã¹ããããã¡ã€ã«c ore \ string.sãcommonã«ã³ããŒããŸãã ãã®äžã§æ¬¡ã®è¡ã眮ãæããŸãïŒ
.include "longmode.h"
è¡ããšïŒ
l
ongmode = 0
7.次ã«ã include \ core \ string.hãã¡ã€ã«ãã³ããŒããŠã bitvisorããã€ã³ã¯ã«ãŒãããå¿ èŠããããŸãã ãã®äžã§ã次ã®è¡ã眮ãæããŸãã
#include <core/types.h>
è¡ããšïŒ
#include "types.h"
8.æåŸã«å¿ èŠãªããšã¯ãå ¥åºåããŒããæäœããæ©èœã§ãã ãããè¡ãã«ã¯ã io.hãã¡ã€ã«ãincludeãã£ã¬ã¯ããªã«è¿œå ããŸããããã¯ãå€æŽããã«åãbitvisorãããžã§ã¯ãããååŸã§ããŸãïŒãããžã§ã¯ããœãŒã¹ã§ã¯include \ io.hã«ãããŸãïŒã
9.ãã¹ãŠãã³ããŒããã«ã¯ãinclude \ types.hã®å 容ã次ã®ãã®ã«çœ®ãæããŸãã
#ifndef _TYPES_H #define _TYPES_H #define NULL 0 typedef unsigned int size_t; typedef unsigned long ulong; typedef unsigned long u32; typedef unsigned short u16; typedef unsigned char u8; typedef unsigned long long uint64_t; typedef unsigned long long u_int64_t; typedef unsigned long uint32_t; typedef unsigned long u_int32_t; typedef unsigned short uint16_t; typedef unsigned short u_int16_t; typedef unsigned char uint8_t; typedef unsigned char u_int8_t; typedef long __int32_t; typedef unsigned long __uint32_t; typedef unsigned long long u_quad_t; /* quads */ typedef long long quad_t; typedef quad_t * qaddr_t; typedef unsigned long u_int; typedef unsigned long uint; typedef long long int64_t; typedef long int32_t; typedef short int16_t; typedef char int8_t; #define _QUAD_HIGHWORD 1 #define _QUAD_LOWWORD 0 #define __BEGIN_DECLS #define __END_DECLS #define __dead #define __far #define __HI(x) *(1+(int*)&x) #define __LO(x) *(int*)&x #define __P(a) a #define CHAR_BIT 8 /* max # of bits in a "char" */ #define EXTRACT_WORDS(i0, i1, x) \ i0 = __HI(x); \ i1 = __LO(x); #define INSERT_WORDS(x, i0, i1) \ __HI(x) = i0; \ __LO(x) = i1; #define _BEGIN_STD_C #define _END_STD_C #define _EXFUN(a,b) ab #endif
ãããã®å€æŽã¯ã䜿çšããããµãŒãããŒãã£ã®ãœãŒã¹ã§å¿ èŠãªã¿ã€ããšãã¯ãã®æ°ã決å®ããããã«å¿ èŠã§ãã ã³ãŒããããããããã«ããã¹ãŠã®å®çŸ©ã¯ç°¡åã§ãã
ã¹ããã2. x86emuã®ç§»æ€
X86emuã¯FreeBSDã®äžéšãªã®ã§ãããããå ¥æããŠå°ãæ¹è¯ããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãã«ãŒãã«x86emuãã£ã¬ã¯ããªãäœæãã http ïŒ //svnweb.freebsd.org/base/vendor-sys/x86emu/dist /ãã次ã®ãã¡ã€ã«ããã®ãã©ã«ããŒã«ã³ããŒããŸãïŒ x86emu.cãx86emu.hãx86emu_regs.hãx86emu_utilã c ã
次ã«ããããã®ãœãŒã¹ã«ããã€ãã®å€æŽãå ããå¿ èŠããããŸãã
1. x86emu \ x86emu.cãã¡ã€ã«ã§ã次ã®è¡ã眮ãæããŸãã
#include <dev/x86emu/x86emu.h> #include <dev/x86emu/x86emu_regs.h>
è¡ããšïŒ
#include "x86emu.h" #include "x86emu_regs.h"
2. x86emu \ x86emu.hãã¡ã€ã«ã§ ã次ã®è¡ã眮ãæããŸã ã
#include <sys/types.h> #include <sys/endian.h> #ifdef _KERNEL #include <sys/systm.h> #else #include <setjmp.h> #endif
è¡ããš
#include "types.h" #include "setjmp.h"
3. x86emu \ x86emu_util.cãã¡ã€ã«ã§ ã次ã®è¡ã眮ãæããŸã ã
#include <sys/param.h> #include <sys/endian.h> #include <dev/x86emu/x86emu.h> #include <dev/x86emu/x86emu_regs.h>
è¡ããšïŒ
#include "x86emu.h" #include "x86emu_regs.h" #include "Io.h" #define htole16(x) ((uint16_t)(x)) #define htole32(x) ((uint32_t)(x)) #define letoh16(x) ((uint16_t)(x)) #define letoh32(x) ((uint32_t)(x))
4.次ã«ãx86emu_init_defaulté¢æ°ã®åã«ã x86emu \ x86emu_util.cãã¡ã€ã«ã«ããã€ãã®é¢æ°ãè¿œå ããå¿ èŠããããŸãã
static uint8_t x86emu_inb(struct x86emu *emu, uint16_t port) { uint8_t val = 0; in8(port, &val); return val; } static void x86emu_outb(struct x86emu *emu, uint16_t port, uint8_t data) { out8(port, data); } static uint16_t x86emu_inw(struct x86emu *emu, uint16_t port) { uint16_t val = 0; in16(port, &val); return val; } static void x86emu_outw(struct x86emu *emu, uint16_t port, uint16_t data) { out16(port, data); } static uint32_t x86emu_inl(struct x86emu *emu, uint16_t port) { uint32_t val = 0; in32(port, &val); return val; } static void x86emu_outl(struct x86emu *emu, uint16_t port, uint32_t data) { out32(port, data); }
ãããã®é¢æ°ã¯ãå ¥åºåããŒãã«ã¢ã¯ã»ã¹ããé¢æ°ã®ã©ãããŒã§ãã
5. x86emu_init_defaulté¢æ°èªäœã«ã次ã®å®çŸ©ãè¿œå ããŸãã
emu->emu_inb = x86emu_inb; emu->emu_inw = x86emu_inw; emu->emu_inl = x86emu_inl; emu->emu_outb = x86emu_outb; emu->emu_outw = x86emu_outw; emu->emu_outl = x86emu_outl;
ãããªã«ãŒãã¯ããã€ã¹ã§ãããVBEã¯ä»¥åã«å®çŸ©ãããæ©èœã䜿çšããŠå ¥å/åºåããŒããä»ããŠåäœããããããšãã¥ã¬ãŒã¿ã«ãã®å¯çšæ§ã«ã€ããŠéç¥ããå¿ èŠããããŸãã
æé 3. BIOSã§åäœããæ©èœãè¿œå ããŸãã
ããã§ãx86emuãä»ããŠVBE BIOSæ©èœã䜿çšã§ããŸãã BIOSãžã®èŠæ±ãçŽæ¥å®è¡ããããã€ãã®æ©èœãäœæããããšã¯æ®ã£ãŠããŸãã ãããè¡ãã«ã¯ãå ±éãã©ã«ããŒã«æ¬¡ã®å 容ã®bios.cãã¡ã€ã«ãäœæããŸãã
#include "types.h" #include "bios.h" #include "x86emu.h" struct x86emu emulator; void VBE_BiosInit(void) { memset(&emulator, 0, sizeof(emulator)); x86emu_init_default(&emulator); emulator.mem_base = (char *)0; emulator.mem_size = BIOS_SIZE; } void VBE_BiosInterrupt( BIOS_REGS *p_regs, u8 num ) { memcpy(&(emulator.x86), p_regs, sizeof(BIOS_REGS)); x86emu_exec_intr(&emulator, num); memcpy(p_regs, &(emulator.x86), sizeof(BIOS_REGS)); }
ãŸããã€ã³ã¯ã«ãŒããã©ã«ããŒã«ã¯ã次ã®å 容ã®bios.hãã¡ã€ã«ããããŸãã
#ifndef _BIOS_H #define _BIOS_H #define BIOS_SIZE 0x100000 #define BIOS_HIGH_BASE 0xC0000 #define BIOS_HIGH_SIZE (0x100000 - 0xC0000) #define BIOS_BDA_BASE 0x9fc00 #define BIOS_BDA_SIZE 0x400 #define VBE_BIOS_INFO_OFFSET 0x70000 #define VBE_BIOS_MODE_INFO_OFFSET 0x80000 typedef struct _BIOS_REGS { u16 CS; u16 DS; u16 ES; u16 FS; u16 GS; u16 SS; u32 EFLAGS; u32 EAX; u32 EBX; u32 ECX; u32 EDX; u32 ESP; u32 EBP; u32 ESI; u32 EDI; u32 EIP; } BIOS_REGS; void VBE_BiosInit(void); void VBE_BiosInterrupt( BIOS_REGS *p_regs, u8 num ); #endif
ãããã£ãŠãäœæ¥ã®éå§æã«åŒã³åºãå¿ èŠãããbiosïŒVBE_BiosInitïŒã§äœæ¥ãåæåããé¢æ°ãšãbiosãåŒã³åºãé¢æ°ïŒVBE_BiosInterruptïŒãå®çŸ©ããŸããã åŸè ã®ååã¯ãBIOSæ©èœããªã¢ã«ã¢ãŒãã§åŒã³åºãããã®ã¯intïŒå²ã蟌ã¿ïŒåœä»€ãä»ããŠãããšããäºå®ã«åºã¥ããŠããŸãã ãã®é¢æ°ã䜿çšãããšãæšæºã«åŸã£ãŠVBEé¢æ°ãåŒã³åºãããšãã§ããŸãã å²ã蟌ã¿ãåŒã³åºãã«ã¯ãæ§é äœã«ããã»ããµã®ç¶æ ãå ¥åãããšãã¥ã¬ãŒã¿ãŒãåŒã³åºãå¿ èŠããããŸãã ãšãã¥ã¬ãŒã¿ã¯ãIVTããŒãã«ã®ã³ãŒããšBIOSã³ãŒãèªäœã®ãã³ãŒããšãšãã¥ã¬ãŒããéå§ããŸãã ã€ã³ã¹ãã©ã¯ã¿ãŒã¯ãã€ã³ã¹ãã©ã¯ã·ã§ã³ããšã«ãå¿ èŠãªãã¹ãŠã®int 10hãã³ãã©ãŒã³ãŒããå®è¡ããŸãã ãã®ããã»ã¹ã§ããšãã¥ã¬ãŒã¿ã¯å ¥åºåããŒããæäœããæ©èœãåŒã³åºããŸããããã¯ãåã®æé 2ã§ç€ºãããã®ã§ãã
ã¹ããã4. VBEã§æ©èœããæ©èœãè¿œå ããŸãã
ããã§ãVBEãæäœããããã®ããã€ãã®é¢æ°ãäœæããæºåããã¹ãŠæŽããŸããã ãŸããå¿ èŠãªæ§é ã®å®çŸ©ãå«ãvbe.hãã¡ã€ã«ãè¿œå ããŸãã VirtualBoxã³ãŒãïŒhttp://www.virtualbox.org/svn/vbox/trunk/src/VBox/Devices/Graphics/BIOS/vbe.hïŒããååŸã§ããŸãã ãã®äžã®è¡ã眮ãæããŸãã
#include "vgabios.h" #include <VBox/Hardware/VBoxVideoVBE.h>
è¡ããšïŒ
#include "types.h"
次ã«ãå ±éãã©ã«ããŒã«æ¬¡ã®å 容ã®vbe.cãã¡ã€ã«ãäœæããŸãã
#include "types.h" #include "printf.h" #include "string.h" #include "bios.h" #include "vbe.h" ulong vbe_lfb_addr = 0; ulong vbe_selected_mode = 0; ulong vbe_bytes = 0; VbeInfoBlock *VBE_GetGeneralInfo() { BIOS_REGS regs; memset(®s, 0, sizeof(BIOS_REGS)); regs.ECX = 0; regs.EAX = 0x4f00; regs.ES = VBE_BIOS_INFO_OFFSET >> 4; regs.EDI = 0x0; VBE_BiosInterrupt(®s, 0x10); if (regs.EAX != 0x4f) return NULL; return (VbeInfoBlock *)(VBE_BIOS_INFO_OFFSET); } ModeInfoBlock *VBE_GetModeInfo( ulong mode ) { BIOS_REGS regs; memset(®s, 0, sizeof(BIOS_REGS)); regs.ECX = mode; regs.EAX = 0x4f01; regs.ES = VBE_BIOS_MODE_INFO_OFFSET >> 4; regs.EDI = 0x0; VBE_BiosInterrupt(®s, 0x10); if (regs.EAX != 0x4f) return NULL; return (ModeInfoBlock *)(VBE_BIOS_MODE_INFO_OFFSET); } int VBE_SetMode( ulong mode ) { BIOS_REGS regs; memset(®s, 0, sizeof(BIOS_REGS)); if (mode >= 0x100) { regs.EBX = mode; regs.EAX = 0x4f02; } else { regs.EAX = mode; } VBE_BiosInterrupt(®s, 0x10); return (regs.EAX == 0x4f); } int VBE_Setup(int w, int h) { uint32_t m = 0; printf("\nVBE: test started"); VBE_BiosInit(); memset((char *)VBE_BIOS_INFO_OFFSET, 0, sizeof(VbeInfoBlock)); memset((char *)VBE_BIOS_MODE_INFO_OFFSET, 0, sizeof(ModeInfoBlock)); VbeInfoBlock *p_info = VBE_GetGeneralInfo(); int vbe_support = (p_info != NULL); if (vbe_support == 0) { printf("\nVBE: not supported"); return 0; } vbe_support = (p_info->VbeVersion >= 0x200); vbe_support = vbe_support && (p_info->VbeSignature.SigChr[0] == 'V'); vbe_support = vbe_support && (p_info->VbeSignature.SigChr[1] == 'E'); vbe_support = vbe_support && (p_info->VbeSignature.SigChr[2] == 'S'); vbe_support = vbe_support && (p_info->VbeSignature.SigChr[3] == 'A'); if (vbe_support == 0) { printf("\nVBE: not supported"); return 0; } //Try to find mode int found = 0; for (m = 0x0; m < 0x200; m++) { ModeInfoBlock *p_m_info = VBE_GetModeInfo(m); if (p_m_info != NULL) { printf("\nVBE: %x %dx%dx%d at %x", m, p_m_info->XResolution, p_m_info->YResolution, p_m_info->BitsPerPixel, p_m_info->PhysBasePtr); if (p_m_info->PhysBasePtr != 0 && p_m_info->XResolution == w && p_m_info->YResolution == h && (p_m_info->BitsPerPixel == 24 || p_m_info->BitsPerPixel == 32)) { found = 1; vbe_selected_mode = m; vbe_lfb_addr = p_m_info->PhysBasePtr; vbe_bytes = p_m_info->BitsPerPixel / 8; printf("\nVBE: FOUND GOOD %dx%dx%d -> %x at %x", w, h, vbe_bytes, vbe_selected_mode, vbe_lfb_addr); } } } return found; }
ãã®ãã¡ã€ã«ã§å®£èšãããŠããé¢æ°ã詳ããèŠãŠã¿ãŸãããã
⢠VBE_GetGeneralInfo ã ãã®é¢æ°ã¯ããããªã«ãŒãã®VBEããã§ãã¯ããŸãã BIOSæ©èœã䜿çšããä»æ§ã«åŸã£ãŠæ»ãå€ããã§ãã¯ããŸãã
⢠VBE_GetModeInfo ã ãã®é¢æ°ã¯ããããªã«ãŒãã«ã¢ãŒãæ å ±ãçªå·ã§èŠæ±ããŸãã ãã®ã¢ãŒãã«é¢ããæ å ±ãæ§é äœã®åœ¢åŒã§è¿ããŸãã VBE_BiosInterruptã«æž¡ããããã©ã¡ãŒã¿ãŒã¯ãVBEä»æ§ã«ãã£ãŠæ±ºå®ãããŸãã
⢠VBE_SetMode ã ãã®é¢æ°ã¯ãåã«çªå·ã§ç®çã®ã¢ãŒãããªã³ã«ããŸãã VBE_BiosInterruptã«æž¡ããããã©ã¡ãŒã¿ãŒã¯ãVBEä»æ§ã«ãã£ãŠæ±ºå®ãããŸãã
⢠VBE_Setup ã æãéèŠãªæ©èœïŒãã¹ãŠã®ã¢ãŒããééãããã©ã¡ãŒã¿ãŒã§æå®ãããç»é¢è§£å床ãæºãããã®ãæ€çŽ¢ããŸãã ãŸããé¢æ°ã¯ã24ãããããã³32ãããã®ã¿ã®ã¢ãŒããæ€çŽ¢ããLFBããµããŒãããŠããŸãã æ€çŽ¢ã®çµæã圌女ã¯3ã€ã®ã°ããŒãã«å€æ°ãå ¥åããŸãã
o vbe_lfb_addr -LFBã¢ãã¬ã¹ã ãã®äžã§ãç»é¢ã«æç»ããããã®æžã蟌ã¿ããŒã¿ãã¹ã©ã€ã¹ã§ããŸãã
o vbe_selected_mode-ãªã³ã«ããããšãã§ããããã«éžæãããã¢ãŒãã®çªå·ã
o vbe_bytes-ãã¯ã»ã«ãããã®ãã€ãæ°ïŒ3ãŸãã¯4ïŒã
ãã¹ãŠãæç»ããæºåãã§ããŸããã
ã¹ããã5.ãã©ã¯ã¿ã«æç»é¢æ°ãè¿œå ããŸãã
楜ããéšåã«å°éããïŒãã©ã¯ã¿ã«ãæããŸãã ãžã¥ãªã¢ã»ããã«ãã©ã¯ã¿ã«ãæããŸãã ãã®çŽ æŽãããèšäºã®ã³ãŒãã¯ããã©ã¯ã¿ã«ãæãããã®åºç€ãšããŠæ¡çšãããŸããã ãã©ã¯ã¿ã«ãæãã«ã¯ããœãŒã¹ãå«ãã«ãŒããã£ã¬ã¯ããªã«fractal.cãã¡ã€ã«ãäœæãã次ã®ã³ã³ãã³ããäœæããŸãã
#include "types.h" #include "printf.h" #include "string.h" int VBE_SetMode( ulong mode ); int VBE_Setup(int w, int h); double floor(double x); extern ulong vbe_lfb_addr; extern ulong vbe_selected_mode; extern ulong vbe_bytes; int HSVtoRGB(int _h, int _s, int _v) { double h = (double)_h / 255.0, s = (double)_s / 255.0, v = (double)_v / 255.0; double r = 0; double g = 0; double b = 0; if (s == 0) { r = v; g = v; b = v; } else { double varH = h * 6; double varI = floor(varH); double var1 = v * (1 - s); double var2 = v * (1 - (s * (varH - varI))); double var3 = v * (1 - (s * (1 - (varH - varI)))); if (varI == 0) { r = v; g = var3; b = var1; } else if (varI == 1) { r = var2; g = v; b = var1; } else if (varI == 2) { r = var1; g = v; b = var3; } else if (varI == 3) { r = var1; g = var2; b = v; } else if (varI == 4) { r = var3; g = var1; b = v; } else { r = v; g = var1; b = var2; } } return ((int)(r * 255) << 16) | ((int)(g * 255) << 8) | (int)(b * 255); } void DrawFractal(void) { int x = 0, y = 0, w= 800, h = 600; if (!VBE_Setup(w, h)) return; if (!VBE_SetMode(vbe_selected_mode | 0x4000)) return; double cRe, cIm; double newRe, newIm, oldRe, oldIm; double zoom = 1, moveX = 0, moveY = 0; int color; int maxIterations = 300; cRe = -0.7; cIm = 0.27015; for(x = 0; x < w; x++) for(y = 0; y < h; y++) { newRe = 1.5 * (x - w / 2) / (0.5 * zoom * w) + moveX; newIm = (y - h / 2) / (0.5 * zoom * h) + moveY; int i; for(i = 0; i < maxIterations; i++) { oldRe = newRe; oldIm = newIm; newRe = oldRe * oldRe - oldIm * oldIm + cRe; newIm = 2 * oldRe * oldIm + cIm; if((newRe * newRe + newIm * newIm) > 4) break; } color = HSVtoRGB(i % 256, 255, 255 * (i < maxIterations)); // Draw pixel *(int *)((char *)vbe_lfb_addr + y * w * vbe_bytes + x * vbe_bytes + 0) = color & 0xFFFFFF; } }
ãã®ã³ãŒããããã«è©³ããåæããŠã¿ãŸãããã ãŸãããã®ã³ãŒãã«ã¯å¿ èŠãªå®çŸ©ãå«ãŸããŠããŸãã
int VBE_SetMode( ulong mode ); int VBE_Setup(int w, int h); double floor(double x); extern ulong vbe_lfb_addr; extern ulong vbe_selected_mode; extern ulong vbe_bytes;
次ã«ã HSVtoRGBè²å€æé¢æ°ãå®çŸ©ãããŠããŸãã 圌女ã¯ãã¹ãŠãçŸããèŠããããã«å¿ èŠã§ãã ãã®å®è£ ã¯ããããåãããŸããã
æåŸã«ãæãéèŠãªãã©ã¯ã¿ã«æç»é¢æ°ã¯DrawFractalã§ãã ããã€ãã®ç¹ã«æ³šæããå¿ èŠããããŸãã
1.æåã«ãã¢ãŒããšæç»ã«äœ¿çšãããç»é¢ãã©ã¡ãŒã¿ãŒãå®çŸ©ããŸãã
int x = 0ãy = 0ãw = 800ãh = 600;
ãããã®æ©èœã奜ã¿ã«åãããŠå€æŽã§ããŸãã
2.次ã«ãVBEãæ§æããŸãã
if (!VBE_Setup(w, h)) return;
3.èŠã€ãã£ãã°ã©ãã£ãã¯ã¢ãŒãããªã³ã«ãªããŸãã
if (!VBE_SetMode(vbe_selected_mode | 0x4000)) return;
4.次ã«ããã©ã¯ã¿ã«ãæç»ãããŸãã ç»é¢äžã®ãã€ã³ããèšå®ããã«ã¯ãã¡ã¢ãªå ã®æ°å€ã®åçŽãªèšé²ã䜿çšããæ£ãããªãã»ãããèšç®ããŸãïŒ
*(int *)((char *)vbe_lfb_addr + y * w * vbe_bytes + x * vbe_bytes + 0) = color & 0xFFFFFF;
ãã¹ãŠã®æºåãæŽã£ãã®ã§ããã®é¢æ°ãmainããåŒã³åºãå¿ èŠããããŸããããããªããšãäœæ¥ã®çµæã衚瀺ãããŸããã kernel.cã«å€æŽãå ããŸãã
#include "printf.h" #include "screen.h" #include "types.h" void DrawFractal(void); void main() { clear_screen(); printf("\n>>> Hello World!\n"); DrawFractal(); }
ã¹ããã6.ã¡ã€ã¯ãã¡ã€ã«ã調æŽããŠå®è¡ãã
ãã¹ãŠãã³ã³ãã€ã«ãããããã«ãã¡ã€ã¯ãã¡ã€ã«ããã¡ã€ãã©ã€ãºããã ãã§ãã ãããè¡ãã«ã¯ã次ã®å€æŽãè¡ããŸãã
1. OBJFILESãæŽæ°ããŸãã
OBJFILES = \ loader.o \ common/printf.o \ common/screen.o \ common/bios.o \ common/vbe.o \ common/qdivrem.o \ common/udivdi3.o \ common/umoddi3.o \ common/divdi3.o \ common/moddi3.o \ common/setjmp.o \ common/string.o \ common/s_floor.o \ x86emu/x86emu.o \ x86emu/x86emu_util.o \ fractal.o \ kernel.o
2.å¥ã®ã€ã³ã¯ã«ãŒããã£ã¬ã¯ããªãè¿œå ããŸãããããè¡ãã«ã¯ã次ã®è¡ãå€æŽããŸãã
$(CC) -Ix86emu -Iinclude $(CFLAGS) -o $@ -c $<
3.ã¢ã»ã³ãã©ãŒãã¢ã»ã³ãã«ããã¿ãŒã²ãããè¿œå ããŸãã
.so: as -o $@ $<
4.ããã§ããããžã§ã¯ããåæ§ç¯ã§ããŸãã
make rebuild sudo make image
5.ãããžã§ã¯ããå®è¡ããŠããã¹ãŠãæ©èœããããšã確èªããŸãã
sudo qemu-system-i386 -hda hdd.img
ãã¹ãŠãæ£ããè¡ãããŠããã°ããã®çŸãããèŠããã¯ãã§ãã

èšäºã®åã®éšåãšåæ§ã«ãddã³ãã³ãã䜿çšããŠãhdd.imgã€ã¡ãŒãžãUSBãã©ãã·ã¥ãã©ã€ãã«ã³ããŒããå®éã®ã³ã³ãã¥ãŒã¿ãŒã§ããã°ã©ã ããã¹ãã§ããŸãã
ãã®çµæãéåžžã®ç»é¢è§£å床ã§VBEæ¡åŒµæ©èœã䜿çšããªããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãªãã§ãããªã«ãŒãã䜿çšããæ©èœã瀺ãããã°ã©ã ãäœæãããŸãã ã°ã©ãã£ãã¯ã¢ãŒããæå¹ã«ããã«ã¯ãåœä»€ã®ãšãã¥ã¬ãŒã¿ãŒå šäœã移æ€ããå¿ èŠããããŸãããããã以å€ã®å Žåã¯ãããªã«ãŒããã©ã€ããŒã移æ€ããå¿ èŠããããããã«ã¯ããã«æéãããããŸãã ããã§ããã®ããã°ã©ã ã«åºã¥ããŠãç»é¢äžã«äœããæç»ããããç¬èªã®ã²ãŒã ãäœæãããããŠã£ã³ããŠã·ã¹ãã ãæ§ç¯ãããããããšãã§ããŸãã
ã·ãªãŒãºã®æ¬¡ã®èšäºãžã®ãªã³ã¯ïŒ
ã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãªãã§ããã°ã©ã ãå®è¡ããæ¹æ³ïŒ ããŒã4.䞊åèšç® ã
ã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãªãã§ããã°ã©ã ãå®è¡ããæ¹æ³ïŒ ããŒã5. OSããBIOSã«ã¢ã¯ã»ã¹ãã ã
ã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãªãã§ããã°ã©ã ãå®è¡ããæ¹æ³ïŒ ããŒã6. FATãã¡ã€ã«ã·ã¹ãã ã§ãã£ã¹ã¯ãæäœããããã®ãµããŒã ã