ÀÏ´Ü ¾ÕÀý¿¡¼ »ìÆ캻 °Í°ú °°ÀÌ ÃʱâÈµÈ ÀÎÅÍ·´Æ® °ÔÀÌÆ®µéÀ» °¡¸®Å°´Â ·¹Áö½ºÅÍ idtr Àº startup_32 ¾î¼Àºí¸® ·çƾ¿¡¼ Ãʱâȵȴ٠:
-------------------------------------- /usr/src/linux/arch/i386/kernel/head.S -------------------------------------- ENTRY(_stext) startup_32: : : #ifdef CONFIG_SMP orw %bx,%bx jz 1f /* Initial CPU cleans BSS */ pushl $0 popfl jmp checkCPUtype 1: #endif CONFIG_SMP /* SMP °¡ ¾Æ´Ï¸é ±×³É ÀÚ¿¬½º·´°Ô ¾Æ·¡¿¡ ÀÖ´Â : ckeckCPUtype ·¹À̺í±îÁö ÁøÇàÇÔ */ : checkCPUtype: : : lgdt gdt_descr lidt idt_descr : :
À̶§, idt_descr À̶ó´Â ½É¹úÀº head.S ¸Ç ¾Æ·§ÂÊ ºÎºÐ¿¡¼ ´ÙÀ½°ú °°ÀÌ Á¤Àǵǰí ÀÖ´Ù :
ÆíÀÇ»ó gdt_descr ±îÁö Á¤ÀÇÇϴ°ͱîÁö º¸¿´´Ù(-_-a) ¼Ò½º¸¦ º¸¸é, idt_descr ¹øÁö¿¡ 16ºñÆ® Å©±â(.word)·Î 256*8-1 ÀÇ °ªÀÌ µé¾î°£´Ù. À̺κÐÀº, ¾Õ¼ ´Ù·é idtr ·¹Áö½ºÅÍÀÇ ±¸Á¶¸¦ »ý°¢ÇØ º¸¸é ¾Ë ¼ö ÀÖ´Â ºÎºÐÀÌ´Ù. ÇÏÀ§ 16ºñÆ®´Â limit ÀÇ Àǹ̸¦ ¶ì¾ú¾ú´Ù. ÀÌ°ÍÀº idtr ¿¡ 256°³ÀÇ ¿£Æ®¸®°¡ µé¾î°£´Ù´Â »ç½ÇÀ» »ý°¢ÇÒ ¶§ ½±°Ô ¾Ë ¼ö ÀÖ´Ù. ±×¸®°í, 32ºñÆ® Å©±â(.long)·Î idt_table ÀÇ ÁÖ¼Ò¸¦ ÀúÀåÇÏ°í ÀÖ´Ù.
#define IDT_ENTRIES 256 #define GDT_ENTRIES (__TSS(NR_CPUS)) .globl SYMBOL_NAME(idt) .globl SYMBOL_NAME(gdt) ALIGN .word 0 idt_descr: .word IDT_ENTRIES*8-1 # idt contains 256 entries SYMBOL_NAME(idt): .long SYMBOL_NAME(idt_table) .word 0 gdt_descr: .word GDT_ENTRIES*8-1 SYMBOL_NAME(gdt): .long SYMBOL_NAME(gdt_table)
ÀÌ ºÎºÐÀº, À§¿¡¼ À̾߱âÇÑ checkCPUtype ºí·Ï¿¡¼
ÀνºÆ®·°¼Ç¿¡¼ »ç¿ëµÈ´Ù. lidt ¸í·ÉÀ» ÀÎÅÚÀÇ ¸Å´º¾ó¿¡¼ ã¾Æº¸¸é, ¿ÀÆÛ·£µå°¡ 16ºñÆ® ¾îµå·¹½ºÀ϶§¿Í 32ºñÆ® ¾îµå·¹½ºÀ϶§ÀÇ µ¿ÀÛÀÌ ¾à°£ Â÷ÀÌ°¡ ³ª´Âµ¥(16ºñÆ® ¾îµå·¹½ºÀ϶§´Â º£À̽º¿¡ ÇØ´çÇÏ´Â Çʵ忡 0x00ffffff ¸¦ and Çؼ ³ÖÀ½) ¹¹, Á¦´ë·Î ¸¸µé¾ú´Ù°í »ý°¢ÇÏ°í, ¾î·µç, 48ºñÆ® Å©±âÀÇ idtr ÀÇ idt base address Çʵå(»óÀ§ 32ºñÆ®)¿¡ idt_table ÀÇ ÁÖ¼Ò¿Í, ¾Æ·§ºÎºÐÀÇ idt limit Çʵå(ÇÏÀ§ 16ºñÆ®)¿¡ 256*8-1 °³¸¦ ³ªÅ¸³»´Â °ªÀ» ³Ö´Â´Ù.
lidt idt_descr
¿©±â±îÁö ÀÏ´Ü, ÃÖÃÊÀÇ idt_table ÀÇ ¼¼Æðú idtr ÀÇ ¼¼ÆÃÀ» ¾Ë¾Æº¸¾Ò´Ù. ÀÌÁ¦´Â ´ÙÀ½ ¼½¼Ç¿¡¼ ½ÇÁ¦ ÀÎÅÍ·´Æ® º¤ÅÍ Å×À̺íÀ» ¼¼ÆÃÇÏ´Â ºÎºÐÀ» »ìÆ캸°Ú´Ù
Âü, idt_table ½Éº¼ÀÌ Á¤ÀǵǴ °÷À» ¸»ÇÏÁö ¾Ê¾Ò´Ù. ±× ½É¹úÀº ¾Æ·¡¿Í °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù :
-------------------------------------- /usr/src/linux/arck/i38/kernel/traps.c -------------------------------------- struct desc_struct idt_table[256] __attribute__((__section__(".data.idt"))) = { {0, 0}, };