GDTãšIDT

Global Descriptor TableãšInterrupt Descriptor Tableãçè§£ãããã

GDT
16Bitæä»£ã«ã¡ã¢ãªã®ã¢ã¯ã»ã¹å¶åŸ¡ãããããã«äœ¿ã£ãŠããæ©èœãçŸä»£ã§ã¯Legacy BIOSã®èµ·åããã»ã¹ã«ãããŠä¿è·ã¢ãŒãã«ç§»è¡ããããã«äœ¿ããããçŸä»£ã§ã¯UEFIã«ç§»è¡ããã®ã§åœ¹å²ãçµããŠããæããããã

IDT
å²ã蟌ã¿åŠçãè¡ãããæã«ãå®è¡ããåœä»€ãèšå®ããæ©èœãããŒããŒãã®å ¥åãšããåŠçããã®ã«äœ¿ãããŠããã

ãããã¯ååã䌌ãŠããããæäŸããæ©èœã¯å šãå¥ç©ã§ãããèšå®ã®ããæ¹ã¯ãã䌌ãŠããã

GDTãšã¯ãCPUããèŠããã¡ã¢ãªã®ã¢ã¯ã»ã¹å¶åŸ¡ã®èšå®ãè¡ãæ©èœã§ããã
Intel CPUã¯ãCSã¬ãžã¹ã¿ã®äžäœ2bitsã䜿ã£ãŠããŠãŒã¶ãŒã¢ãŒããšç¹æš©ã¢ãŒããåãæ¿ããªãåŠçããã
- CPUããŠãŒã¶ãŒã¢ãŒãïŒCSã¬ãžã¹ã¿ã®äžäœ2ãããã'11'ïŒã®ãšããã«ãŒãã«ã®ã¡ã¢ãªé åã¯èŠããªãããªãã
- CPUãç¹æš©ã¢ãŒãïŒCSã¬ãžã¹ã¿ã®äžäœ2ãããã'00'ïŒã®ãšããã«ãŒãã«ã®ã¡ã¢ãªé åãšãŠãŒã¶ãŒã®ã¡ã¢ãªé åãèŠããã
ããŒããŠã§ã¢ã¬ãã«ã§ã¡ã¢ãªã®ã¢ã¯ã»ã¹æš©éã®åãæ¿ããã«æäŸããããšã§ãäžã€ã®ããœã³ã³ã§è€æ°ã®åŠçãå®è¡ã§ããŠããã

GDTã§ã¡ã¢ãªã®ã¢ã¯ã»ã¹æš©éãå¶åŸ¡ããæ¹æ³ã説æãããGDTã䜿ãã«ã¯ãGDTé åãšGDTRã®äºã€ãæå®ããå¿ èŠãããã
- GDTé åã8ãã€ãã®ã»ã°ã¡ã³ããæå€§256å䞊ãã§ããé åã§ãããGDTé åã®ã»ã°ã¡ã³ãã«ã¯ãç¹å®ã®ã¡ã¢ãªé åãã©ã®æš©éã§ã¢ã¯ã»ã¹ã§ããããèšå®ããã
- GDTRãGDTé åã®å€§ãããšãGDTãã¡ã¢ãªã®ã©ã®çªå°ããå§ãŸãã®ããæå®ããã¬ãžã¹ã¿ã§ããã
ïŒãã®èª¬æã§ã¯ãGDTã¯CPUã®æ©èœã衚ããGDTãèšå®ããé åã®ããšãGDTé åãšåŒãã§ãããç§ãç¬èªã«äœã£ãåŒã³æ¹ãªã®ã§ã瀟äŒã§ã¯éçšããªããšæããŸããïŒ

GDTã¯Legacy BIOSã®èµ·åããã»ã¹ã«ãããŠããªã¢ã«ã¢ãŒãããä¿è·ã¢ãŒãã«åãæ¿ããã®ã«å©çšãããããã以å€ã§ã¯ããŸãå©çšãããªããïŒããã«èšãã°ãããUEFIã«ãªã£ãã®ã§ãã®èŸºã¯çè§£ããå¿ èŠãããªããããããªãïŒ
Legacy BIOSã®èµ·åããã»ã¹ã§ã¯ã以äžã®3ã€ã®ã»ã°ã¡ã³ããæå®ããã
- nullã»ã°ã¡ã³ãïŒããã¯GDTã®æåã¯å¿ ãããã§ãªããšãããªãïŒ
- ã³ãŒãã»ã°ã¡ã³ãïŒç¹æš©ã®èªã¿èŸŒã¿ãèšå®ããïŒ
- ããŒã¿ã»ã°ã¡ã³ãïŒç¹æš©ã®æžã蟌ã¿ãèšå®ããïŒ
Legacy BIOSã®èµ·åããã»ã¹ã«ãããŠã¯ãã³ãŒãã»ã°ã¡ã³ããšããŒã¿ã»ã°ã¡ã³ãã«ã¯ä¿è·ã¢ãŒãã«ç§»è¡ãããããã³ãŒãã眮ããããä¿è·ã¢ãŒãã«ç§»è¡ããã³ãŒããå®è¡ãããŠãããGDTã¯åœ¹å²ãçµããã

