é·ãäŒæ©ã®åŸããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ãªãçŽç²ãªããŒããŠã§ã¢ã§ãã€ãã®ããã«ãèå³æ·±ãããšãç¶ããŠããŸãã èšäºã®ãã®ããŒãã§ã¯ãããã»ããµãŒã®æœåšèœåãæ倧éã«æŽ»çšããæ¹æ³ãåŠã³ãŸããããã°ã©ã ãè€æ°ã®ããã»ããµãŒã³ã¢ã§å®å
šã«äžŠåã¢ãŒãã§äžåºŠã«å®è¡ããŸãã ãããè¡ãã«ã¯ã
ããŒã3ã§ååŸ
ããããã°ã©ã ã®æ©èœãæ¡åŒµããããã«å€ãã®ããšãè¡ãå¿
èŠããããŸãã
ããã»ããµã³ã¢ã§äœããã®çš®é¡ã®èšç®ãå®è¡ããã®ã¯éå±ãªã®ã§ã倧ããªèšç®ãªãœãŒã¹ãå¿
èŠãšããã¿ã¹ã¯ãå¿
èŠã§ããããã¯äžŠåèšç®ã«ããŸãå解ãããèŠãç®ã¯ã¯ãŒã«ã§ãã ã¬ã€ãã¬ãŒã·ã³ã°ã¢ã«ãŽãªãºã ããŸãã¯ç°¡åãªæ¹æ³ã§ã¬ã€ãã¬ãŒã·ã³ã°ã䜿çšããŠãåçŽãª3Dã·ãŒã³ãã¬ã³ããªã³ã°ããããã°ã©ã ãäœæããããšããå§ãããŸãã
æåããå§ããŸããããç§ãã¡ã®ç®æšã¯ããã¹ãŠã®ããã»ããµã³ã¢ã§ã®äžŠåã³ã³ãã¥ãŒãã£ã³ã°ã§ãã ãã¹ãŠã®ææ°ã®PCçšããã»ããµãŒãšARMïŒGPUã«ã€ããŠã¯èšåããŠããŸããïŒããã«ãã³ã¢ããã»ããµãŒã§ãã ããã¯ã©ãããæå³ã§ããïŒ ã€ãŸããåäžã®ã³ã³ãã¥ãŒã¿ãŒäžã®ããã»ããµãŒã«ã¯ãåäžã®åŠçã³ã¢ã§ã¯ãªããè€æ°ã®ã³ã¢ããããŸãã äžè¬çã«ããã¹ãŠã¯å°ãè€éã«èŠããŸãïŒè€æ°ã®ãœã±ããïŒããã»ããµãããïŒãã³ã³ãã¥ãŒã¿ãŒã«ã€ã³ã¹ããŒã«ã§ããåãããïŒåçµæ¶å
ïŒã«äžåºŠã«è€æ°ã®ç©çã³ã¢ããããåç©çã³ã¢å
ã«è€æ°ã®è«çã³ã¢ïŒããšãã°ããã€ããŒã¹ã¬ããã£ã³ã°ãã¯ãããžãŒã®äœ¿çšæã«çºçãããã®ãªã©ïŒã ããã¯ãã¹ãŠäžå³ã«æŠç¥çã«ç€ºãããŠãããããããžãšåŒã°ããŸãã

æããã«ããœã±ããã¯åããã¶ãŒããŒãäžã«ã€ã³ã¹ããŒã«ãããã»ãã®æ°åã®ããã»ããµã§ãã ããããããããããã«ã以äžã«ããã€ãã®åçã瀺ããŸãã


