ã¯ããã«
ããã«ã¡ã¯ãä»æ¥ã¯æ®éã®ããã°ã©ããŒã«ã¯ã»ãšãã©ç¥ãããŠããªãããªãåçŽãªãããã¯ã«è§ŠããããšæããŸãããçãããããããããããããã䜿çšããã§ãããã
察称åãã«ãããã»ãã·ã³ã°ïŒäžè¬çã«ã¯-SMPïŒ-ãã¹ãŠã®ãã«ãã¿ã¹ã¯ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«èŠãããã¢ãŒããã¯ãã£ã§ããããã¡ãããããã¯äžå¯æ¬ ãªéšåã§ãã ããã»ããµã®ã³ã¢ãå€ããªãã°ãªãã»ã©ãããã»ããµã¯ãã匷åã«ãªãããšã¯èª°ããç¥ã£ãŠããŸãããããã§ãããOSã¯åæã«è€æ°ã®ã³ã¢ãã©ã®ããã«äœ¿çšã§ããŸããïŒ äžéšã®ããã°ã©ããŒã¯ããã®ã¬ãã«ã®æœè±¡åã«ã¯è³ããŸãã-圌ãã¯åã«ãããå¿ èŠãšããŸãããã誰ããSMPã®ä»çµã¿ã«èå³ããããšæããŸãã
ãã«ãã¿ã¹ã¯ãšãã®å®è£
ã³ã³ãã¥ãŒã¿ã¢ãŒããã¯ãã£ãç 究ããããšããã人ã¯ãããã»ããµèªäœãäžåºŠã«è€æ°ã®ã¿ã¹ã¯ãå®è¡ã§ããªãããšãç¥ã£ãŠããŸãããã«ãã¿ã¹ã¯ã§ã¯ããããã®ã¿ã¹ã¯ãåãæ¿ããOSã®ã¿ãæäŸãããŸãã ãã«ãã¿ã¹ã¯ã«ã¯ããã€ãã®çš®é¡ããããŸãããæãé©åã§äŸ¿å©ã§åºã䜿çšãããŠããã®ã¯ããã«ãã¿ã¹ã¯ãæ··éãããããšã§ãïŒãŠã£ãããã£ã¢ã§ãã®äž»ãªåŽé¢ãèªãããšãã§ããŸãïŒã ããã¯ãåããã»ã¹ïŒã¿ã¹ã¯ïŒãç¬èªã®åªå 床ãæã£ãŠãããšããäºå®ã«åºã¥ããŠããããã®åªå 床ã¯ãããã«å²ãåœãŠãããããã»ããµæéã®éã«åœ±é¿ããŸãã åã¿ã¹ã¯ã«ã¯1ã€ã®ã¿ã€ã ã¹ã©ã€ã¹ãäžãããããã®éã«ããã»ã¹ãäœããå®è¡ããŸã;ã¿ã€ã ã¹ã©ã€ã¹ãæéåãã«ãªããšãOSã¯å¥ã®ã¿ã¹ã¯ã«å¶åŸ¡ãæž¡ããŸãã 質åãçºçããŸã-ã¡ã¢ãªãããã€ã¹ãªã©ã®ã³ã³ãã¥ãŒã¿ãŒãªãœãŒã¹ãé åžããæ¹æ³ã ããã»ã¹éïŒ ãã¹ãŠãéåžžã«ç°¡åã§ããWindowsã¯ããèªäœãè¡ããLinuxã¯ã»ããã©ã·ã¹ãã ã䜿çšããŸãã ãã ãã1ã€ã®ã³ã¢ã¯æ·±å»ã§ã¯ãããŸããã
å²ã蟌ã¿ãšPIC
ããããããã¯ãã¥ãŒã¹ã«ãªããŸãããäžéšã¯ããã§ã¯ãããŸããããi386ã¢ãŒããã¯ãã£ïŒx86ã¢ãŒããã¯ãã£ã«ã€ããŠã¯èª¬æããŸãããARMã¯èæ ®ããŸããã ïŒäžéšã®ãµãŒãã¹ãŸãã¯åžžé§ããã°ã©ã ãäœæããã¬ãã«ã§ãïŒãOSãŸãã¯ããã°ã©ã ã«ã€ãã³ããéç¥ããããã«ãå²ã蟌ã¿ïŒããŒããŠã§ã¢å²ã蟌ã¿ãIRQã«ã€ããŠã®ã¿èª¬æããŸãïŒã䜿çšããŸãã ããšãã°ãPITã«ãã£ãŠåŒã³åºãããå²ã蟌ã¿0x8ïŒPICã®æ§ææ¹æ³ã«å¿ããŠãããšãã°0x20ãªã©ã®ä¿è·ã¢ãŒããšãã³ã°ã¢ãŒãã®å ŽåïŒããããŸããããã¯ãããšãã°ãå¿ èŠãªé »åºŠã§å²ã蟌ã¿ãçæã§ããŸãã 次ã«ãã¿ã€ã ã¹ã©ã€ã¹ã®é åžã«å¯ŸããOSã®åäœã0ã«æžããå²ã蟌ã¿ãåŒã³åºããããšããã°ã©ã ãåæ¢ããããšãã°ã«ãŒãã«ã«å¶åŸ¡ãäžããããçŸåšã®ããã°ã©ã ããŒã¿ïŒã¬ãžã¹ã¿ããã©ã°ãªã©ïŒãä¿åããã次ã®ããã»ã¹ã«å¶åŸ¡ãäžããããŸãã
ãããããåç¥ã®ããã«ãå²ã蟌ã¿ãšã¯ãããæç¹ã§ãæ©åšãŸãã¯ããã°ã©ã èªäœã«ãã£ãŠåŒã³åºãããé¢æ°ïŒãŸãã¯ããã·ãŒãžã£ïŒã§ãã åèšã§ãããã»ããµã¯2ã€ã®PICã§16ã®å²ã蟌ã¿ããµããŒãããŸãã ããã»ããµã«ã¯ãã©ã°ãããããã®ãã¡ã®1ã€ã¯ãIããã©ã°-å²ã蟌ã¿å¶åŸ¡ã§ãã ãã®ãã©ã°ã0ã«èšå®ãããšãããã»ããµã¯ããŒããŠã§ã¢ã®äžæãåŒãèµ·ãããŸããã ãã ãããããIã0ã«èšå®ãããŠããå Žåã§ããããããNMIïŒãã¹ã¯äžå¯èœãªå²ã蟌ã¿ïŒãååšããããšã«æ³šæããŠãã ãããPICããã°ã©ãã³ã°ã䜿çšãããšãå²ã蟌ã¿ããŒã¿ãç¡å¹ã«ã§ããŸãã IRET-圌ãã¯åã³çŠæ¢ãããŸããã éåžžã®ããã°ã©ã ã®äžã§ã¯ãå²ã蟌ã¿åŒã³åºãã远跡ã§ããªãããšã«æ³šæããŠãã ãã-ããã°ã©ã ã¯åæ¢ããŠãã°ããããŠããåéããŸãããããã°ã©ã ã¯æ°ã¥ãããããŸããïŒã¯ããå²ã蟌ã¿ãåŒã³åºãããããšã確èªã§ããŸã-ãªãã§ããïŒ
PIC-ããã°ã©ããã«å²ã蟌ã¿ã³ã³ãããŒã©ãŒ
ãŠã£ãããïŒ
ååãšããŠãããã¯ããã»ããµèªäœãŸãã¯ãã®ãã¬ãŒã ã®è€éãªãããã®äžéšãšããŠäœæãããé»åããã€ã¹ã§ããããã®å ¥åã¯ããŸããŸãªããã€ã¹ã®å¯Ÿå¿ããåºåã«é»æ°çã«æ¥ç¶ãããŸãã å²ã蟌ã¿ã³ã³ãããŒã©ã®å ¥åçªå·ã¯ãIRQãã§ç€ºãããŸãã ãã®çªå·ã¯ãå²ã蟌ã¿åªå é äœãšãå²ã蟌ã¿ãã¯ãã«ã®ããŒãã«ïŒINTïŒãžã®ãšã³ããªã®çªå·ãšãåºå¥ããå¿ èŠããããŸãã ãã®ãããããšãã°ãããã»ããµã®ãªã¢ã«ã¢ãŒãïŒMS-DOSã¯ãã®ã¢ãŒãã§åäœïŒã®IBM PCã§ã¯ãæšæºããŒããŒãããã®å²ã蟌ã¿ã¯IRQ 1ãšINT 9ã䜿çšããŸãã
å ã®IBM PCãã©ãããã©ãŒã ã¯ãéåžžã«åçŽãªå²ã蟌ã¿ã¹ããŒã ã䜿çšããŠããŸãã å²ã蟌ã¿ã³ã³ãããŒã©ãŒã¯ãç°ãªãããã€ã¹ã®ä¿¡å·ãé çªã«ç¹°ãè¿ãããæ°ããå²ã蟌ã¿ãèŠã€ãã£ããšãã«æåã«ãªã»ãããããåçŽãªã«ãŠã³ã¿ãŒã§ãã åè ã®å Žåãããã€ã¹ã®åªå 床ã¯çãããåŸè ã®å Žåãã·ãªã¢ã«çªå·ãå°ããïŒãŸãã¯ã«ãŠã³ãã倧ããïŒããã€ã¹ã®åªå 床ãé«ããªããŸãã
ãæ¿ç¥ã®ãšãããããã¯ããã€ã¹ãå²ã蟌ã¿èŠæ±ãéä¿¡ã§ããããã«ããé»ååè·¯ã§ãããéåžžã¯æ£ç¢ºã«2ã€ãããŸãã
ããã§ã¯ãèšäºã®ãããã¯ã«ç§»ããŸãããã
SMP
ãã®æšæºãå®è£ ããããã«ãæ°ããã¹ããŒã ããã¶ãŒããŒãã«è¿œå ããå§ããŸããïŒAPICãšACPIã æåã®è©±ãããŸãããã
APIC-é«åºŠãªããã°ã©ããã«å²ã蟌ã¿ã³ã³ãããŒã©ãŒãPICã®æ¹è¯ããŒãžã§ã³ã ãã«ãããã»ããµã·ã¹ãã ã§äœ¿çšããããã¹ãŠã®ææ°ã®Intelããã»ããµã®äžå¯æ¬ ãªéšåã§ãïŒããã³äºææ§ããããŸãïŒã APICã¯ãè€éãªå²ã蟌ã¿è»¢éããã³ããã»ããµéã®å²ã蟌ã¿éä¿¡ã«äœ¿çšãããŸãã ãããã®ããšã¯ãå€ãPICä»æ§ã§ã¯äžå¯èœã§ããã
ããŒã«ã«APICããã³IO APIC
APICããŒã¹ã®ã·ã¹ãã ã§ã¯ãåããã»ããµã¯ãã³ã¢ããšãããŒã«ã«APICãã§æ§æãããŠããŸãã ããŒã«ã«APICã¯ãããã»ããµåºæã®å²ã蟌ã¿æ§æãåŠçããŸãã ãšãããããå éšã¯ããã¯ãããã®ä»ã®ãããŒã«ã«ãå²ã蟌ã¿ãœãŒã¹ãªã©ã®ã€ãã³ããå²ã蟌ã¿ãã¯ãã«ã«å€æããããŒã«ã«ãã¯ã¿ãŒããŒãã«ïŒLVTïŒãå«ãŸããŠããŸãïŒããšãã°ãé£çµ¡å LocalINT1ã¯NMIäŸå€ãçºçããã 2â察å¿ããLVTå ¥åã«ïŒã
ããŒã«ã«APICã®è©³çŽ°ã«ã€ããŠã¯ãææ°ã®Intelããã»ããµã®ãã·ã¹ãã ããã°ã©ãã³ã°ã¬ã€ãããåç §ããŠãã ããã
ããã«ãAPIC IOïŒããšãã°ãIntel 82093AAïŒããããŸããããã¯ããããã»ããã®äžéšã§ããããã¹ãŠã®ããã»ããµã®éçããã³åç察称å²ã蟌ã¿ã®äž¡æ¹ãå«ããã«ãããã»ããµå²ã蟌ã¿å¶åŸ¡ãæäŸããŸãã è€æ°ã®I / Oãµãã·ã¹ãã ãæã€ã·ã¹ãã ã§ã¯ãåãµãã·ã¹ãã ãç¬èªã®å²ã蟌ã¿ã»ãããæã€ããšãã§ããŸãã
åå²ã蟌ã¿ãã³ã¯ããšããžãŸãã¯ã¬ãã«ããªã¬ãŒãšããŠåå¥ã«ããã°ã©ã ãããŸãã å²ã蟌ã¿ãã¯ãã«ãšå²ã蟌ã¿å¶åŸ¡æ å ±ã¯ãå²ã蟌ã¿ããšã«æå®ã§ããŸãã éæ¥çãªã¬ãžã¹ã¿ã¢ã¯ã»ã¹ã¹ããŒã ã¯ãå éšAPIC I / Oã¬ãžã¹ã¿ã«ã¢ã¯ã»ã¹ããããã«å¿ èŠãªã¡ã¢ãªç©ºéãæé©åããŸãã ã¡ã¢ãªç©ºéãå²ãåœãŠãéã®ã·ã¹ãã ã®æè»æ§ãé«ããããã«ã2ã€ã®APIC I / Oã¬ãžã¹ã¿ã¯åé 眮å¯èœã§ãããããã©ã«ãã¯0xFEC00000ã§ãã
ãããŒã«ã«ãAPICã®åæå
ããŒã«ã«APICã¯ããŒãæã«ã¢ã¯ãã£ãã«ãªããããã11 IA32_APIC_BASEïŒMSRïŒããªã»ããããããšã§ç¡å¹ã«ã§ããŸãïŒããã¯ãPentiumã«ãã®ãããªMSRããªãããããã¡ããªã5ãè¶ ããããã»ããµã§ã®ã¿æ©èœããŸãïŒã次ã«ãããã»ããµã¯äºææ§ã®ãã8259 PICããå²ã蟌ã¿ãåãåããŸãã ãã ããIntelã®ãœãããŠã§ã¢éçºã¬ã€ãã«ã¯ãIA32_APIC_BASEãä»ããŠããŒã«ã«APICãç¡å¹ã«ããåŸãå®å šã«ãªã»ããããããŸã§æå¹ã«ã§ããªãããšãèšèŒãããŠããŸãã APO IOã¯ã8259ããã€ã¹ããšãã¥ã¬ãŒãããããã«ã¬ã¬ã·ãŒã¢ãŒãã§åäœããããã«æ§æããããšãã§ããŸãã
ããŒã«ã«APICã¬ãžã¹ã¿ã¯ãç©çããŒãžFEE00xxxã«ããããããŸãïŒè¡š8-1 Intel P4 SPGãåç §ïŒã ãã®ã¢ãã¬ã¹ã¯ãæ§æå ã«ååšããåããŒã«ã«APICã§åãã§ããã€ãŸããçŸåšã³ãŒããå®è¡ãããŠããããŒã«ã«APICã«ãŒãã«ã®ã¬ãžã¹ã¿ã«çŽæ¥ã¢ã¯ã»ã¹ã§ããŸãã å®éã®APICããŒã¹ãå®çŸ©ããMSRãããããšã«æ³šæããŠãã ããïŒãã¡ããªã5ãè¶ ããããã»ããµã§ã®ã¿äœ¿çšå¯èœïŒã MADTã«ã¯ããŒã«ã«APICããŒã¹ãå«ãŸããŸãã64ãããã·ã¹ãã ã§ã¯ãããŒã¹ã¢ãã¬ã¹ã®64ãããåå®çŸ©ãæå®ãããã£ãŒã«ããå«ãŸããå Žåãããã代ããã«äœ¿çšããå¿ èŠããããŸãã ããŒã«ã«APICããŒã¹ã¯ãèŠã€ããå Žæã ãã«æ®ãããšãã奜ããªå Žæã«ç§»åããããšãã§ããŸãã 泚ïŒ4 GBã®RAMãè¶ ããŠç§»åã§ãããšã¯æããªãã
ããŒã«ã«APICãå²ã蟌ã¿ãåä¿¡ã§ããããã«ããã«ã¯ãã¹ããªã¢ã¹å²ã蟌ã¿ãã¯ãã«ã¬ãžã¹ã¿ãæ§æããå¿ èŠããããŸãã ãã®ãã£ãŒã«ãã®æ£ããå€ã¯ãäžäœ8ãããã®åœå²ã蟌ã¿ã«ãããããIRQçªå·ã§ããã8ãããç®ã1ã«èšå®ããŠAPICãå®éã«æå¹ã«ããŸãïŒè©³çŽ°ã«ã€ããŠã¯ä»æ§ãåç §ïŒã äžäœ4ããããèšå®ãããŠããå²ã蟌ã¿çªå·ãéžæããå¿ èŠããããŸãã æãç°¡åãªæ¹æ³ã¯0xFFã䜿çšããããšã§ãã äžéšã®å€ãããã»ããµã§ã¯ããããã®å€ã®äžäœ4ãããã1ã«èšå®ããå¿ èŠããããããããã¯éèŠã§ãã
8259 PICãæ£ããç¡å¹ã«ããŸãã ããã¯ãAPICã®æ§æãšã»ãŒåããããéèŠã§ãã ããã¯2ã€ã®ã¹ãããã§è¡ããŸãããã¹ãŠã®å²ã蟌ã¿ããã¹ã¯ããIRQãåå²ãåœãŠããŸãã ãã¹ãŠã®å²ã蟌ã¿ããã¹ã¯ãããšãPICã§ããããç¡å¹ã«ãªããŸãã å²ã蟌ã¿ã®åãããã³ã°ã¯ãããããPICã䜿çšãããšãã«æ¢ã«è¡ã£ãããšã§ããäŸå€ãšã®ç«¶åãé¿ããããã«ãå²ã蟌ã¿èŠæ±ã0ã§ã¯ãªã32ã§éå§ããå¿ èŠããããŸããæåã®32åã®å²ã蟌ã¿ã¯äŸå€ã§ãïŒã 次ã«ããããã®å²ã蟌ã¿ãã¯ãã«ãä»ã®ç®çã«äœ¿çšããªãã§ãã ããã ããã¯ããã¹ãŠã®PICå²ã蟌ã¿ããã¹ã¯ããã«ããããããã誀ã£ãå²ã蟌ã¿ãã¹ããŒããå¯èœæ§ããããã«ãŒãã«ã§äŸå€ãšããŠèª€ã£ãŠåŠçãããå¯èœæ§ãããããã§ãã
SMPã«ç§»ããŸãããã
察称ãã«ãã¿ã¹ã¯ïŒåæå
èµ·åã·ãŒã±ã³ã¹ã¯ãCPUã«ãã£ãŠç°ãªããŸãã ã€ã³ãã«ããã°ã©ããŒãºã¬ã€ãïŒç¬¬7.5.4é ïŒã«ã¯ãã€ã³ãã«Xeonããã»ããµãŒçšã®åæåãããã³ã«ãå«ãŸããŠãããå€ãããã»ããµãŒã«ã€ããŠã¯èª¬æããŠããŸããã äžè¬çãªããã¹ãŠã®ããã»ããµã¿ã€ããã¢ã«ãŽãªãºã ã«ã€ããŠã¯ãIntel Multiprocessor Specificationãåç §ããŠãã ããã
80486ã®å ŽåïŒå€éšAPIC 8249DXã䜿çšïŒãIPIT INITã«ç¶ããŠIPIãINITã¬ãã«ã®ã¢ãµãŒã解é€ããSIPIãªãã§äœ¿çšããå¿ èŠããããŸãã ã€ãŸããã³ãŒãã®å®è¡ãéå§ããå ŽæïŒSIPIã®ãã¯ãã«éšåïŒãäŒããããšãã§ãããåžžã«BIOSã³ãŒãã®å®è¡ãéå§ããŸãã ãã®å ŽåãBIOSãjmp farã[0ïŒ0x0469]ãå®è¡ããããã«ãCMOS BIOSãªã»ããå€ãããã¡ãŒãžã£ã³ãã§ãŠã©ãŒã ã¹ã¿ãŒããã«èšå®ïŒã€ãŸããCMOS 0x0Fã10ã«èšå®ïŒããŠãããã»ã°ã¡ã³ããšãªãã»ãããèšå®ããŸãAPãšã³ããªãã€ã³ãã¯0x0469ã§ãã
ãINITã¬ãã«ã®ã¢ãµãŒã解é€ãIPIã¯æ°ããããã»ããµïŒPentium 4ããã³Intel XeonïŒã§ã¯ãµããŒããããŠãããããããã®ããã»ããµã§ã¯AFAIKã¯å®å šã«ç¡èŠãããŸãã
æ°ããããã»ããµïŒP6ãPentium 4ïŒã§ã¯1ã€ã®SIPIã§ååã§ãããå€ãIntelããã»ããµïŒPentiumïŒãŸãã¯ä»ã®ã¡ãŒã«ãŒã®ããã»ããµã«2çªç®ã®SIPIãå¿ èŠãã©ããã¯ããããŸããã ãŸããæåã®SIPIïŒãã¹ãã€ãºãªã©ïŒã®é ä¿¡ã«å€±æããå Žåã«ã2çªç®ã®SIPIãååšããå¯èœæ§ããããŸãã
éåžžãæåã®SIPIãéä¿¡ããŠãããAPãå®è¡äžã®ããã»ããµã®æ°ãå¢ãããã©ããã確èªããŸãã æ°ããªç§ä»¥å ã«ãã®ã«ãŠã³ã¿ãå¢å ããªãå Žåã2çªç®ã®SIPIãéä¿¡ããŸãã ããã¯äžè¬çãªIntelã¢ã«ãŽãªãºã ïŒSIPIéã§200ãã€ã¯ãç§ã®é 延ãããïŒãšã¯ç°ãªããŸãããåæããŒãäžã«200ãã€ã¯ãç§ã®é 延ãæ£ç¢ºã«æž¬å®ã§ããã¿ã€ã ãœãŒã¹ãèŠã€ããããšã¯ããã»ã©ç°¡åã§ã¯ãããŸããã ãŸããå®éã®ããŒããŠã§ã¢ã§ã¯ãSIPIéã®é 延ãé·ãããå ŽåïŒãããŠç§ã®æ¹æ³ã䜿çšããŠããªãå ŽåïŒãã¡ã€ã³APãOSã®åæAPèµ·åã³ãŒãã2åå®è¡ã§ããããšãããããŸããïŒãã®å ŽåãOSã¯å®éã®2åã®ããã»ããµããããŸãïŒã
ãããã®ä¿¡å·ããã¹ã§ãããŒããã£ã¹ãããŠãååšããåããã€ã¹ãéå§ã§ããŸãã ãã ããç¹å¥ã«ç¡å¹ã«ãããããã»ããµããªã³ã«ããããšãã§ããŸãïŒãæ¬ é¥ãã§ããããïŒã
MTããŒãã«ã䜿çšããŠæ å ±ãæ€çŽ¢ãã
ãã«ãããã»ãã·ã³ã°åãã®äžéšã®æ å ±ïŒæ°ãããã·ã³ã§ã¯å©çšã§ããªãå ŽåããããŸãïŒã æåã«ãMPæµ®åãã€ã³ã¿ãŒæ§é ãèŠã€ããå¿ èŠããããŸãã 16ãã€ãã®å¢çã«é 眮ãããã_ MP_ããŸãã¯0x5F504D5Fã®å é ã«çœ²åãå«ãŸããŠããŸãã OSã¯EBDAãBIOS ROMã¹ããŒã¹ãããã³ãããŒã¹ã¡ã¢ãªãã®æåŸã®ãããã€ãã調ã¹ãå¿ èŠããããŸãã ããŒã¹ã¡ã¢ãªã®ãµã€ãºã¯ããããã€ãåäœã®0x413ãã1 KBãåŒãã2ãã€ãã®å€ã§æå®ãããŸãã ããã¯æ§é ãã©ã®ããã«èŠãããã§ãïŒ
struct mp_floating_pointer_structure { char signature[4]; uint32_t configuration_table; uint8_t length; // In 16 bytes (eg 1 = 16 bytes, 2 = 32 bytes) uint8_t mp_specification_revision; uint8_t checksum; // This value should make all bytes in the table equal 0 when added together uint8_t default_configuration; // If this is not zero then configuration_table should be // ignored and a default configuration should be loaded instead uint32_t features; // If bit 7 is then the IMCR is present and PIC mode is being used, otherwise // virtual wire mode is; all other bits are reserved }
ãã€ã³ã¿ã®ãããŒãã£ã³ã°æ§é ãæãæ§æããŒãã«ã¯æ¬¡ã®ãšããã§ãã
struct mp_configuration_table { char signature[4]; // "PCMP" uint16_t length; uint8_t mp_specification_revision; uint8_t checksum; // Again, the byte should be all bytes in the table add up to 0 char oem_id[8]; char product_id[12]; uint32_t oem_table; uint16_t oem_table_size; uint16_t entry_count; // This value represents how many entries are following this table uint32_t lapic_address; // This is the memory mapped address of the local APICs uint16_t extended_table_length; uint8_t extended_table_checksum; uint8_t reserved; }
æ§æããŒãã«ã®åŸã«ã¯ãentry_countãšãããšã³ããªããããããã«ã¯ã·ã¹ãã ã«é¢ãã詳现æ å ±ãå«ãŸãããã®åŸã«æ¡åŒµããŒãã«ãç¶ããŸãã ãšã³ããªã¯ãããã»ããµãè¡šã20ãã€ãããŸãã¯ä»ã®äœããè¡šã8ãã€ãã§ãã APICããã»ããµãšI / Oã¬ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
struct entry_processor { uint8_t type; // Always 0 uint8_t local_apic_id; uint8_t local_apic_version; uint8_t flags; // If bit 0 is clear then the processor must be ignored // If bit 1 is set then the processor is the bootstrap processor uint32_t signature; uint32_t feature_flags; uint64_t reserved; }
IO APICãšã³ããªã¯æ¬¡ã®ãšããã§ãã
struct entry_io_apic { uint8_t type; // Always 2 uint8_t id; uint8_t version; uint8_t flags; // If bit 0 is set then the entry should be ignored uint32_t address; // The memory mapped address of the IO APIC is memory }
APICã䜿çšããŠæ å ±ãæ€çŽ¢ãã
MAPIããŒãã«ïŒAPICïŒã¯ACPIã«ãããŸãã ãã®è¡šã«ã¯ãããŒã«ã«APICããªã¹ããããŠããããã®æ°ã¯ããã»ããµã®ã³ã¢ã®æ°ã«å¯Ÿå¿ããŠããå¿ èŠããããŸãã ãã®è¡šã®è©³çŽ°ã¯ããã«ã¯ãããŸããããã€ã³ã¿ãŒãããã§èŠã€ããããšãã§ããŸãã
APãèµ·å
æ å ±ãåéããããPICãç¡å¹ã«ããAPIC I / Oã®æºåãããå¿ èŠããããŸãã ãŸããããŒã«ã«APICã®BSPãæ§æããå¿ èŠããããŸãã 次ã«ãSIPIã䜿çšããŠAPãèµ·åããŸãã
ã«ãŒãã«ãèµ·åããããã®ã³ãŒãïŒ
èµ·åæã«æå®ãããã¯ãã«ã¯ãéå§ã¢ãã¬ã¹ã瀺ãããšã«æ³šæããŠãã ããããã¯ãã«0x8-ã¢ãã¬ã¹0x8000ããã¯ãã«0x9-ã¢ãã¬ã¹0x9000ãªã©ã§ãã
// ------------------------------------------------------------------------------------------------ static u32 LocalApicIn(uint reg) { return MmioRead32(*g_localApicAddr + reg); } // ------------------------------------------------------------------------------------------------ static void LocalApicOut(uint reg, u32 data) { MmioWrite32(*g_localApicAddr + reg, data); } // ------------------------------------------------------------------------------------------------ void LocalApicInit() { // Clear task priority to enable all interrupts LocalApicOut(LAPIC_TPR, 0); // Logical Destination Mode LocalApicOut(LAPIC_DFR, 0xffffffff); // Flat mode LocalApicOut(LAPIC_LDR, 0x01000000); // All cpus use logical id 1 // Configure Spurious Interrupt Vector Register LocalApicOut(LAPIC_SVR, 0x100 | 0xff); } // ------------------------------------------------------------------------------------------------ uint LocalApicGetId() { return LocalApicIn(LAPIC_ID) >> 24; } // ------------------------------------------------------------------------------------------------ void LocalApicSendInit(uint apic_id) { LocalApicOut(LAPIC_ICRHI, apic_id << ICR_DESTINATION_SHIFT); LocalApicOut(LAPIC_ICRLO, ICR_INIT | ICR_PHYSICAL | ICR_ASSERT | ICR_EDGE | ICR_NO_SHORTHAND); while (LocalApicIn(LAPIC_ICRLO) & ICR_SEND_PENDING) ; } // ------------------------------------------------------------------------------------------------ void LocalApicSendStartup(uint apic_id, uint vector) { LocalApicOut(LAPIC_ICRHI, apic_id << ICR_DESTINATION_SHIFT); LocalApicOut(LAPIC_ICRLO, vector | ICR_STARTUP | ICR_PHYSICAL | ICR_ASSERT | ICR_EDGE | ICR_NO_SHORTHAND); while (LocalApicIn(LAPIC_ICRLO) & ICR_SEND_PENDING) ; } void SmpInit() { kprintf("Waking up all CPUs\n"); *g_activeCpuCount = 1; uint localId = LocalApicGetId(); // Send Init to all cpus except self for (uint i = 0; i < g_acpiCpuCount; ++i) { uint apicId = g_acpiCpuIds[i]; if (apicId != localId) { LocalApicSendInit(apicId); } } // wait PitWait(200); // Send Startup to all cpus except self for (uint i = 0; i < g_acpiCpuCount; ++i) { uint apicId = g_acpiCpuIds[i]; if (apicId != localId) LocalApicSendStartup(apicId, 0x8); } // Wait for all cpus to be active PitWait(10); while (*g_activeCpuCount != g_acpiCpuCount) { kprintf("Waiting... %d\n", *g_activeCpuCount); PitWait(10); } kprintf("All CPUs activated\n"); }
[org 0x8000] AP: jmp short bsp ; - BSP xor ax,ax mov ss,ax mov sp, 0x7c00 xor ax,ax mov ds,ax ; Mark CPU as active lock inc byte [ds:g_activeCpuCount] ; , jmp zop bsp: xor ax,ax mov ds,ax mov dword[ds:g_activeCpuCount],0 mov dword[ds:g_activeCpuCount],0 mov word [ds:0x8000], 0x9090 ; JMP 2 NOP' ; ,
ä»ãããªããç解ããŠããããã«ãOSãå€ãã®ã³ã¢ã䜿çšããã«ã¯ãåã³ã¢ãåã³ã¢ããã®å²ã蟌ã¿ãªã©ã«ã¹ã¿ãã¯ãæ§æããå¿ èŠããããŸãããæãéèŠãªããšã¯ã察称ãã«ãããã»ãã·ã³ã°ã䜿çšããå Žåããã¹ãŠã®ã³ã¢ãåããªãœãŒã¹ãæã£ãŠããããšã§ãïŒ1ã€ã®ã¡ã¢ãªã 1ã€ã®PCIãªã©ãOSã¯ã³ã¢éã®ã¿ã¹ã¯ã®ã¿ã䞊ååã§ããŸãã
ãã®èšäºãéå±ã§ã¯ãªããéåžžã«æçã§ããããšãé¡ã£ãŠããŸãã 次åã¯ãã·ã§ãŒããŒãã¯ãŒã«ãªãããªã«ãŒãã䜿çšããã«ãç»é¢ã«æç»ããæ¹æ³ã«ã€ããŠèª¬æã§ãããšæããŸãïŒãããŠä»ã§ã¯æç»ããŸãïŒã
é 匵ã£ãŠ