3.2. idtr ·¹Áö½ºÅÍÀÇ ÃʱâÈ­

ÀÏ´Ü ¾ÕÀý¿¡¼­ »ìÆ캻 °Í°ú °°ÀÌ ÃʱâÈ­µÈ ÀÎÅÍ·´Æ® °ÔÀÌÆ®µéÀ» °¡¸®Å°´Â ·¹Áö½ºÅÍ 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 ¸Ç ¾Æ·§ÂÊ ºÎºÐ¿¡¼­ ´ÙÀ½°ú °°ÀÌ Á¤Àǵǰí ÀÖ´Ù :

#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)
ÆíÀÇ»ó gdt_descr ±îÁö Á¤ÀÇÇϴ°ͱîÁö º¸¿´´Ù(-_-a) ¼Ò½º¸¦ º¸¸é, idt_descr ¹øÁö¿¡ 16ºñÆ® Å©±â(.word)·Î 256*8-1 ÀÇ °ªÀÌ µé¾î°£´Ù. À̺κÐÀº, ¾Õ¼­ ´Ù·é idtr ·¹Áö½ºÅÍÀÇ ±¸Á¶¸¦ »ý°¢ÇØ º¸¸é ¾Ë ¼ö ÀÖ´Â ºÎºÐÀÌ´Ù. ÇÏÀ§ 16ºñÆ®´Â limit ÀÇ Àǹ̸¦ ¶ì¾ú¾ú´Ù. ÀÌ°ÍÀº idtr ¿¡ 256°³ÀÇ ¿£Æ®¸®°¡ µé¾î°£´Ù´Â »ç½ÇÀ» »ý°¢ÇÒ ¶§ ½±°Ô ¾Ë ¼ö ÀÖ´Ù. ±×¸®°í, 32ºñÆ® Å©±â(.long)·Î idt_table ÀÇ ÁÖ¼Ò¸¦ ÀúÀåÇÏ°í ÀÖ´Ù.

ÀÌ ºÎºÐÀº, À§¿¡¼­ À̾߱âÇÑ checkCPUtype ºí·Ï¿¡¼­

	lidt idt_descr
ÀνºÆ®·°¼Ç¿¡¼­ »ç¿ëµÈ´Ù. lidt ¸í·ÉÀ» ÀÎÅÚÀÇ ¸Å´º¾ó¿¡¼­ ã¾Æº¸¸é, ¿ÀÆÛ·£µå°¡ 16ºñÆ® ¾îµå·¹½ºÀ϶§¿Í 32ºñÆ® ¾îµå·¹½ºÀ϶§ÀÇ µ¿ÀÛÀÌ ¾à°£ Â÷ÀÌ°¡ ³ª´Âµ¥(16ºñÆ® ¾îµå·¹½ºÀ϶§´Â º£À̽º¿¡ ÇØ´çÇÏ´Â Çʵ忡 0x00ffffff ¸¦ and Çؼ­ ³ÖÀ½) ¹¹, Á¦´ë·Î ¸¸µé¾ú´Ù°í »ý°¢ÇÏ°í, ¾î·µç, 48ºñÆ® Å©±âÀÇ idtr ÀÇ idt base address Çʵå(»óÀ§ 32ºñÆ®)¿¡ idt_table ÀÇ ÁÖ¼Ò¿Í, ¾Æ·§ºÎºÐÀÇ idt limit Çʵå(ÇÏÀ§ 16ºñÆ®)¿¡ 256*8-1 °³¸¦ ³ªÅ¸³»´Â °ªÀ» ³Ö´Â´Ù.

¿©±â±îÁö ÀÏ´Ü, ÃÖÃÊÀÇ 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}, };