ãã®äžã§æãèå³æ·±ãã®ã¯ã
è«çã³ã¢ã®ååšã§ãã ããã¯ã
SMT ïŒåæãã«ãã¹ã¬ããã£ã³ã°ïŒã®åçã瀺ããŠããŸããã€ãŸããå®éã«ã¯ãããã»ããµããŒãã解æŸãããŠããéã«å¥ã®è«çã¹ã¬ãããã次ã®åœä»€ãå®è¡ããã¡ã€ã³ã¹ã¬ããããã®åœä»€ã®å®äºãåŸ
ã¡ãŸãã ããã»ããµã®åç©çã³ã¢ã¯å€ãã®ã³ã³ããŒãã³ãïŒãã£ãã·ã¥ããã€ãã©ã€ã³ãALUãFPUãªã©ïŒã§æ§æãããå€ãã®éšåã¯äºãã«ç¬ç«ããŠåäœããåæããå¿
èŠããããããåœä»€ã¯ãã£ãã·ã¥ãŸãã¯ã¡ã¢ãªããã®ããŒã¿ãåŸ
ã£ãŠããå®è¡ãçµäºããŸããåãåœä»€ã䜿çšããå¥ã®ã¹ã¬ããããã®åœä»€ïŒ 詳现æ
å ±ãšåçã¯
ããã®ãªã³ã¯ãŸãã¯IntelãAMDãARMã®å
¬åŒææžã«ãããŸãã
ãã®èšäºã§ã¯ãæé©åãæ¹åããããã«ã®ã¿ããããžãŒã®è©³çŽ°ãéèŠã«ãªããŸãïŒãããŠããã¹ãŠã®ã«ãŒãã«ã¯åããã®ãšããŠèªèãããŸãïŒã CPUIDåœä»€ã䜿çšããŠããã°ã©ã ã§ããããžãååŸã§ããŸããã次åã¯ãã®è©³çŽ°ãååŸããŸãã
ããã«ããã€ãã®æŠå¿µã玹ä»ããŸãã
SMP ïŒå¯Ÿç§°åãã«ãããã»ãã·ã³ã°ïŒ-ãã¹ãŠã®ããã»ããµãŒã®å¯Ÿç§°çãªäœ¿çšãæå³ããŸãã ããšãã°ããã¹ãŠã®ããã»ããµã³ã¢ã¯åãRAMã«å®å
šã«ã¢ã¯ã»ã¹ã§ãããã¹ãŠã®ããã»ããµã³ã¢ã¯åãã§ãããåãåäœãããŸãã
åã®æŠå¿µãšã¯å¯Ÿç
§çã«ã
AMP ïŒé察称ãã«ãããã»ãã·ã³ã°ïŒã¯ãå°ãªããšã1ã€ã®ã³ã¢ãä»ã®ã³ã¢ãšã¯ç°ãªãåäœãããããšãæå³ããŸãã ããšãã°ãCPUãšGPUã®å
±åäœæ¥ã¯ãAMPã®äŸãšèããããšãã§ããŸãã
NUMA ïŒéåäžã¡ã¢ãªã¢ã¯ã»ã¹ïŒ-ã¡ã¢ãªã®ç°ãªãé åãžã®ããã»ããµã¢ã¯ã»ã¹ã®äžåäžã å®éãåããã»ããµã³ã¢ã¯ãã¹ãŠã®ã¡ã¢ãªã«ã¢ã¯ã»ã¹ã§ããŸãããåã³ã¢ã«ã¯ãä»ã®ã³ã¢ãããé«éã«ã¢ã¯ã»ã¹ããã¡ã¢ãªé åããããŸãã åã³æé©åã«äœ¿çšãããŸãã
çŸä»£ã®ã³ã³ãã¥ãŒã¿ãŒã·ã¹ãã ã«ã¯ããããã®ååãšæè¡ããã¹ãŠåãã£ãŠããŸãã
SMPãæãçŽç²ãªåœ¢ã§æ€èšããŸãã ã·ã¹ãã ãèµ·åãããšãããã»ããµèªäœãä»»æã®ã«ãŒãã«ã1ã€éžæãã
ããŒãã¹ãã©ããããã»ããµ ïŒBSPïŒãšåŒã³ãŸããæ®ãã¯ãã¹ãŠ
ã¢ããªã±ãŒã·ã§ã³ããã»ããµ ïŒAPïŒã«ãªããŸãã BSPã¯BIOSã³ãŒãã®å®è¡ãéå§ããã·ã¹ãã å
ã®ãã¹ãŠã®ããã»ããµã³ã¢ãèŠã€ããŠèµ·åããåæåãå®è¡ããŠå®å
šã«ãªãã«ããŸãã ãããã£ãŠãéå§åŸãããã°ã©ã ã¯ããã»ããµã®1ã€ã®BSPã³ã¢ã§åäœããã®ã§ãç®æšã¯äžèŠãéåžžã«åçŽã«èŠããŸãïŒã³ã³ãã¥ãŒã¿ãŒäžã«ããã³ã¢ã®æ°ã確èªããã·ã¹ãã å
ã®åã³ã¢ãéå§ããŠæ§æãããã¹ãŠã®ã³ã¢ã«1ã€ã®èšç®ãå®è¡ãããã¿ã¹ã¯ãå
±éã®å©çã®ããã«ã
ç®æšãéæããã«ã¯ãããã€ãã®è³ªåã«çããå¿
èŠããããŸãã
ã·ã¹ãã å
ã®ããã»ããµãšã³ã¢ã®æ°ãšããããžã決å®ããæ¹æ³ã¯ïŒãããè¡ãã«ã¯ãçŽ æŽãããACPIã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããå¿
èŠããããããããžãŒã決å®ããã«ã¯CPUIDã䜿çšããŸãã
ç¹å®ã®ããã»ããµã³ã¢ãèå¥ããæ¹æ³ãã®ãããã·ã¹ãã å
ã®åããã»ããµã³ã¢ãæã€APICããã€ã¹ããŸãã¯ãããLAPICã¯ãã·ã¹ãã ã®äžæã®èå¥åïŒããã»ã¹ã®PIDãªã©ïŒãæã¡ãç¹å®ã®ããã»ããµã³ã¢ã«å²ã蟌ã¿ãé
ä¿¡ãã圹å²ãæãããŸãã
ããã³ã¢ãå¥ã®ã³ã¢ããèµ·åããæ¹æ³ã¯ïŒ1ã€ã®ããã»ããµã³ã¢ããå¥ã®ããã»ããµã³ã¢ã«å²ã蟌ã¿ãéä¿¡ããã ãã§ååã§ãã ãã®ä¿¡å·ã¯IPIïŒInter Processor InterruptïŒãšåŒã°ããŸãã ãããéä¿¡ããã«ã¯ãã³ã¢ã®1ã€ã§LAPICããã€ã¹ã䜿çšããŠãã¬ãžã¹ã¿ã«ç¹å®ã®å€ãæžã蟌ãã ãã§ååã§ãã
ããã»ããµã³ã¢ã®å®è¡ãåæ¢ããæ¹æ³ãã®ã«ãŒãã«ã§HLTåœä»€ãåŒã³åºãã ãã§ååã§ãã
ããå°ãã
ACPI ïŒ
APICãšæ··åããªãã§ãã ããïŒã¯ãé«åºŠãªæ§æããã³é»æºã€ã³ã¿ãŒãã§ã€ã¹ã§ã-å®éããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãã³ã³ãã¥ãŒã¿ãŒããã®è©³çŽ°ãªæ§æã«é¢ããæ
å ±ãåä¿¡ããã³ã³ãã¥ãŒã¿ãŒã®é»æºã管çã§ããæšæºã€ã³ã¿ãŒãã§ã€ã¹ã§ãã ãã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãé»æºç®¡çããã€ã¹ïŒACPIããã€ã¹ãšåŒã°ããPCIã«ååšããŸãïŒ
èšäºãåç
§ ïŒïŒãšãã³ã³ãã¥ãŒã¿ãŒã®RAMã«é
眮ãããã·ã¹ãã ã«é¢ããæ
å ±ãå«ãããã€ãã®ACPIããŒãã«ã§æ§æãããŸãã ã³ã³ãã¥ãŒã¿ãŒã®ããã»ããµã³ã¢ã«é¢ããæ
å ±ã«å ããŠãäžéšã®ACPIããŒãã«ã«ã¯ãã³ã³ãã¥ãŒã¿ãŒã®ç©çç寞æ³ãšãã©ãŒã ãã¡ã¯ã¿ãŒã«é¢ããæ
å ±ãæ ŒçŽãããŸãïŒããšãã°ãã¿ãã¬ããããããã°ã©ã ãåäœããããšãããããŸãïŒã å€ãã®ããŒãã«ãããããããã®å®å
šãªèª¬æã¯
ããã§èŠã€ããããšãã§ããŸãããç§ãã¡ã¯RSDTã«ãã£ãŠåç
§ãããMADPã«ã®ã¿èå³ããããŸããRSDPããŒãã«ãžã®ãã€ã³ã¿ã¯BIOSã®è¿ãã«ãããŸãã ã¡ã€ã³ACPIããŒãã«ã®ç°¡ç¥å³ã¯æ¬¡ã®ãšããã§ãã

çŸæç¹ã§ç¥ã£ãŠããå¿
èŠãããã®ã¯ãããã»ããµã³ã¢ã«é¢ããæ
å ±ãå«ãã¬ã³ãŒããMADTã«å«ãŸããŠããããšã ãã§ãã åãšã³ããªã«ã¯ããã®ã«ãŒãã«ã®LAPICèå¥åïŒ8ãããé·ãã·ã¹ãã å
ã®ä»»æã®ã¿ã€ãã®256ã³ã¢ä»¥äžãæå³ããïŒãšæå¹åãããïŒãã®ã«ãŒãã«ã䜿çšã§ããããäºçŽãããŠãããã瀺ãïŒãå«ãŸããŸãã
çŸåšã
LAPICã¯ããŒã«ã«APICã§ããã
APIC ïŒ
ACPIãšæ··åããªãã§ãã ããïŒã¯ãå€ãPICïŒããã°ã©ããã«å²ã蟌ã¿ã³ã³ãããŒã©ãŒïŒã«ä»£ããé«åºŠãªããã°ã©ããã«å²ã蟌ã¿ã³ã³ãããŒã©ãŒã§ãã PICã¯ããã»ããµã«å²ã蟌ã¿ãå³åº§ã«é
ä¿¡ããŠããŸããããçŸåšã¯LAPICãä»ããŠãããå®è¡ããŠããŸãã ããŒã«ã«APICã¯APICã®å¯äžã®ã¿ã€ãã§ã¯ãããŸãã-IO APICããããŸã-ããã¯ç¬ç«ããå²ã蟌ã¿ã³ã³ãããŒã©ã§ãããã·ã¹ãã äžã®ããã»ããµã³ã¢éã§å²ã蟌ã¿ãåæ£ãã圹å²ãæãããŸãã å
šäœåã¯æ¬¡ã®ãšããã§ãã

