· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
x86 º¸È£¸ðµå

x86 º¸È£¸ðµå

  • ÀÛ¼ºÀÚ
    Á¶ÀçÇõ (Mminzkn@minzkn.com)
  • °íÄ£°úÁ¤
    2001³â ¾î´À³¯ : óÀ½¾¸

Àо±â Àü¿¡

ÀÌ ¹®¼­¿¡¼­ »ç¿ëµÈ Ç¥±â´Â ½ÇÁ¦ À̸§°ú ´Ù¸¦¼ö ÀÖ½À´Ï´Ù. ´ÜÁö ¼³¸íÀÇ ¿ëÀ̼ºÀ» À§Çؼ­ ÀÓÀÇ·Î ºÙÀΠǥ±âÀÔ´Ï´Ù. ÀÌ ¹®¼­¿¡ ±â¼úµÈ Ç¥¿¡¼­ Ưº°ÇÑ ¼³¸íÀÌ ¾øÀ¸¸é 0À¸·Î °£ÁÖÇÏ½Ã¸é µË´Ï´Ù. ÀÌ´Â ¿¹¾à¿µ¿ªÀÇ Àǹ̰¡ £¾î¼­ 0ÀÔ´Ï´Ù. ¹æÁØ¿µ´ÔÀÇ ±íÀº Á¶¾ð°ú Á¤°æÁÖ´ÔÀÇ ¿ÀŸÁöÀû °¨»çµå¸³´Ï´Ù.

Segment register

  • Logical ÁÖ¼ÒÀÇ 2°¡Áö ºÎºÐ
  • ÇϳªÀÇ Segment´Â SegmentÀÇ ¹üÀ§¿¡ ÀÖ´Â OffsetÀ» °¡Áý´Ï´Ù.
  • Segment´Â 16bitÀÇ Selecter·Î Á¤ÀǵǴ µ¿¾È 32bit Offset¸¦ À¯ÁöÇÕ´Ï´Ù.
  • Segment register´Â 6°³·Î ºÐ·ùµÇ¸ç CS, SS, DS, ES, FS, GS°¡ ÀÖ½À´Ï´Ù. ÀÌ 6°³ÀÇ Register¸¦ »ç¿ëÇÏ¿© ¼­·Î ´Ù¸¥ ¸ñÀûÀ» °¡Áø ¸Þ¸ð¸®¸¦ »ç¿ëÇÕ´Ï´Ù. °¢ Segmentº° ¸ñÀû(100% ¹Ýµå½Ã Áöų ÇÊ¿ä´Â ¾ø½À´Ï´Ù.)
  • CS(CodeSegment): ÇÁ·Î±×·¥ÀÇ Instruction ÇÏÀ§ 2°³ÀÇ bit´Â ÇöÀç ÇÁ·Î±×·¥ÀÇ Á¢±Ù±ÇÇÑÀ» Á¤ÀÇÇϸç 0ºÎÅÍ 3±îÁö 4´Ü°è¸¦ °¡Áý´Ï´Ù. 0ÀÌ Á¦ÀÏ ¸¹Àº Á¢±Ù±ÇÇÑÀ» °¡Áö¸ç 3ÀÌ °¡Àå Á¦ÇÑµÈ Á¢±Ù±ÇÇÑÀ» °¡Áý´Ï´Ù. Linux´Â 0°ú 3¸¸À» Kernel mode/User mode·Î °¢°¢ »ç¿ëÇÕ´Ï´Ù.
  • SS(StackSegment): ÇöÀç ÇÁ·Î±×·¥ÀÇ ½ºÅÃ
  • DS(DataSegment): Data
  • ES(ExtraSegment): ¸ñÀûÁö ¶Ç´Â DSÀÇ º¸Á¶
  • FS, GS: ƯÁ¤ÇÑ À̸§µµ ¾ø°í ¸ñÀûµµ ¾ø´Â ÀÚÀ¯·Î¿î Segment (Âü°í: Intel¿¡¼­´Â À̸¦ Á¤ÇÏÁö ¾Ê¾ÒÁö¸¸ Â÷ÈÄ¿¡ Á¤ÇØÁú¼öµµ ÀÖÀ¸¹Ç·Î ÇÁ·Î±×·¡¸Óµé¿¡°Ô »ç¿ë¿¡ À־ ÀÌÁ¡À» Âü°íÇ϶ó°í Çß½À´Ï´Ù.)

Segment descriptor

°¢°¢ÀÇ Segment´Â 8byteÀÇ Segment descriptor¶ó´Â °Í¿¡ ÀÇÇØ ±â¼úµÇ´Âµ¥ ±â¼úµÇ´Â Á¾·ù·Î´Â GDT(Global Descriptor Table) ¶Ç´Â LDT(Local Descriptor Table)°¡ ÀÖ½À´Ï´Ù. GDT´Â 1°³¸¸À» »ç¿ëÇÏÁö¸¸ LDT´Â °¢ Process¸¶´Ù µû·Î ¼ÒÀ¯ÇÒ¼ö ÀÖ½À´Ï´Ù. Memory»óÀÇ GDT¿Í LDTÀÇ DescriptorÀÇ ÁÖ¼Ò¿Í ÇÑ°è´Â gdtr°ú ldtrÀ̶ó´Â Register¿¡ ÀÐÇôÁý´Ï´Ù. LDT´Â GDT·ÎºÎÅÍ ¼±ÅÃÀ̵Ǹç GDTÁß ÇÑ °³´Â LDT¸¦ ÁÖ¼ÒÁöÁ¤Çϵµ·Ï µÇ¾î ÀÖ½À´Ï´Ù.