IDTãšã¯ãå²ã蟌ã¿åŠçãè¡ããããšãã«ãå®è¡ããåŠçã®ã¡ã¢ãªçªå°ãæå®ããæ©èœã§ããã
äŸãã°ããŒããŒãã«å
¥åããã£ãæã«ã¯ãCPUã¯ãã®å
¥åãåªå
ããŠå®è¡ããã
ããŒããŒããå
¥åãããæã®åŠçãèšå®ããã®ããIDTã§ããã

IDTã䜿ãããã«ã¯ãIDTé åãšIDTRãèšå®ããå¿ èŠãããã
- IDTé åãšã¯ã8bytesããšã«æå€§256åã®é åã§æ§æãããã
- IDTRã«ã¯ãIDTé åã®ãµã€ãºãšãIDTãã¡ã¢ãªã®ã©ã®çªå°ããå§ãŸãã®ããæå®ããã
ã¡ãªã¿ã«IDTã«ãæš©éãèšå®ã§ããã«ãŒãã«ããããåŒã³åºããªãå²ã蟌ã¿åŠçãããŠãŒã¶ãŒãããåŒã³åºããå²ã蟌ã¿åŠçãèšå®ã§ããã
IDTé
åã¯ã¡ã¢ãªäžã®ã©ãã«é
眮ããŠããããlidt
ã§ãããæå¹åããã

æãç°¡åãªå²ã蟌ã¿åŠçã¯ã0ã§å²ãåœä»€(div 0)ã§ããã
IDTãèšå®ãããŠããå Žåã«ãããŠãdiv 0ãå®è¡ããããšãIDTé åã®æåã®ã»ã°ã¡ã³ããå®è¡ããããããã¯CPUã®èšèšã«ãããã®ã§ãå²ã蟌ã¿0ã¯äžè¬çã«ãDivide Error ExceptionãïŒãŒãé€ç®äŸå€ïŒãšããŠç¥ãããŠããŸãã
ãã®ãããIDTé åã®äžçªæåã«0ã§å²ãããæã«ã¯"Err: Divide by zero"ãšprintãã颿°ãæå®ããŠããã°ãdiv 0ãå®è¡ããããšãã«ãã®åºåãããããšãã§ããã

å²ã蟌ã¿ãã¯ã¿ãŒããŒãã«ã®å Žæ

x86ã®å Žåå²ã蟌ã¿ãã¯ã¿ãŒããŒãã«ã¯ã¡ã¢ãªã®0x0çªå°ãã䞊ãã§ããã

ãªã¢ã«ã¡ã¢ãªã«ãããŠãå²ã蟌ã¿ãã¯ã¿ãŒããŒãã«ã¯ä»¥äžã®ããã«ãªã£ãŠããã
0x0000 - 0x0004: int 0ãåŒã³åºãããã®ãã®åŠçããã颿°ã®ã¡ã¢ãªã¢ãã¬ã¹ã®ãªãã»ããããšã»ã°ã¡ã³ããå ¥ã£ãŠãã
0x0004 - 0x0008: int 1ãåŒã³åºãããã®ãã®åŠçããã颿°ã®ã¡ã¢ãªã¢ãã¬ã¹ã®ãªãã»ããããšã»ã°ã¡ã³ããå ¥ã£ãŠãã

ã¢ã»ã³ããªã ãšä»¥äžã®ããã«æå®ãããïŒãªã¢ã«ã¢ãŒãã§å®è¡ïŒ
handle_zero:
mov ah, 0eh
mov al, 'A'
int 10h
iret
start:
mov ax, 0x00
mov ss, ax
mov word[ss:0x00], handle_zero
mov word[ss:0x02], 0x7c0
ã¡ã¢ãªã®0x00ãã»ã°ã¡ã³ã:ãªãã»ããã®åœ¢ã§æå®ããŠãããã«ã¡ã¢ãªã®ã¢ãã¬ã¹ãã¶ã¡èŸŒãã
BIOSã¯ããã©ã«ãã§0x7c0ã»ã°ã¡ã³ãã§èµ·åããã®ã§ãhandle_zeroã¯0x7c0ã»ã°ã¡ã³ãã«ããããªã®ã§0x02 ~ 0x04ã«ã¯ãããå
¥ããã