äžèŠè€éã«èŠããŸããããããç解ããã°ããã¹ãŠãéåžžã«åççã§ãïŒ
PIC-é·ãé䜿çšãããŠããå²ã蟌ã¿ã³ã³ãããŒã©ãŒ-ãæ®ã£ãŠããŠæ¶ããŠããªããããã¯ãŸã ãã¶ãŒããŒãäžã®ãããã»ããã®äžéšã§ãã ãã«ãã³ã¢ã®ç»å Žã«ããã
IO APICãè¿œå ãããŸãããããã¯ã誰ãããããè¡ãå¿
èŠããããããPICãšä»ã®ãœãŒã¹ããã®å²ã蟌ã¿ãã«ãŒãã«éã§åæ£ããããã«ãªããŸããã åLAPICã«ã¯ãIPIããã³IO APICæ§æã§äœ¿çšãããäžæã®èå¥åãè£
åãããŠããŸãã ãŸããLAPICçªå·ã«ã¯ããããžããšã³ã³ãŒããããŠããŸãã BSPã®LAPICèå¥åã¯åžžã«0ã§ãã
LAPICãããã°ã©ã ããã«ã¯ãã¬ãžã¹ã¿ãžã®ããŒã¿ã®èªã¿æžããå¿
èŠã§ãïŒä»ã®ããã€ã¹ãšåæ§ïŒãã¬ãžã¹ã¿ã¯0xFEE00000ã®ã¡ã¢ãªã«ãããŸãã å®éããã®ã¢ãã¬ã¹ã¯ç°ãªãå ŽåããããŸãããç¹å¥ãªMSRïŒã¢ãã«åºæã¬ãžã¹ã¿-ãããã®ã¬ãžã¹ã¿ã¯rdmsr / wrmsråœä»€ãä»ããŠèªã¿æžããããŸãïŒãä»ããŠåžžã«èŠã€ããããšãã§ããŸãã å€ãã®å Žåããã®ã¢ãã¬ã¹ã¯åãã§ãããåã³ã¢ã«ã¯ãã®ã¢ãã¬ã¹ã«ç¬èªã®LAPICããããŸãã ãã®ããã€ã¹ã«ã¯å€ãã®ã¬ãžã¹ã¿ããããŸãããIPIãéä¿¡ã§ãã
ICR ïŒå²ã蟌ã¿å¶åŸ¡ã¬ãžã¹ã¿ïŒã1ã€ã ãå¿
èŠã§ãã
ããã»ããµã³ã¢ãéå§ããã«ã¯ã3ã€ã®IPIããã®ã³ã¢ã«éä¿¡ããå¿
èŠããããããã«ããå¥ã®ã³ã¢ã匷å¶çã«ãªã³ã«ãªããŸãïŒINIT IPIã次ã«STARTUP IPIãããã³å¥ã®STARTUP IPIãæåã®IPIïŒãŸãã¯SIPIïŒã¯åæåããã»ã¹ãå®äºããããã«å¿
èŠã§ããæåã®SIPIãæåããå Žåã2çªç®ã¯ç¡èŠãããŸãã äœãããããšã¯ãããŸãã-ãã®ãããªã«ãŒã«ã åIPIãéä¿¡ããã«ã¯ãLAPICã®ICRã¬ãžã¹ã¿ã«ç¹å®ã®ãã€ããæžã蟌ãã ãã§ãã ãããã®ãã€ãã«ã¯ãIPIãéä¿¡ãããLAPICã®ãã€ããšãéä¿¡ããIPIã®ã¿ã€ããå«ãŸããŸãã SIPIã®å Žåãããã«2ãã€ãã䜿çšãããããããAPãèµ·åãããã¡ã¢ãªå
ã®ã¢ãã¬ã¹ã決å®ãããŸãã
åŸè
ã¯éåžžã«äŸ¿å©ã§ããæåã«ã³ãŒãããããã»ããµãèµ·åããå¿
èŠããããŸããããã«ãããããã»ããµãä¿è·ã¢ãŒãã«ç§»è¡ããŸãïŒã¯ããINIT-SIPI-SIPIããªã¢ã«ã¢ãŒãã§èµ·åããåŸã®ããã»ããµã¯é©åã§ã¯ãããŸããïŒã ããã»ããµåæåã³ãŒãã«ã€ããŠã¯ãåŸã§è©³ãã説æããŸãã ã¯ããçã®ã¢ã»ã³ãã©ãªãã§ã¯ã§ããŸããã
LAPICããã³IO APICã®è©³çŽ°ã«ã€ããŠ
ã¯ãIntelããã»ããµã®ããã¥ã¢ã«ãã芧ãã ããã
çŸåšã
Lock ã
FPU ãããã³
ã¬ã€ãã¬ãŒã·ã³ã°ã¢ã«ãŽãªãºã èªäœïŒãã€ããŒãïŒã®ããã€ãã®å°ããªäºæã«å¯ŸåŠããŠããŸãã
ãŸã æåã«å¿
èŠãªããšã¯ããã¹ãŠã®ã³ã¢ã®åäœãåæããæ©èœã§ãã ãããè¡ãã«ã¯ã
ããã¯ã³ãŒããèšè¿°ããŸããããã«ãããã¡ã¢ãªå
ã«ãããšãã°ãçµ±äžã®å€èŠ³ãæåŸ
ãããŸãã æ£ããããã¯ããæ¹æ³ã¯ïŒ æãæçœãªãªãã·ã§ã³ïŒã€ãŸå
ãç¹å®ã®ã¢ãã¬ã¹ã«çŸããããšãæåŸ
ããåçŽãªwhileïŒ1ïŒãèšè¿°ããä»ã®ã«ãŒãã«ããããè¡ãæéãã§ãããŸã§ãã®ã¢ãã¬ã¹ã«ãŠããããããã«èšè¿°ããŸãã ãããŠãåã®ããã¯ã解é€ããã«ã¯ããŒããæžã蟌ãå¿
èŠããããŸãã
çŸåšã
FPU ïŒæµ®åå°æ°ç¹ãŠãããïŒã¯ããã»ããµäžã®ç¹å¥ãªã¢ãžã¥ãŒã«ã§ãããæµ®åå°æ°ç¹ã䜿çšããç®è¡èšç®ã«äœ¿çšãããŸãã ã€ãŸããããã°ã©ã ã§floatåãšdoubleåã®å€æ°ã䜿çšããå Žåã¯ããã®ã¢ãžã¥ãŒã«ãåæåããå¿
èŠããããŸãã ææ°ã®ãã¹ãŠã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ã¯ãOSã«ãŒãã«ããããè¡ããŸããããã®å Žåã¯ãŠãŒã¶ãŒæ¬¡ç¬¬ã§ãã ãã ããããã¯æ±ºããŠé£ãããããŸãããã¢ã»ã³ãã©ãŒã§ã®2ã3ã®æ瀺ã ãã§ãã ãã以å€ã®å Žåã¯ã¬ã€ãã¬ãŒã·ã³ã°ãæ©èœããªãããããããŒããå¿
èŠã«ãªããŸãã
ã¬ã€ãã¬ãŒã·ã³ã°ã¯ã©ã®ããã«è¡ããŸããïŒ ãã®ã¢ã«ãŽãªãºã ã¯ãã®èšäºã®ç¯å²ãè¶
ããŠãããããããã§ã¯èª¬æããŸãããããã
ã«é¢ããå€ãã®åªããèšäºããããŸãã ç§ãã¡ã®å Žåãå®æããããã°ã©ã ãååŸããŠå°ãå€æŽããŸãã
çè«ãçµãã£ãã®ã§ãããã°ã©ã ãæžãå§ããŸãããã
ïŒ éèŠïŒïŒ èšäºããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãªãã§ããã°ã©ã ãå®è¡ããæ¹æ³ãã®3çªç®ã®ããŒãã® 6ã€ã®ã¹ããããã¹ãŠãæ£åžžã«å®äºããåŸã«ã®ã¿ã以éã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ãæ£åžžã«å®è¡ã§ããŸããã¹ããã1.ãŸããäœåãªéšåããããã«ããŸãã
ãŸããäžèŠãªãã¡ã€ã«ãé¢æ°ããæ¢åã®ã³ãŒãããããã«ã¯ãªã¢ããå¿
èŠããããŸãã æ¬æ Œçãªæ°åŠã©ã€ãã©ãªãå¿
èŠã«ãªããããcommonããäœåãªãã¡ã€ã«ãåé€ããå¿
èŠããããŸãããã¡ã€ã«
common / s_floor.cãåé€ããŸãã
ãã©ã¯ã¿ã«ãæç»ããå¿
èŠã¯ãããŸãããã¬ã€ãã¬ãŒã·ã³ã°ãå¿
èŠãªã®ã§ãfractal.cãåé€ã§ããŸãã ãã ããã°ã©ãã£ãã¯ã¢ãŒããå¿
èŠãªãããkernel.cã«æ¬¡ã®ã³ãŒããèšè¿°ããŸãã
1. mainé¢æ°ã®åã«ããã€ãã®å®£èšãè¿œå ããŸãããããã®å®£èšã¯ããšããããç»é¢è§£å床ãšã¬ã³ããªã³ã°ããç»åãèšå®ããŸãã
ç§ã¯
nt vbe_screen_w = 800, vbe_screen_h = 600; int VBE_SetMode( ulong mode ); int VBE_Setup(int w, int h); extern ulong vbe_lfb_addr; extern ulong vbe_selected_mode; extern ulong vbe_bytes;
2.ã¡ã€ã³æ©èœãå€æŽããŸãã
void main() { clear_screen(); printf("\n>>> Hello World!\n");
3.è¡ãåé€ããŸãã
void DrawFractal(void);
ã¹ããã2.æ°åŠã©ã€ãã©ãªfdlibmãè¿œå ããŸãã
ããã§ãæ¬æ Œçãªæ°åŠã©ã€ãã©ãªãè¿œå ã§ããŸãã å®éãå¿
èŠãªã®ã¯sqrtãtanãããã³powé¢æ°ã ãã§ãããããã¯ã¬ã€ãã¬ãŒã·ã³ã°ã¢ã«ãŽãªãºã ã§äœ¿çšãããŸãã
1.ã«ãŒããã£ã¬ã¯ããª
fdlibmãäœæããŸã
ã2.ãã®ãã£ã¬ã¯ããªã§
ããããã fdlibmã©ã€ãã©ãªãããŠã³ããŒã
ããŸã ã ãã®ãã©ã«ããŒãããã¹ãŠã®ãã¡ã€ã«ãã¢ããããŒãããå¿
èŠããããŸãã
3.ããã§ãmakefileãããåçŽãªãã®ã«çœ®ãæããå¿
èŠããããŸãïŒåæã«ãã¡ã€ã«ã®ãªã¹ãã確èªã§ããŸãïŒã ã³ã³ãã€ã«äžã«ãåºæ¬çã«ã«ãŒãã®ã¡ã€ã¯ãã¡ã€ã«ãšåããã©ã°ã䜿çšãããŸãã ããã«ãããåçŽãªã©ã€ãã©ãª
fdlibm.aãã³ã³ãã€ã«ãããŸã
ã æ°ããã¡ã€ã¯ãã¡ã€ã«ã®å
容ïŒ
CC = gcc CFLAGS = -Wall -fno-builtin -nostdinc -nostdlib -ggdb3 LD = ld OBJFILES = \ e_acos.o e_acosh.o e_asin.o e_atan2.o e_atanh.o e_cosh.o e_exp.o \ e_fmod.o e_gamma.o e_gamma_r.o e_hypot.o e_j0.o e_j1.o e_jn.o \ e_lgamma.o e_lgamma_r.o e_log.o e_log10.o e_pow.o e_remainder.o \ e_rem_pio2.o e_scalb.o e_sinh.o e_sqrt.o \ k_cos.o k_rem_pio2.o k_sin.o k_tan.o \ s_asinh.o s_atan.o s_cbrt.o s_ceil.o s_copysign.o s_cos.o s_erf.o s_expm1.o \ s_fabs.o s_finite.o s_floor.o s_frexp.o s_ilogb.o s_isnan.o s_ldexp.o s_lib_version.o \ s_log1p.o s_logb.o s_matherr.o s_modf.o s_nextafter.o s_rint.o s_scalbn.o s_signgam.o \ s_significand.o s_sin.o s_tan.o s_tanh.o \ w_acos.o w_acosh.o w_asin.o w_atan2.o w_atanh.o w_cosh.o w_exp.o w_fmod.o w_gamma.o \ w_gamma_r.o w_hypot.o w_j0.o w_j1.o w_jn.o w_lgamma.o w_lgamma_r.o w_log.o \ w_log10.o w_pow.o w_remainder.o w_scalb.o w_sinh.o w_sqrt.o k_standard.o all: fdlibm.a rebuild: clean all .so: as -o $@ $< .co: $(CC) -Ix86emu âI../include $(CFLAGS) -o $@ -c $< .cpp.o: $(CC) -Ix86emu -I. -Iustl âI../include $(CFLAGS) -o $@ -c $< fdlibm.a: $(OBJFILES) ar -rv fdlibm.a $(OBJFILES) ranlib fdlibm.a clean: rm -f $(OBJFILES) fdlibm.a
4.ãã¹ãŠãçµã¿ç«ãŠãããã«ã
k_standard.cã«å€æŽã
å ããŸãã errnoã宣èšãã空ã®é¢æ°fputsãå®çŸ©ããå¿
èŠããããŸãããã®å Žåããã¡ã€ã«ã·ã¹ãã ãšã°ã©ãã£ãã¯è¡šç€ºããªããšæå³ããããŸããã ãããè¡ãã«ã¯ã次ã®è¡ã眮ãæããŸãã
#ifndef _USE_WRITE #include <stdio.h> /* fputs(), stderr */ #define WRITE2(u,v) fputs(u, stderr) #else /* !defined(_USE_WRITE) */
è¡ããšïŒ
void fputs(void *u, int stderr) { } int errno = 0; #ifndef _USE_WRITE #define WRITE2(u,v) fputs(u, 0) #else
ã¹ããã3.å¿
èŠãªå®çŸ©ãšããããŒãè¿œå ãã
ãã€ãã®ããã«ãããã°ã©ã ã§åŸã§äœ¿çšãããå®çŸ©ããããã«æ¡åŒµããå¿
èŠããããŸãã
1.ä»åã¯ãã³ãã¬ãŒãã§ãC ++ã䜿çšããããããå€ãã®ãšã©ãŒãåé¿ããã«ã¯ã
include / string.hãã¡ã€ã«ãä¿®æ£ããå¿
èŠããããŸãã ãã®äžã§ãvoid *ãchar *ã«å€æããããã¹ãŠã®å Žæã§æ瀺çãªåå€æãè¿œå ããå¿
èŠããããŸãã 42ã53ã54ã79ã80è¡ã§ãã ããšãã°ãåæ§ã®å€æŽãè¡ãããå Žåãä¿®æ£ãããè¡42ã¯æ¬¡ã®ããã«ãªããŸãã
p =ïŒchar *ïŒaddr;
2.æ°åŠã©ã€ãã©ãªã®å®çŸ©ãããã€ãè¿œå ããå¿
èŠããããŸãã ãããã«ã¯ãããã€ãã®ã°ããŒãã«å€æ°å®çŸ©ãããã€ãã®ã¿ã€ããããã€ãã®å®æ°ãããã³fdlibmã䜿çšãããšã©ãŒã³ãŒããå«ãŸããŸãã ãã®çµæã次ã®ã³ãŒããè¿œå ããŠ
/ types.hã
ã€ã³ã¯ã«ãŒãããŸã ïŒãã¡ã€ã«ã®æåŸã®æåŸã®#endifã®åïŒïŒ
typedef unsigned long long u64; #define FLT_MAX 1E+37 #define DBL_MAX 1E+37 #define LDBL_MAX 1E+37 # ifndef INFINITY # define INFINITY (__builtin_inff()) # endif #define NUM 3 #define NAN 2 #define INF 1 #define M_PI 3.14159265358979323846 #define __PI 3.14159265358979323846 #define __SQRT_HALF 0.70710678118654752440 #define __PI_OVER_TWO 1.57079632679489661923132 typedef const union { long l[2]; double d; } udouble; typedef const union { long l; float f; } ufloat; extern double BIGX; extern double SMALLX;
3.次ã®ã³ãŒãã
å«ããã¡ã€ã«
include / errno.hãè¿œå ããŸãã
#ifndef _ERRNO_H #define _ERRNO_H extern int errno; #define EDOM -6 #define ERANGE -8 #endif
4.ããã§ãããŒããŠã§ã¢ãSMPãACPIãLAPICèšå®ãããã³ç¹å¥ãªããã»ããµã¬ãžã¹ã¿ã®ã»ããã¢ããæ©èœã«é¢é£ããå€ãã®å®çŸ©ãè¿œå ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ã
次ã®ã³ãŒããè¿œå ããinclude / hardware.hãã¡ã€ã«ãäœæã
ãŸã ã ä»åã¯ãå®æããã³ãŒããå«ã2ã€ã®ãã¡ã€ã«ãgithubã«æçš¿ããŸããã ããã¯ãã³ãŒããæ¯èŒç倧ããïŒã500è¡ïŒããšãå€æãããããèšäºã®ãã¬ãŒã ã¯ãŒã¯å
ã§èšè¿°ããã®ã¯äžäŸ¿ã§ãã ã³ãŒãã«ã¯ãã·ã¢èªã®ã³ã¡ã³ããå€æ°å«ãŸããŠãããããgithubã®ã³ãŒãã¯èšäºã®ç¶ããšèŠãªãããšãã§ããŸãã 段èœèªäœã«ããã¡ã€ã«ã®å
容ã瀺ããŸãã
aã ACPIããŒãã«ã®è§£æã«äœ¿çšãããæ§é ã®å®çŸ©ã ãã®ã³ãŒãã¯ãå
¬åŒã®ACPIä»æ§ã«åºã¥ããŠããŸãã ã³ãŒãã«ã¯ãå¿
èŠãªããŒãã«ïŒRSDPãRSDTãMADTïŒã®å®çŸ©ã®ã¿ãå«ãŸããŸãã
bã ããã«ãã¡ã€ã«ã«ã¯ãã¢ã»ã³ãã©ãŒåœä»€ãå«ãããã€ãã®ã€ã³ã©ã€ã³é¢æ°ã®å®£èšããããŸãã ã»ãšãã©ã®å Žåãé¢æ°ã¯éåžžã«å°ãããªã£ãŠããŸãããgccã§ã¢ã»ã³ãã©ãŒã䜿çšããç¹æ®æ§ã®ããã«å€§ããèŠããŸãããå
žåçãªãã¶ã€ã³ã¯æ¬¡ã®ããã«ãªããŸãã ãããã®é¢æ°ã®ååã«ããã³ãŒãã¯ãFreeBSDãLinuxãããã³Bitvisorãªã©ã®ãããžã§ã¯ãã®äž¡æ¹ã®ã³ãŒãã§ãã€ã³ã¿ãŒãããäžã®ããŸããŸãªå Žæã«ãããŸãã 次ã®é¢æ°ãç解ããŸãïŒrdtscã__ rdmsrã__ rdmsrlã__ wrmsrã__ wrmsrlã__ rep_nopããã³__cpuid_countã__ get_cr0ã__ set_cr0ã
cã ç¹ã«ãSmpSpinlock_LOCKããã³SmpSpinlock_UNLOCKãšåŒã°ãã2ã€ã®é¢æ°ã匷調ããããšæããŸãã äž¡æ¹ã®é¢æ°ã¯
orangetide.com/src/bitvisor-1.3/include/core/spinlock.hãã
ååŸããã
ã¢ã»ã³ãã©ãŒã§ãèšè¿°ãããŠããŸãã ãããã¯ãåæã«åäœããããã»ããµã³ã¢ã®åæãªããžã§ã¯ããæäœããããã®é¢æ°ãè¡šããŸãã ãããã¯åçŽãªããã¯ã§ãã äœæ¥ã®æ¬è³ªã¯ç°¡åã§ããã¡ã¢ãªå
ã®1ãã€ããããã¯ãšããŠäœ¿çšãããå€0ãŸãã¯1ãååŸã§ããŸãã0ã®å Žåãããã¯ã¯éããã1ã®å Žåã¯éããããŸãã SmpSpinlock_LOCKé¢æ°ã®æ¬è³ªã¯ãããã¯ã®ãã€ãã®å€0ãåŸ
æ©ãããã®ãã€ãã1ã«èšå®ããããšã§ããåŸ
æ©ããã«ã¯ããäŒæ¢ãåœä»€ã䜿çšããŠéåžžã®ãµã€ã¯ã«ã䜿çšããŸãã å€1ãèªã¿åã£ãŠã¡ã¢ãªã®ãã€ãã«åæã«èšå®ããã«ã¯ããxchgãåœä»€ã䜿çšããŸããããã«ãããã¡ã¢ãªãšã¬ãžã¹ã¿éã§å€ãã¢ãããã¯ã«äº€æã§ããŸãã ã¢ãããã¯æ§ãšã¯ãå¥ã®ããã»ããµã³ã¢ããã®åœä»€ã®åäœãäžæããããšãã§ããããã®åäœã®éäžã§èªèº«ã劚害ããããšãæå³ããŸãã
dã hardware.hã³ãŒãã¯ãLAPICã«é¢é£ããããã€ãã®å®æ°ãããã«èª¬æããŠããŸãã ãããã¯Intelã®ããã¥ã¡ã³ãããååŸãããŸãã
eã ãã¡ã€ã«ã®æåŸã§ãå¥ã®__enable_fpuã¢ã»ã³ãã©ãŒé¢æ°ã宣èšãããããã«ããããã»ããµãŒã§FPUãæå¹ã«ãªããŸãã ããã¯ãfloatåãæ±ãããã«å¿
èŠã§ããããšãæãåºããŠãã ããã ãã®æ©èœã¯ãã«ãŒãã«ã§FPUãæå¹ã«ããããã«å¿
èŠãªãfnclexããšãfninitãã®2ã€ã®åœä»€ã®å®è¡ã§ãã
æé 4.ããã»ããµã³ã¢ã®åæåã³ãŒããè¿œå ããŸãã
ããã§ãsmp.cãã¡ã€ã«ã®äœæãéå§ã§ããŸãããã®ãã¡ã€ã«ã«ã¯ãè€æ°ã®ããã»ããµã³ã¢ãæäœããããã®é¢æ°ãå«ãŸããŠããŸãã ãã®ãã¡ã€ã«ã®æãéèŠãªéšåã¯ãæ°ããèµ·åãããã«ãŒãã«ã§å®è¡ãããã¢ã»ã³ãã©ãŒã³ãŒãã§ãã
smp.cã³ãŒã
ãgithubã«ããã説æä»ãã®ã³ã¡ã³ãããããããããŸãã ã³ãŒãã®äžéšã¯ã€ã³ã¿ãŒãããäžã®å€ãã®ãœãŒã¹ããåéããå¿
èŠããããäžéšã¯èªåã§äœæããå¿
èŠããããŸããã å®éã«ã¯ããã«ãã³ã¢ã®ã»ããã¢ããã¯åOSã«åºæã®åé¡ã§ãããããã³ãŒãã«ã¯ç¹å®ã®OSã«å¿
èŠãªãã®ãå€ãå«ãŸããŠããŸãã ãã®èšäºã®èè
ã®ç®çã¯ããã®ãããªã³ãŒããåçŽåããŠãSMPã䜿çšããããã«å®è¡ããå¿
èŠã®ããã¢ã¯ã·ã§ã³ãšæå°éã®ã¢ã¯ã·ã§ã³ã®æ¬è³ªã瀺ãããšãã§ããããã«ããããšã§ããã smp.cã³ãŒãã«ã¯2ã€ã®éšåãå«ãŸããŠããŸãã
1.åAPãæ€çŽ¢ããŠæå¹ã«ããã³ãŒãã ãã¹ãŠã®åæåã®éå§ã¯ãSmpPrepareé¢æ°ã®åŒã³åºãã§çºçããŸãã äžéšã®ãµãæ©èœã«ã¯çãé
延ãå¿
èŠã§ãã ã¿ã€ããŒãŸãã¯CMOSã䜿çšããŠãããã®é
延ãå®è¡ããã®ã¯æ£ããããšã§ããããã®äŸã§ã¯ãTSCã«ãŠã³ã¿ãŒã®ç¹å®ã®å€ïŒéå§ããçµéããããã»ããµãŒã¯ããã¯ãµã€ã¯ã«ã®ã«ãŠã³ã¿ãŒïŒã®æåŸ
ã«åºã¥ããŠé
延ã䜿çšãããŸãã SmpPrepareã§ã¯ã次ã®æé ãå®è¡ãããŸãã
- aã CPUIDã䜿çšããŠLAPICã確èªããŸãã
- bã MSRãä»ããŠåºæ¬LAPICã¢ãã¬ã¹ãååŸããŸãã
- cã 64ãããICRã¬ãžã¹ã¿ã®2ã€ã®éšåãžã®ãã€ã³ã¿ãŒãååŸããŸãã ãããã¯ã¡ã¢ãªå
ã®ç¹å®ã®é åãžã®éåžžã®ãã€ã³ã¿ã§ãã IPIã®éä¿¡ã«äœ¿çšãããŸãã
- dã 次ã«ãRSDPã¢ãã¬ã¹ãæ€çŽ¢ãããŸãã TSDTããŒãã«ã®ã¢ãã¬ã¹ã決å®ããŸãã RSDTããŒãã«ã«ã¯ãMADTã®ã¢ãã¬ã¹ããããŸãã MADTããŒãã«å
šäœãã¹ãã£ã³ãããããŒã«ã«APICã«é¢é£ãããã¹ãŠã®ãšã³ããªãåæãããŸãã åãšã³ããªã«ã¯LAPIC IDãšã«ãŒãã«ã€ããŒãã«ãã©ã°ãå«ãŸããŠããŸãã ãã®çµæãã·ã¹ãã å
ã«ããæ€åºãããŠå«ãŸãããã¹ãŠã®LAPIC IDã®é
åãåéãããŸãã
- eã 次ã®ã¹ãããã¯ãåããã»ããµã³ã¢ã®ã¹ã¿ãã¯ã§ã¡ã¢ãªãäºçŽããããšã§ãã ã¹ã¿ãã¯ã¯64Kbã§å²ãåœãŠãããç©çã¡ã¢ãªã®5ã¡ã¬ãã€ãããå§ãŸããŸãã
- fã 次ã«ãã¢ã»ã³ãã©ã³ãŒããç©çã¢ãã¬ã¹0x6000ã«ã³ããŒãããAPã®åã³ã¢ãåæåãããŸãã ãã®ã³ãŒãã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãã
- gã ãã®åŸãããã»ããµã³ã¢ã®åAPãèµ·åãããŸãã ãããè¡ãã«ã¯ãç¹å®ã®ãã€ããICRã«æžã蟌ãããšã«ãããINIT-SIPI-SIPIä¿¡å·ãåã³ã¢ã«é 次éä¿¡ãããŸãã ãã®ã³ãŒãã¯ïŒhttp://fxr.watson.org/fxr/source/i386/i386/mp_machdep.cïŒããååŸãããŸãã ã³ãŒããå®è¡ããã«ã¯ã以åã«ååŸããLAPIC IDãšãåæåã³ãŒãã«ããã¢ãã¬ã¹0x6000ã«å¯Ÿå¿ãããã¯ãã«6ã䜿çšãããŸãã
- hã 次ã«ãBSPã¯ãã¹ãŠã®ããã»ããµã³ã¢ããªã³ã«ãªãããšãäºæããŸãããã®ããããªã³ã«ãªã£ãŠããã³ã¢ã®ã«ãŠã³ã¿ãŒãåèšæ°ãšçãããªãç¬éãåŸ
ã¡ãŸãã åAPã³ã¢ã¯ãã®ã«ãŠã³ã¿ãŒã1å¢ãããŸãã
- iã ãã®é¢æ°ã§ãã®äœæ¥ãçµäºããŸãã
2.åAPã§å®è¡ãããã³ãŒãã ãã®ã³ãŒãã¯ã¢ã»ã³ãã©ãŒã§å§ãŸããŸãã smp.cã®å
é ã«ããã«ãããŸãã ãã®ã¢ã»ã³ãã©ã³ãŒãã§ã¯ãåè¡ãã³ã¡ã³ãåãããŠããŸãã ãã®ã¢ã»ã³ãã©ã³ãŒããç°¡åã«èª¬æãããšã次ã®ã¢ã¯ã·ã§ã³ãå®è¡ãããŸãã
- aã ãã©ã°ã¬ãžã¹ã¿ã§ããã€ãã®ãã©ã°ãåéããããŒã¹ã¬ãžã¹ã¿ããªã»ããããŠäœæ¥ãéå§ããŸãã
- bã ããŒãžã³ã°ãªãã§cr0ã«ä¿è·ã¢ãŒããå«ããã
- cã 32ãããã³ãŒãã»ã°ã¡ã³ããžã®ç§»è¡ã
- dã GDTRãšãã¹ãŠã®ã»ã°ã¡ã³ãã32ãããïŒã³ãŒããšããŒã¿ïŒãšããŠããŒãããŸãã
- eã MSRããããŒã¹LAPICã¢ãã¬ã¹ãèªã¿åããŸãã
- fã LAPICã¬ãžã¹ã¿ãèªã¿åãããã®IDã決å®ããŸãïŒçŸåšã®ã«ãŒãã«çšïŒã
- gã çŸåšã®ã«ãŒãã«ã®ã¹ã¿ãã¯ãã€ã³ã¿ãŒãååŸããŸãã åã³ã¢ã§ã¯ãã¡ã¢ãªããã®å人ã¹ã¿ãã¯çšã«äºåã«äºçŽãããŠããŸãã
- hã Cã§ã®é¢æ°åŒã³åºãïŒSmpApMainïŒã
SmpApMainé¢æ°ã¯ãããã»ããµã€ã³ããã¯ã¹ãå®çŸ©ããŸãã ã€ã³ããã¯ã¹ã¯ã0ããNãŸã§ã®çªå·ã§ããããã§ãN-1ã¯ã³ã³ãã¥ãŒã¿ãŒäžã®ã³ã¢ã®ç·æ°ã§ãã 次ã«ãå®è¡äžã®ã³ã¢ã®ã«ãŠã³ã¿ãŒãåæçã«å¢å ããŸããããã¯ããã¹ãŠã®ããã»ããµãŒã®éå§ãåŸ
æ©ããããã«äœ¿çšãããŸãã 次ã«ãããã»ããµã³ã¢ã¯ããã€ããŒãèµ·åãã©ã°ãæå¹ã«ãªãã®ãåŸ
ã¡ãŸãã ãã©ã°ããªã³ã«ãªããšããã«ãap_cpu_workeré¢æ°ãåŒã³åºãããŸã-ããã¯ãã€ããŒãïŒã¬ã€ãã¬ãŒã·ã³ã°ïŒãå®è¡ããŸãã
ã¹ããã5.ã¬ã€ãã¬ãŒã·ã³ã°ã¢ã«ãŽãªãºã ã®è¿œå ã
æãé£ããéšåã¯åŸãã«ãããŸãã ããã§ãã¬ã€ãã¬ãŒã·ã³ã°ã¢ã«ãŽãªãºã ã®åœ¢åŒã§ãã€ããŒããè¿œå ããå¿
èŠããããŸãã ã¢ã«ãŽãªãºã èªäœã¯ãã®èšäºã®ç¯å²å€ã§ããããã
ãããã®ãªãœãŒã¹ããçè«ãšå®è·µãå
¥æã§ããŸãã ã¬ã€ãã¬ãŒã·ã³ã°ã³ãŒãã«ã€ããŠã¯ã³ã¡ã³ãããŸããã 代ããã«ãå®æããã³ãŒããåºç€ãšããŠãããã°ã©ã ã§ã³ã³ãã€ã«ããããã«å€æŽããæ¹æ³ã説æããŸãã
ããããã®ã³ãŒã
ãåºç€ãšããŠã¿ãŸãããã ãã®äžã§ãã¡ã¢ãªãšSTLã®åçå²ãåœãŠãåé€ãããã¹ãŠãéçé
åã«çœ®ãæããå¿
èŠããããŸãã 次ã«ãã¬ã³ããªã³ã°æ©èœãä¿®æ£ããŠãã€ã¡ãŒãžé åã1è¡ãã€ããã¬ã³ããªã³ã°ã§ããªãããã«ããå¿
èŠããããŸãã æåŸã«ãç¹å®ã®ãã©ã¡ãŒã¿ãŒã§renderãåŒã³åºãap_cpu_workeré¢æ°ãå®è£
ããå¿
èŠããããŸãã
1.
ray.cppãã¡ã€ã«ãäœæããŸãã
çµæã®ã³ãŒããããã«ã³ããŒ
ããŸã ã
2.ãã®äžã®è¡ã眮ãæããŸãïŒ
#include <cstdlib> #include <cstdio> #include <cmath> #include <fstream> #include <vector> #include <iostream> #include <cassert>
è¡ããšïŒ
extern "C" { #include "types.h" #include "printf.h" #include "string.h" #include "hardware.h" double tan(double x); double sqrt(double x); double pow (double x, double y); extern int vbe_screen_w; extern int vbe_screen_h; extern ulong vbe_lfb_addr; extern ulong vbe_bytes; extern u32 cpu_count; extern ulong SmpStartedCpus; void SmpReleaseAllAps(); } namespace std { template <class T> const T& max (const T& a, const T& b) { return (a<b)?b:a; // or: return comp(a,b)?b:a; for version (2) } template <class T> const T& min (const T& a, const T& b) { return !(b<a)?a:b; // or: return !comp(b,a)?a:b; for version (2) } }
3.次ã®è¡ãåé€ããŸãã
friend std::ostream & operator << (std::ostream &os, const Vec3<T> &v) { os << "[" << vx << " " << vy << " " << vz << "]"; return os; }
ãããŠãããïŒ
4.亀æïŒ
const std::vector<Sphere<T> *> &spheres, const int &depth)
ãªã³ïŒ
const Sphere<T> **spheres, unsigned spheres_size, const int &depth)
5.
ray.cppãã¡ã€ã«å
šäœ
㧠ã
spheres.sizeïŒïŒã
spheres_sizeã«çœ®ãæã
ãŸãïŒåèš3ã€ã®çœ®ãæãïŒã
6.ã¬ã³ããªã³ã°æ©èœãããã«çœ®ãæããŸãïŒ
void render(const Sphere<T> **spheres, unsigned spheres_size, unsigned y_start, unsigned y_end) { Vec3<T> pixel; T invWidth = 1 / T(vbe_screen_w), invHeight = 1 / T(vbe_screen_h); T fov = 30, aspectratio = vbe_screen_w / T(vbe_screen_h); T angle = tan(M_PI * 0.5 * fov / T(180));
7.ãããã£ãŠããã¡ã€ã«å
šäœã§ãå¥ã®spheres_sizeãã©ã¡ãŒã¿ãŒãè¿œå ããŠããã¬ãŒã¹é¢æ°ã®æ®ãã®2ã€ã®åŒã³åºããä¿®æ£ããŸãã
Vec3<T> reflection = trace(phit + nhit * bias, refldir, spheres, depth + 1);
ã«çœ®ãæããŸãïŒ
Vec3<T> reflection = trace(phit + nhit * bias, refldir, spheres, spheres_size, depth + 1) ;
ãããŠããïŒ
refraction = trace(phit - nhit * bias, refrdir, spheres, depth + 1) ;
ã«ïŒ
refraction = trace(phit - nhit * bias, refrdir, spheres, spheres_size, depth + 1) ;
8.ãã¡ã€ã«ã®æåŸã«ãmainé¢æ°ã®ä»£ããã«ã
ray_mainé¢æ°ãš
ap_cpu_workeré¢æ°ãè¿œå ã
ãŸã ã
#define RAY_SHAPES_COUNT 6 Sphere<float> *ray_spheres[RAY_SHAPES_COUNT]; extern "C" void ap_cpu_worker( int index ) { __enable_fpu(); render<float>((const Sphere<float> **)ray_spheres, 6, vbe_screen_h/cpu_count * index, vbe_screen_h/cpu_count * index + vbe_screen_h/cpu_count); forever(); } extern "C" int ray_main() { Sphere<float> sp1 (Vec3<float>(0, -10004, -20), 10000, Vec3<float>(0.2), 0, 0.0); Sphere<float> sp2 (Vec3<float>(0, 0, -20), 4, Vec3<float>(1.00, 0.32, 0.36), 1, 0.0); Sphere<float> sp3 (Vec3<float>(5, -1, -15), 2, Vec3<float>(0.90, 0.76, 0.46), 1, 0.0); Sphere<float> sp4 (Vec3<float>(5, 0, -25), 3, Vec3<float>(0.65, 0.77, 0.97), 1, 0.0); Sphere<float> sp5 (Vec3<float>(-5.5, 0, -15), 3, Vec3<float>(0.90, 0.90, 0.90), 1, 0.0); Sphere<float> sp6 (Vec3<float>(0, 20, -30), 3, Vec3<float>(0), 0, 0, Vec3<float>(3)); ray_spheres[0] = &sp1; ray_spheres[1] = &sp2; ray_spheres[2] = &sp3; ray_spheres[3] = &sp4; ray_spheres[4] = &sp5; ray_spheres[5] = &sp6; SmpReleaseAllAps(); ap_cpu_worker(0); forever (); return 0; }
ã¹ããã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 \ x86emu/x86emu.o \ x86emu/x86emu_util.o \ smp.o \ ray.o \ kernel.o
2. C ++ãã³ã³ãã€ã«ããç®æšãè¿œå ããŸãã
.cpp.o: $(CC) -Ix86emu -I. -Iustl -Iinclude $(CFLAGS) -o $@ -c $<
3.次ã«ãæ°ããã©ã€ãã©ãªãæ¥ç¶ããããã«ããªã³ã«ãŒã®åŒã³åºãè¡ãå€æŽããå¿
èŠããããŸãã
$(LD) -T linker.ld -o $@ $^ fdlibm/fdlibm.a
4.次ã«ãã©ã€ãã©ãªããã«ãããå¿
èŠããããŸãã
cd fdlibm make rebuild
5.ããã§ããããžã§ã¯ããåæ§ç¯ã§ããŸãã
make rebuild sudo make image
6. 4ã³ã¢ããã»ããµããšãã¥ã¬ãŒããããªãã·ã§ã³ã䜿çšããŠãããžã§ã¯ããå®è¡ãããã¹ãŠãæ©èœããããšã確èªããŸãã
sudo qemu-system-i386 -hda hdd.img âsmp 4
ãã¹ãŠãæ£ããè¡ãããŠããã°ããã®çŸãããèŠããã¯ãã§ãã

èšäºã®åã®éšåãšåæ§ã«ãddã³ãã³ãã䜿çšããŠãhdd.imgã€ã¡ãŒãžãUSBãã©ãã·ã¥ãã©ã€ãã«ã³ããŒããå®éã®ã³ã³ãã¥ãŒã¿ãŒã§ããã°ã©ã ããã¹ãã§ããŸãã
ãã®çµæãææ°ã®ããã»ããµã®ãã¹ãŠã®ã³ã¢ã䜿çšããèå³æ·±ãããã°ã©ã ãã§ããŸããã ãã®èšäºã¯ãæéã®ãããèšç®ã«ãã£ãŠç ãæŸãŸãããããã°ã©ã ãéçºããå¯èœæ§ãéããŸãã åã®èšäºãšåæ§ã«ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããªãããããã¹ãŠã®èšç®ã¯å©çšå¯èœãªãã¹ãŠã®ããŒããŠã§ã¢ãªãœãŒã¹ã䜿çšããŠå®è¡ãããããšã«æ³šæããããšãéèŠã§ãã ããã°ã©ã ã¯å²ã蟌ã¿ããåŠçããŸãã-ãããã¯åã«ãªãã«ãããŸãã ãããã£ãŠãã©ã®é床ã§ãã¹ãŠãæç»ãããããã»ããµã®å®éã®ã³ã³ãã¥ãŒãã£ã³ã°æ©èœã決å®ãããŸãã ãã¡ãããããã°ã©ã ããã¢ã¡ã¿ã«ã§å®è¡ãããå Žåãããã¯ãã¹ãŠåœãŠã¯ãŸããŸãã Intel i5ã¯ããã®å³ãæãã®ã«çŽ800ããªç§ããããŸãã ã³ã¡ã³ãã§ãå®éã®ããŒããŠã§ã¢ã§ååŸããé床ã«é¢ããæ
å ±ãèŠãã®ã¯èå³æ·±ãã§ãããã
ã·ãªãŒãºã®æ¬¡ã®èšäºãžã®ãªã³ã¯ïŒ
ã
ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãªãã§ããã°ã©ã ãå®è¡ããæ¹æ³ïŒ ããŒã5. OSããBIOSã«ã¢ã¯ã»ã¹ãã ã
ã
ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãªãã§ããã°ã©ã ãå®è¡ããæ¹æ³ïŒ ããŒã6. FATãã¡ã€ã«ã·ã¹ãã ã§ãã£ã¹ã¯ãæäœããããã®ãµããŒã ã