DescriptorÀÇ ±¸Á¶

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Base (32 ~ 24bit) G B(D) O AVL Limit (19 ~ 16bit)
P DPL S E ED/C R/W A Base (23 ~ 16bit)
Base (15 ~ 0bit)
Limit (15 ~ 0bit)

  • Limit : Descriptor°¡ ¼­¼úµÇ´Â ¿µ¿ªÀÇ ÇÑ°è¿¡¼­ 1À» »« °ª (Áï, 0Àº ÇÑ°è°ªÀÌ 1ÀÌ µË´Ï´Ù)
  • P : DescriptorÀÇ Á¤ÀÇ À¯¹« (1)
  • DPL: Descriptor Ư±Ç·¹º§ (0 ~ 3)
  • S : System descriptor(1) ¶Ç´Â Code/Data descriptor(0)
  • E : Code(1) / Data(0)
  • ED : Data(0) / Stack(1) - E°¡ 0ÀÎ °æ¿ì
  • C : Ư±Ç·¹º§ Áؼö(1) / ¹«½Ã(0) - E°¡ 1ÀÎ °æ¿ì
  • R : Code°¡ ÀÐÇôÁú¼ö ÀÖ´Ù(1) / ¾ø´Ù(0) - E°¡ 1ÀÎ °æ¿ì
  • W : Data°¡ ±â·ÏµÉ¼ö ÀÖ´Ù(1) / ¾ø´Ù(0) - E°¡ 0ÀÎ °æ¿ì
  • A : DescriptorÀÇ AccessÀ¯¹« - Micro processor°¡ °ü¸®ÇÔ
  • G : Limit°ªÀÌ 1 ~ 1MByte »çÀ̸¦ °¡Áú °ÍÀΰ¡(0) ¾Æ´Ï¸é 4K~4GByte »çÀ̸¦ °¡Áú°ÍÀΰ¡(1)¸¦ °áÁ¤
  • B(D) : 16bit Çؼ®(0) ¶Ç´Â 32bit Çؼ®(1)
  • O : ÇöÀç 0À¸·Î ¿¹¾àµÊ
  • AVL : Segment°¡ À¯¿ëÇÑÁöÀÇ ¿©ºÎ - ¿î¿µÃ¼Á¦°¡ °ü¸®(ÀÌ´Â °¡»ó¸Þ¸ð¸®ÀÇ ¿©ºÎ·Î Á¾Á¾ »ç¿ë)

  • Âü°í : À§ÀÇ ±¸Á¶´Â 80x386±â¹ÝÀÇ DescriptorÀÌ°í 80x286¿¡¼­´Â Base(32~24)¿Í G/B/O/AVL/Limit(19~16)Ç׸ñÀº 0À¸·Î ¿¹¾àµÇ¾î ÀÖ½À´Ï´Ù.
  • Âü°í : ù ¹ø° GDT´Â Ç×»ó 0À¸·Î ¿¹¾àµÇ¾î ÀÖÀ¸¸ç 0ÀÌ ¾Æ´Ñ °ªÀ» °¡Áö°í ÀÖ´õ¶óµµ »ç¿ëÇÒ¼ö ¾ø½À´Ï´Ù. ÀÌ´Â NULLÆ÷ÀÎÅÍ¿¡ ÀÇÇÑ ¿À·ù¸¦ ¸·±â À§ÇÑ °ÍÀÌ°í ¶§¹®¿¡ »ç¿ëµÉ¼ö ¾ø½À´Ï´Ù. ÀÀ¿ëÇÏÀÚ¸é 0¹ø GDT´Â »ç¿ëÇÒ¼ö ¾øÀ¸¹Ç·Î GDT¸¦ gdtr¿¡ ¿Ã¸®±â À§Çؼ­ ÀÌ ¿µ¿ª¿¡ GDTÁ¤º¸ 6¹ÙÀÌÆ®¸¦ ½Æ´Â ÇÁ·Î±×·¥ÀÌ Á¾Á¾ ÀÖÀ¸¸ç ÀÌ´Â 8¹ÙÀÌÆ®¸¦ ¾Æ³¥¼ö ÀÖ´Â ÇϳªÀÇ ÃÖÀûÈ­ ¹æ¾ÈÀÌ µË´Ï´Ù. (°ü¸®µµ ½¬¿öÁü)
  • Âü°í : Descriptor¿¡ Á¤ÀÇµÈ °¢ Ç׸ñº° À̸§Àº ½ÇÁ¦·Î Á¤ÀÇµÈ ´Ü¾îµéÀÌ ¾Æ´Õ´Ï´Ù. Intel¿¡¼­´Â ¶Ñ·ÇÇÏ°Ô À̸¦ ¹àÈùÀû ÀÌ ¾ø½À´Ï´Ù.
  • Âü°í : P, DPL, S, E, ED/C, R/W, A bit¸¦ ÇÊÀÚ´Â Access right bit¶ó°í ĪÇÏ°í Áß¿äÇÑ ºÎºÐÀ¸·Î °¡Á¤ÇÏ°í º¸¼¼¿ä.

SelectorÀÇ ±¸Á¶

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Selector TI RPL

  • RPL : ¿äûÇÒ Æ¯±Ç·¹º§ (0 ~ 3)
  • TI : GDT(0) / LDT(1) ¼±ÅÃ
  • Selector : GDT ¶Ç´Â LDT(TI¿¡ ÀÇÇؼ­ ¼±ÅõÈ)ÀÇ 8192(2ÀÇ 13½Â)°³Áß 1°³¸¦ ¼±ÅÃ

  • Âü°í : GDT/LDT °¢°¢ 8192°³¾¿ 16,384°³ÀÇ Descriptor°¡ ¾ðÁ¦µçÁö ÀÌ¿ë°¡´ÉÇÑ °ªÀÌ µÇ¹Ç·Î ÃÖ´ë ±× ¸¸Å­ÀÇ Segment°¡ °¢ ÀÀ¿ë¿¡ »ç¿ëµÉ¼ö ÀÖ½À´Ï´Ù.
  • ¿¹ : ¸¸¾à 2¹ø° Descriptor¸¦ ¼±ÅÃÇÑ´Ù°í °¡Á¤Çϸé (2

Segment ÀåÄ¡

TI¿¡ ÀÇÇؼ­ ¼±ÅÃµÈ gdtr ¶Ç´Â ldtrÀ» Àоî GDT ¶Ç´Â LDT¿¡¼­ Descriptor¸¦ ¼±ÅÃÇÏ°í ¼±ÅÃµÈ Descriptor¿¡¼­ Base + Offset register¸¦ ÁÖ¼ÒÁöÁ¤ÇÏ°Ô µÇ¸ç Limit*(G bit MUL)¸¦ ¹ù¾î³­ OffsetÀ» °¡Áú °æ¿ì ¿¹¿Üó¸®(ÈçÈ÷ ¸»ÇÏ´Â Segment fault)°¡ ¼öÇà µË´Ï´Ù.

System descriptorÀÇ Á¾·ù

À§¿¡¼­ Access right bit¶ó°í ĪÇÑ ºÎºÐÁß¿¡¼­ E, ED/C, R/W, A¸¦ S bit¿¡ ÀÇÇؼ­ ¾Æ·¡ÀÇ Ç¥¸¦ Âü°í·Î ÇÏ¿© System descriptor·Î ¼º°ÝÀÌ ¹Ù²î°Ô µË´Ï´Ù.

Type ¸ñÀû
0000b ¹«È¿
0001b ÀÌ¿ë °¡´ÉÇÑ 80x286 TSS
0010b LDT
0011b ¹Ù»Û 80x286 TSS
0100b 80x286 call gate
0101b Task gate
0110b 80x286 Interrupt gate
0111b 80x286 Trap gate
1000b ¹«È¿
1001b ÀÌ¿ë °¡´ÉÇÑ 80x386 TSS
1010b ¹Ì·¡ÀÇ Intel Á¦Ç°À» À§ÇÑ reserved
1011b ¹Ù»Û 80x386 TSS
1100b 80x386 call gate
1101b ¹Ì·¡ÀÇ Intel Á¦Ç°À» À§ÇÑ reserved
1110b 80x386 Interrupt gate
1111b 80x386 Trap gate

Gate descriptor

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Base (31 ~ 24bit) G B(D) O AVL Limit (19 ~ 16bit)
P DPL 0 Type 0 0 0 Work count (4 ~ 0 bit)
Selector
Offset (15 ~ 0 bit)

Word counter´Â È£ÃâÀÚÀÇ Stack À¸·ÎºÎÅÍ È£ÃâµÈ Gate¿¡ ÀÇÇØ Á¢±ÙµÈ ProcedureÀÇ StackÀ¸·Î ¸î°³ÀÇ Word°¡ Àü¼ÛµÉ °ÍÀÎÁö¸¦ ³ªÅ¸³À´Ï´Ù.

°£´ÜÈ÷ ¼³¸íÇÏÀÚ¸é ÀÎÀÚÀÇ °³¼ö¸¦ ¸î°³·Î ¹ÞÀ»Áö¸¦ ¿¹±âÇÏ´Â °Ì´Ï´Ù. ¹°·Ð ´Ù¸¥ ¸ñÀûµµ ÀÖÁö¸¸ ±³°ú¼­ÀûÀÎ ³»¿ëÀ¸·Î ºÃÀ»¶§´Â ... Word °³¼ö Ç׸ñÀº Interrupt gate¿Í ÇÔ²² »ç¿ëµÇÁö ¾Ê´Â´Ù´Âµ¥ À¯ÀÇÇÒ ÇÊ¿ä°¡ ÀÖ°Ú½À´Ï´Ù. (Áï, ÀÌ °æ¿ì Word count=0) Gate°¡ Á¢±ÙµÉ¶§ SelectorÀÇ ³»¿ëÀÌ TR(Task register)¿¡ žÀçµÈ´Ù´Â °Íµµ ÀÎÁöÇÏ°í ÀÖ¾î¾ß ÇÕ´Ï´Ù.

General protectionÀ§¹ÝÀÇ Á¾·ù


ÀÌ°ÍÀº Interrupt 0x0d¿Í ¹ÐÁ¢ÇÑ °ü·ÃÀÌ ÀÖ½À´Ï´Ù.

  • Descriptor tableÀÇ ¹üÀ§ ÃÊ°ú
  • Ư±Ç±ÔÄ¢ À§¹Ý
  • À߸øµÈ Descriptor segment typeÀÇ Å¾Àç
  • º¸È£µÈ Code segment¿¡ Write½Ãµµ
  • ÀбâÀü¿ë Code segmentÀÇ Àбâ (ÀÌ°ÍÀº ±×·²¼öµµ ¾Æ´Ò¼öµµ ÀÖ´Ù´Â Á¡À» ÀÎÁöÇÏ°í ÀÖ¾î¾ß ÇÕ´Ï´Ù.)
  • ÀбâÀü¿ë Data segment¿¡ Write½Ãµµ
  • SegmentÀÇ ¹üÀ§ ÃÊ°ú
  • CTS, HLT, LGDT, LIDT, LLDT, LMSW, LTRÀ» ½ÇÇà½Ã¿¡ Á¶°Ç (CPL == IOPL)À» °Ë»çÇÏ¿© À§¹ÝµÉ °æ¿ì
  • CLI, IN, INS, LOCK, OUT, OUTS, STI¸¦ ½ÇÇà½Ã¿¡ Á¶°Ç (CPL > IOPL)À» °Ë»çÇÏ¿© À§¹ÝµÉ °æ¿ì

Paging

  • Á¤ÀÇ : PagingÀº ÀÓÀÇÀÇ ¼±Çü(³í¸®)ÁÖ¼Ò°¡ ÀÓÀÇÀÇ ¹°¸®Àû ¸Þ¸ð¸® Page¿¡ ³õÀϼö ÀÖ°Ô ÇØÁÖ´Â ¹æ¹ý
  • Linear memory page´Â ¸®¾ó¸ðµå ¹× º¸È£¸ðµå¿¡¼­ »ç¿ëÇÒ¼ö ÀÖ½À´Ï´Ù. Áï, º¸È£¸ðµå Àü¿ëÀÌ ¾Æ´Õ´Ï´Ù.
  • x86ÀÇ Memory page Çϳª´Â ±æÀÌ°¡ 4K¹ÙÀÌÆ® ¼±»ó´ÜÀ§·Î À̸¦ ±¸ÇöÇϴµ¥´Â 3°¡Áö ¿ä¼Ò°¡ »ç¿ëµË´Ï´Ù.

    31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
    Directory (10 bit) Table (10 bit) Offset (12 bit)

  • Page mode·Î µé¾î°¡±â À§Çؼ­´Â CR0 Register¿¡ ÀÖ´Â PG bit¸¦ 1·Î ÇÕ´Ï´Ù. ±× Àü¿¡ directory/tableÀº Áغñ µÇ¾î ÀÖ¾î¾ß ÇÕ´Ï´Ù.
  • CR3 Register

    31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
    Page directory base OS bit 0 0 D A PCD PWT U/S W P

  • P : ³í¸® 1À̸é ÁÖ¼Òº¯È¯¿¡¼­ »ç¿ë °¡´ÉÇÏ°í 0ÀÌ¸é º¯È¯¿¡ »ç¿ëµÉ¼ö ¾ø½À´Ï´Ù. Áï, 0À̸é Disk pagingÀÌ ±¸Çö°¡´ÉÇÕ´Ï´Ù. µû¶ó¼­ °¢ PageTable¿¡ MappingµÇ´Â ÁÖ¼ÒÀÇ Å©±â´Â 4 MByte°¡ µË´Ï´Ù.(ÃÑ Mapping °¡´ÉÇÑ ÁÖ¼Ò°ø°£Àº 4G, È®ÀåµÈ PagingÀ» »ç¿ëÇÒ °æ¿ì 4M´ÜÀ§ÀÇ PageÅ©±â·Î ÃÑ Mapping °¡´ÉÇÑ ÁÖ¼Ò°ø°£Àº 64G)
  • R/W, U/S : °¢°¢ÀÇ bitÁ¶ÇÕ¿¡ µû¶ó °¡Àå ³·Àº À¯Àú 3À» À§ÇÑ ¿ì¼±¼øÀ§ ·¹º§ º¸È£¸¦ Á¦°øÇÕ´Ï´Ù.

    0 0 ¾øÀ½
    1 0 ¾øÀ½
    0 1 Àбâ Àü¿ë
    1 1 Àбâ / ¾²±â

  • PWT : Write-through Cache
  • PCD : Cache disable
  • A(Accessed) : Microprocessor°¡ µð·ºÅ丮 Ç׸ñÀ» Á¢±ÙÇÒ¶§¸¶´Ù 1·Î ¼¼Æ®µË´Ï´Ù.
  • D : Dirty·Î ¿î¿µÃ¼Á¦¸¦ À§ÇØ »ç¿ëµË´Ï´Ù.

  • ¿¹Á¦ Source
          PageDirectory DD 4                ; ÆäÀÌÁö µð·ºÅ丮
          PageTable0    DD 1024 DUP (?)     ; ÆäÀÌÁö Å×À̺í 0¹ø
    
          XOR EAX, EAX
          MOV AX, CS
          SHL EAX, 4
          ADD EAX, OFFSET PageTable0        ; ¿©±â±îÁö ³í¸®Àû ¸Þ¸ð¸® ÁÖ¼Ò¸¦ ¼±Çü ¸Þ¸ð¸® ÁÖ¼Ò·Î º¯È¯ÇÑ °Í
          AND EAX, 0fffff000h
          OR AL, 7
          MOV PageDirectory, EAX            ; PageDirectory´Â PageTable0 ...
          MOV CX, 256                       ; 4K * 256¸¸Å­À» Àç ¸ÊÇÎ Çϱâ À§ÇÑ Count
          MOV DI, OFFSET PageTable0
          MOV AX, DS
          MOV ES, AX
          MOV EAX, 7                        ; U/S, R/W, P¸¦ Set
    L_0:
          STOSD
          ADD EAX, 4096                     ; Re map 00000h ~ 09ffffh to 00000h ~ 09ffffh
          LOOP L_0                          ; 4K´ÜÀ§·Î Mapping
          MOV EAx, 0102007h
          MOV CX, 16
    L_1:
          STOSD                             ; Re map 0a000h ~ 0affffh to 102000h ~ 11ffffh
          ADD EAX, 4096
          LOOP L_1                          ;  ¿­½ÉÈ÷ ¿Å±âÁö¸¸ Àç¸ÊÇÎ ½ÃÅ°¸é¼­
          XOR EAX, EAX
          MOV AX, DS
          SHL EAX, 4
          ADD EAX, OFFSET PageDirectory
          MOV CR3, EAX                      ; In paging... ÆäÀÌ¡ Áغñ ³¡
    


È®ÀåµÈ Paging

Pentium¿¡¼­´Â º¸´Ù È®ÀåµÈ PagingÀÌ Á¦°øµÇ¸ç Page frameÀÇ Å©±â°¡ 4K¿¡¼­ 4M·Î È®Àå°¡´ÉÇϹǷΠº¸´Ù Å« ¸Þ¸ð¸®ºí·°À» ÀûÀº¼öÀÇ ÆäÀÌÁö µð·ºÅ丮·Î °ü¸®ÇÒ¼ö ÀÖ°Ô µË´Ï´Ù. ´Ü, ÀÌ°ÍÀÌ Ç×»ó ÀåÁ¡À¸·Î ³²À»¼ö´Â ¾ø½À´Ï´Ù. Á¶±×¸¶ÇÑ ¸Þ¸ð¸®¸¸À» PagingÇϱ⠿øÇÑ´Ù¸é ÀÌ°ÍÀº ¸Þ¸ð¸® È¿À²À» ¶³¾î¶ß¸®´Â °á°ú¸¦ ÃÊ·¡ÇÒ¼ö ÀÖ°Ú½À´Ï´Ù. º¸Åë 32bit ¸Ó½Å¿¡¼­´Â 4MÀÇ Çʿ伺ÀÌ Å« È¿À²À» °¡Á®´Ù ÁÖÁö´Â ¸øÇÒ°ÍÀÔ´Ï´Ù. (ÇÊÀÚ´Â °³ÀÎÀûÀ¸·Î ¼ÒÇÁÆ®¿þ¾î°¡ 2GÀÌ»óÀÇ ¸Þ¸ð¸®¸¦ ¿ä±¸ÇÏ´Â °æ¿ì 4M page¸¦ Á¾Á¾ »ç¿ëÇϴµ¥ pageÀÇ °ü¸®Â÷¿øÀÇ Mapping ÀýÂ÷¿¡ ´ëÇÑ ´Ü¼øÇÔÀ¸·Î Å« ¸Þ¸ð¸® ºí·°À» ÀÚÁÖ »ç¿ëÇÏ´Â taskÀÇ °æ¿ì´Â À̸¦ Á¾Á¾ »ç¿ëÇÏ¿´½À´Ï´Ù. ¾îÂîµÇ¾ú°Ç ÀÌ°ÍÀº Á¦ ÄÚµå»ó¿¡¼­´Â ¼º´É Çâ»óÀ» º¸ÀΰÍÀ¸·Î º¸¾Æ¼­ °Å´ëÇÑ ¸Þ¸ð¸® Management Ư¼ºÀ» °¡Áø ¼ÒÇÁÆ®¿þ¾î¿¡¼­´Â °£È¤ ½áº¼¸¸ ÇÑ°Í °°½À´Ï´Ù.)

CR4 registerÀÇ bit4¹ø(Page size enable)À» SetÇϸé 4M Page¸ðµå·Î È®ÀåµË´Ï´Ù. 4M mode·Î µé¾î°¡¸é ´ÙÀ½°ú °°ÀÌ ¼±ÇüÁÖ¼Ò°¡ ¹Ù²ò´Ï´Ù. (Page tableÀÌ ¾ø´Ù´Â Á¡¿¡ ÁÖÀÇ)

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Directory (10 bit) Offset (22 bit)

Three-level paging

RAMÀÌ ½Î°Ô °ø±ÞµÇ¾î ¿ë·®ÀÌ Ä¿Áö´õ¶óµµ Page tableÀ» Memory°ø°£¿¡ ³¶ºñ¸¦ ÇÏ´Â °ÍÀº ¹Ù¶÷Á÷ÇÏÁö ¾ÊÀ¸¹Ç·Î 64bit¿¡¼­´Â Three-level pasingÀ» »ç¿ëÇØ¾ß ÇÒ°ÍÀÔ´Ï´Ù. !Alpha¿Í UltraSPARCÀº 64bit°è¿­À̸ç ÀÌ´Â Three-level pagingÀ» ¿©±â¿¡ Àû¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. PageÅ©±â°¡ ¹«Á¶°Ç Å©°Ô ÇÑ´Ù°í ÁÁÀº°Ô ¾Æ´Ï¹Ç·Î 16K Page°¡ Àû´çÇÕ´Ï´Ù. 16K´Â 14bit·Î ÁÖ¼ÒÁöÁ¤ÀÌ °¡´ÉÇϹǷΠoffset Ç׸ñÀº 14bit·Î ÇÏ°í ³ª¸ÓÁö 50bitÁß 25bit¾¿ °¢°¢ Directory¿Í Table·Î »ç¿ëÇÑ´Ù¸é 3200¸¸°³ÀÇ Page°¡ °¡´ÉÇÕ´Ï´Ù.

Alpha microprocessor¿¡¼­´Â ´ÙÀ½°ú °°½À´Ï´Ù. Page´Â 8K·Î ÇÏ¿© 13bitÀÌ°í PageTableÀº 10ºñÆ®¾¿ 3°³·Î ÂÉ°³¾î Two-level¿¡¼­´Â 10bit=1024¸¸Å­ÀÇ PageTableÀ» °¡Áú¼ö ÀÖ°Ô ÇÕ´Ï´Ù. ³ª¸ÓÁö 21bit´Â Ç×»ó 0ÀÔ´Ï´Ù.
Global directory(10bit) Middle directory(10bit) Table(10bit) Offset(13bit)
25bit 25bit 14bit

Hardware cache

PCD : MicroprocessorÀÇ PCDÇÉÀÇ ±â´ÉÀ» Á¦¾îÇϸç ÀÌ °ÍÀÌ setµÇ¸é Page°¡ ¾Æ´Ñ Bus»çÀÌŬµ¿¾È ³í¸® 1ÀÌ µË´Ï´Ù. ÀÌ°ÍÀº ¿ÜºÎ Çϵå¿þ¾î°¡ Level-II cache memory¸¦ Á¦¾îÇÒ¼ö ÀÖ°Ô ÇÕ´Ï´Ù. (°£´ÜÈ÷ ¸»Çؼ­ CacheÇÒ°ÇÁö ¾ÈÇÒ°ÇÁö) PWT : MicroprocessorÀÇ PWTÇÉÀÇ ±â´ÉÀ» Á¦¾îÇϸç Write-through cache¸¦ Á¦¾îÇϱâ À§Çؼ­Page°¡ ¾Æ´Ñ Bus»çÀÌŬµ¿¾È PWTÇÉ¿¡ ³ªÅ¸³³´Ï´Ù.

ÀÌ ºñÆ®´Â ½ÅÁßÈ÷ °áÁ¤ÇØ¾ß ÇÑ´Ù°í ÇÊÀÚ´Â °­·ÂÈ÷ ÁÖÀåÇÕ´Ï´Ù. Àß ¼±ÅÃÇÏ¸é ¼º´ÉÀ» ±Ø´ëÈ­ ÇÕ´Ï´Ù.

Translation Lookaside Buffers (TLB)

x86°è¿­ÀÇ CPU¿¡¼­´Â PagingÀ» À§Çؼ­ ¸Å¹ø Page directory¸¦ Àд°ÍÀº ÁÙÀÌ°íÀÚ TLB¶ó´Â ÀÏÁ¾ÀÇ Directory cache buffer¸¦ »ç¿ëÇÕ´Ï´Ù. PentiumºÎÅÍ 4 MByte pagingÀ» Áö¿øÇϵµ·Ï µÇ¾úÀ¸¸ç ÀÌ°ÍÀÌ 4K page¿Í Â÷ÀÌÁ¡Àº 4M page´Â Page tableÀÌ Á¸ÀçÇÏÁö ¾Ê´Â°ÍÀÌ Æ¯Â¡À̸ç Page directory Å©±â¸¦ ÁÙÀϼö ÀÖ°í Å« ºí·°À» ´Ù·ç¹Ç·Î ¼ÓµµÀûÀÎ ¸é¿¡¼­ ¾à°£ÀÇ ¿ìÀ§¸¦ °®½À´Ï´Ù. ´Ù¸¸, ¸Þ¸ð¸® È¿À²ÀûÀÎ Ãø¸éÀº À߸øÇϸé ÃÖ¾ÇÀÇ ¸Þ¸ð¸® »ç¿ëÀ²ÀÌ ¹ß»ýÇÒ¼ö ÀÖÀ¸¹Ç·Î ÀÌÁ¡Àº ¹Ýµå½Ã °í·ÁµÇ¾î¾ß ÇÕ´Ï´Ù.

Ư±Ç·¹º§ÀÌ ³ôÀº ¿î¿µÃ¼Á¦(·¹º§ 0)µî¿¡¼­ ÀÌ Page directory¸¦ È¿À²ÀûÀ¸·Î °ü¸®Çϱâ À§ÇØ ÀÚÁÖ ¹Ù²Ù°Ô µÇ´Âµ¥ ¹®Á¦´Â Ư±Ç·¹º§ÀÌ ³·Àº ÀÀ¿ëÇÁ·Î±×·¥¿¡¼­´Â À̸¦ ¹Ù²î¾ú´ÂÁö ¾Ë ÇÊ¿äµµ ¾ø°í TLB¿¡ ´ëÇÑ Á¦¾îµµ ÇÒ¼ö ¾øÀ¸¹Ç·Î ¸Å¹ø ¿î¿µÃ¼Á¦°¡ ±×°ÍÀ» ºñ¿öÁְųª ¹Ù²ïºÎºÐ¸¸À» TLB·ÎºÎÅÍ °»½ÅÇØÁÖ¾î¾ß ÇÏ´Â ¹®Á¦°¡ ÀÖ½À´Ï´Ù. ´ÙÇàÀ̵µ ÀÌ°ÍÀÌ ¿ì¿¬ÀÎÁö ¾Æ´ÑÁö º°·Î ±×·¸°Ô Å« ½Å°æÀ» ¾µ ÇÊ¿ä°¡ ¾ø´Ù´Âµ¥ ´ÙÇàÀÏ»ÓÀÌÁö¸¸ ¾î·°Ç ¿Ö ´ÙÇàÀÎÁö´Â ¾Ë¾Æ¾ß °ÚÁÒ?

PUSHF     ; ¿©±â¼­´Â PUSHF, CLI, POPF´Â °³³äÀûÀÎ ÀÌÇظ¦ À§ÇØ ¾´°Ì´Ï´Ù.
CLI
MOV EAX, CR3
MOV CR3, EAX
POPF


Áï, ±×³É CR3 register¸¦ ÀÐ°í ´Ù½Ã ½áÁÖ¸é TLB°¡ ÀÚ¿¬½º·´°Ô Á¤¸®ÀÛ¾÷ÀÌ µË´Ï´Ù. ÀÌ°ÍÀÌ ¿Ö ÀÚ¿¬½º·´°Ô µÇ´Â°¡? ±×°ÍÀº Task¸¦ ÀüȯÇÒ¶§ ÀÌ¹Ì ÀÌ°ÍÀÌ ÀÛ¿ëÇϱ⠶§¹®ÀÔ´Ï´Ù. ±× ´ÙÀ½Àº Scheduler¸¦ ÀÌÇØÇÏ¸é µÇ´Âµ¥ ÀÌ ¹®¼­´Â ¹üÀ§¸¦ ¿©±â±îÁö¸¸ ¼Ò°³Çϵµ·Ï ÇÏ°Ú½À´Ï´Ù.
Âü°í·Î ÀÓÀÇÀÇ TLB ƯÁ¤ ºÎºÐÀ» °»½ÅÇÒ¼ö ÀÖ´Â ¸í·ÉÀÌ Àִµ¥ Àؾî¸Ô¾ú½À´Ï´Ù. ³ªÁß¿¡ »ý°¢³ª¸é ¾²µµ·Ï ÇÏ°Ú½À´Ï´Ù.

GDT/IDT Setup -> º¸È£¸ðµå ÁøÀÔ ¹× ¸®¾ó¸ðµå µ¹¾Æ¿À±â ¿¹Á¦

; Copyright (c) MINZ
; Code by JaeHyuk Cho - <mailto:minzkn@infoeq.com>
DEF_ASM_GO32       EQU "GO32.ASM"

DEF_MAX_DefaultGDT = 2000h                                 ; 8192d
DEF_MAX_DefaultIDT = 0100h                                 ;  256d

PUBLIC             RegisterIDT, RegisterGDT
PUBLIC             SetupIDT, SetupGDT
PUBLIC             Go32
PUBLIC             L_Exit32
;
PUBLIC             D_StackFrame
PUBLIC             D_IDTR, D_GDTR
PUBLIC             D_IDT_Item, D_GDT_Item
PUBLIC             D_IDT, D_GDT

                   ASSUME CS:CODE_GO32, DS:DATA_GO32, ES:NOTHING, SS:STACK_DEFAULT
CODE_GO32          SEGMENT
¿©±â±îÁö´Â ±×³É ÀϹÝÀûÀÎ ¾î¼Àºí¸®ÀÇ ¾Õ ¸Ó¸®ÀÔ´Ï´Ù.

RegisterIDT        PROC FAR ; void far pascal RegisterIDT(unsigned int s_intnum) ; IDT Ãß°¡ »ý¼º
                   PUSH BP
                   MOV BP, SP
                   PUSH EAX
                   PUSH EDX
                   XOR EAX, EAX
                   MOV AX, WORD PTR [BP + 06h]             ; s_intnum
                   MOV DX, DEF_SIZE_Descriptor
                   MUL DX
                   ADD EAX, OFFSET DESC_GO32_IDT:D_IDT
                   PUSH DESC_GO32_IDT
                   PUSH AX
                   PUSH DATA_GO32
                   PUSH OFFSET DATA_GO32:D_IDT_Item
                   PUSH DEF_SIZE_Descriptor
                   CALL FAR PTR CODE_MEMORY:MemCpy
                   POP EDX
                   POP EAX
                   POP BP
                   RETF 2
RegisterIDT        ENDP
IDT¸¦ ±¸Á¶¿¡ ¸Â°Ô ÀÎÀÚ·Î ¹Þ¾Æ¼­ ¸¸µé¾î ÁÝ´Ï´Ù.

RegisterGDT        PROC FAR ; void far pascal RegisterGDT(unsigned int s_descnum)
                   PUSH BP
                   MOV BP, SP
                   PUSH EAX
                   PUSH EDX
                   XOR EAX, EAX
                   MOV AX, WORD PTR [BP + 06h]             ; s_descnum
                   MOV DX, DEF_SIZE_Descriptor
                   MUL DX
                   ADD EAX, OFFSET DESC_GO32_GDT:D_GDT
                   PUSH DESC_GO32_GDT
                   PUSH AX
                   PUSH DATA_GO32
                   PUSH OFFSET DATA_GO32:D_GDT_Item
                   PUSH DEF_SIZE_Descriptor
                   CALL FAR PTR CODE_MEMORY:MemCpy
                   POP EDX
                   POP EAX
                   POP BP
                   RETF 2
RegisterGDT        ENDP
GDT¸¦ ±¸Á¶¿¡ ¸Â°Ô ÀÎÀÚ·Î ¹Þ¾Æ¼­ ¸¸µé¾î ÁÝ´Ï´Ù.

SetupIDT           PROC FAR ; void far pascal SetupIDT(void)
                   PUSH DS
                   PUSH AX
                   MOV AX, DATA_GO32
                   MOV DS, AX

                   POP AX
                   POP DS
                   RETF
SetupIDT           ENDP
IDT¸¦ ¸¸µå´Â ºÎºÐÀÌÁö¸¸ ±×³É ºñ¾î ÀÖ½À´Ï´Ù. !SetupGDTÇÔ¼öó·³ RegisterIDT¸¦ »ç¿ëÇÏ¿© ¾È¿¡ ä¿ö³ÖÀ¸¸é µË´Ï´Ù.

SetupGDT           PROC FAR ; void far pascal SetupGDT(void)                                     
                   PUSH DS
                   PUSH AX
                   PUSH BX
                   MOV AX, DATA_GO32
                   MOV DS, AX
                   ; 0000h - Null descriptor
                   XOR AX, AX
                   MOV WORD PTR DATA_GO32:D_GDT_Item.STRUC_LimitLow, AX
                   MOV WORD PTR DATA_GO32:D_GDT_Item.STRUC_BaseLow, AX
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_BaseMid, AL
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_Access00, AL
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_Access01, AL
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_BaseHigh, AL
                   PUSH AX
                   CALL FAR PTR CODE_GO32:RegisterGDT
                   ; 0001h - IDT descriptor
                   ; 0002h - GDT descriptor
                   ; 0003h - Real code descriptor
                   PUSH CODE_GO32
                   PUSH DEF_Null
                   CALL FAR PTR CODE_CALC:ToPhysical
                   MOV WORD PTR DATA_GO32:D_GDT_Item.STRUC_LimitLow, 0FFFFh
                   MOV WORD PTR DATA_GO32:D_GDT_Item.STRUC_BaseLow, AX
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_BaseMid, DL
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_Access00, 10011010b
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_Access01, 00000000b
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_BaseHigh, DH
                   PUSH 0003h
                   CALL FAR PTR CODE_GO32:RegisterGDT
                   ; 0004h - Real data descriptor                   
                   PUSH DATA_GO32
                   PUSH DEF_Null
                   CALL FAR PTR CODE_CALC:ToPhysical
                   MOV WORD PTR DATA_GO32:D_GDT_Item.STRUC_LimitLow, 0FFFFh
                   MOV WORD PTR DATA_GO32:D_GDT_Item.STRUC_BaseLow, AX
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_BaseMid, DL
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_Access00, 10010010b
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_Access01, 00000000b
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_BaseHigh, DH
                   PUSH 0004h
                   CALL FAR PTR CODE_GO32:RegisterGDT
                   ; 0005h - Full data descriptor
                   MOV WORD PTR DATA_GO32:D_GDT_Item.STRUC_LimitLow, 0FFFFh
                   MOV WORD PTR DATA_GO32:D_GDT_Item.STRUC_BaseLow, 00000h
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_BaseMid, 000h
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_Access00, 10010010b
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_Access01, 11001111b
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_BaseHigh, 000h
                   PUSH 0005h
                   CALL FAR PTR CODE_GO32:RegisterGDT
                   ; 0006h - Video data(TEXT) descriptor
                   ; 0007h - Video data(GRAPHICS) descriptor
                   ; 0008h - Code descriptor
                   PUSH CODE_KN32
                   PUSH OFFSET CODE_KN32:KernelMain32
                   CALL FAR PTR CODE_CALC:ToPhysical
                   MOV WORD PTR DATA_GO32:D_GDT_Item.STRUC_LimitLow, 0FFFFh
                   MOV WORD PTR DATA_GO32:D_GDT_Item.STRUC_BaseLow, AX
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_BaseMid, DL
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_Access00, 10011110b
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_Access01, 11000000b
                   MOV BYTE PTR DATA_GO32:D_GDT_Item.STRUC_BaseHigh, DH
                   PUSH 0008h
                   CALL FAR PTR CODE_GO32:RegisterGDT
                   ; 0009h - Data descriptor
                   ; 000Ah - Bss descriptor
                   ; 000Bh - Stack descriptor
                   ; 000Ch - Heap descriptor

                   ; Load GDT
                   MOV EAX, OFFSET DESC_GO32_GDT:D_GDT
                   PUSH DESC_GO32_GDT
                   PUSH AX
                   CALL FAR PTR CODE_CALC:ToPhysical
                   MOV WORD PTR DATA_GO32:D_GDTR.STRUC_LimitLow, (DEF_MAX_DefaultGDT * DEF_SIZE_Descriptor) - 1
                   MOV WORD PTR DATA_GO32:D_GDTR.STRUC_BaseLow, AX
                   MOV BYTE PTR DATA_GO32:D_GDTR.STRUC_BaseMid, DL
                   MOV BYTE PTR DATA_GO32:D_GDTR.STRUC_Access00, DH
                   LGDT QWORD PTR DATA_GO32:D_GDTR
                   POP BX
                   POP AX
                   POP DS
                   RETF
SetupGDT           ENDP
»ç¿ëÇÒ Descriptor¸¦ ¼º°Ý¿¡ ¸Â°Ô µî·ÏÇÕ´Ï´Ù.

Go32               PROC FAR ; void far pascal Go32(void)
                   PUSH DS
                   PUSH ES
                   PUSH FS
                   PUSH GS
                   PUSHAD
                   ; Print
                   PUSH DATA_GO32
                   PUSH OFFSET DATA_GO32:S_MSG_Go32_Enter
                   CALL FAR PTR CODE_TEXT:Puts
                   ; Clear descriptor
                   PUSH DESC_GO32_IDT
                   MOV EAX, OFFSET DESC_GO32_IDT:D_IDT ; 32bit offset
                   PUSH AX
                   PUSH DEF_Null
                   PUSH (DEF_MAX_DefaultIDT * DEF_SIZE_Descriptor) SHR 01h
                   CALL FAR PTR CODE_MEMORY:MemSetW
                   PUSH DESC_GO32_GDT
                   MOV EAX, OFFSET DESC_GO32_GDT:D_GDT ; 32bit offset
                   PUSH AX
                   PUSH DEF_Null
                   PUSH (DEF_MAX_DefaultGDT * DEF_SIZE_Descriptor) SHR 01h
                   CALL FAR PTR CODE_MEMORY:MemSetW
                   ; Setup descriptor & environ
                   CALL FAR PTR CODE_GO32:SetupIDT
                   CALL FAR PTR CODE_GO32:SetupGDT
                   ; Set PE
                   MOV AX, DATA_GO32
                   MOV DS, AX
                   MOV AX, SS
                   MOV WORD PTR DATA_GO32:D_StackFrame[DEF_Far_Segment], AX
                   MOV WORD PTR DATA_GO32:D_StackFrame[DEF_Far_Offset], SP
                   MOV EAX, CR0
                   OR AL, 01h
                   MOV CR0, EAX ; º¸È£¸ðµå ÁøÀÔÁ¡
                   MAC_ClearCache ; Code cache¸¦ Áö¿ì±â À§ÇØ ±×³É ¹Ù·Î ¾Õ¿¡ Á¡ÇÁ "jmp $+2"
                   MAC_JumpFar <0003h * DEF_SIZE_Descriptor>, <OFFSET CODE_GO32:L_GO32_Enter> ; DWORD jump ÀÔ´Ï´Ù.
L_GO32_Enter       LABEL FAR
                   MOV AX, 0004h * DEF_SIZE_Descriptor
                   MOV DS, AX
                   MOV ES, AX
                   MOV FS, AX
                   MOV GS, AX
                   ; MOV AX, 000Bh * DEF_SIZE_Descriptor
                   ; MOV SS, AX
                   ; XOR ESP, ESP
                   XOR EAX, EAX
                   XOR EBX, EBX
                   XOR ECX, ECX
                   XOR EDX, EDX
                   XOR ESI, ESI
                   XOR EDI, EDI
                   XOR EBP, EBP

                   MAC_JumpFar <0008h * DEF_SIZE_Descriptor>, <OFFSET CODE_KN32:KernelMain32> ; ½ÇÁ¦ 32ºñÆ® µ¿ÀÛÀ» ÇÒ 32ºñÆ® Äڵ尡 ÀÖ´Â °÷

                   ; Clear PE
L_Exit32           LABEL FAR
                   MOV EAX, CR0
                   AND AL, 0FEh
                   MOV CR0, EAX
                   MAC_ClearCache
                   MAC_JumpFar <CODE_GO32>, <OFFSET CODE_GO32:L_GO32_Return> ; Real mode·Î µ¹¾Æ¿É´Ï´Ù. ÇÏÁö¸¸ ¾ÆÁ÷Àº Real modeÀÇ ¿ÏÀüÇÑ ¹ÝȯÀº ¾Æ´Õ´Ï´Ù.
L_GO32_Return      LABEL FAR
                   ; Restore environ
                   MOV AX, DATA_GO32 ; ¿©±â¼­ ½ÇÁ¦·Î Real mode¸¦ À§ÇÑ Segment¸¦ ¹èÄ¡ÇÏ¿© ÁÝ´Ï´Ù.
                   MOV DS, AX
                   XOR AX, AX
                   MOV ES, AX
                   MOV FS, AX
                   MOV GS, AX
                   LSS SP, DWORD PTR DATA_GO32:D_StackFrame
                   ; Print
                   PUSH DATA_GO32
                   PUSH OFFSET DATA_GO32:S_MSG_Go32_Return
                   CALL FAR PTR CODE_TEXT:Puts
                   POPAD
                   POP GS
                   POP FS
                   POP ES
                   POP DS
                   RETF
Go32               ENDP
º¸È£¸ðµå·Î ÁøÀÔÇß´Ù°¡ ±×³É ³ª¿É´Ï´Ù.

CODE_GO32          ENDS

                   ASSUME CS:CODE_GO32, DS:DATA_GO32, ES:NOTHING, SS:STACK_DEFAULT
DATA_GO32          SEGMENT
S_MSG_Go32_Enter   DB 0FEh, " Enter to 32bit processing."
                   DB DEF_ASCII_CarrigeReturn, DEF_ASCII_LineFeed
                   DB DEF_ASCII_EndOfString
S_MSG_Go32_Return  DB 0FEh, " Return to 16bit processing."
                   DB DEF_ASCII_CarrigeReturn, DEF_ASCII_LineFeed
                   DB DEF_ASCII_EndOfString
D_StackFrame       DW DEF_Null, STACK_DEFAULT
D_IDTR             STRUC_Descriptor <0000h, 0000h, 00h, 00h, 00h, 00h>
D_GDTR             STRUC_Descriptor <0000h, 0000h, 00h, 00h, 00h, 00h>
D_IDT_Item         STRUC_Descriptor <0000h, 0000h, 00h, 00h, 00h, 00h>
D_GDT_Item         STRUC_Descriptor <0000h, 0000h, 00h, 00h, 00h, 00h>
DATA_GO32          ENDS

                   ASSUME CS:CODE_GO32, DS:BSS_GO32, ES:NOTHING, SS:STACK_DEFAULT
BSS_GO32           SEGMENT
BSS_GO32           ENDS

                   ASSUME CS:CODE_GO32, DS:DESC_GO32_IDT, ES:NOTHING, SS:STACK_DEFAULT
DESC_GO32_IDT      SEGMENT
D_IDT              STRUC_Descriptor DEF_MAX_DefaultIDT DUP (<>)
DESC_GO32_IDT      ENDS

                   ASSUME CS:CODE_GO32, DS:DESC_GO32_GDT, ES:NOTHING, SS:STACK_DEFAULT
DESC_GO32_GDT      SEGMENT
D_GDT              STRUC_Descriptor DEF_MAX_DefaultGDT DUP (<>)
DESC_GO32_GDT      ENDS
                   END

; End of source
º¸½Ã´Â ¹Ù¿Í °°ÀÌ ÇÊ¿äÇÑ Data segment¸¦ ±â¼úÇÏ¿´½À´Ï´Ù.

ID
Password
Join
It is Fortune, not wisdom that rules man's life.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2008-07-05 21:32:59
Processing time 0.0115 sec