«OÅ@¼Ò¦¡°ò¦
(PROTECTED MODE BASICS )
±qÀ³¥Îµ{¦¡ªº¨¤«×¨Ó¬Ý¡A«OÅ@¼Ò¦¡©M¯u¹ê¼Ò¦¡¨Ã¨S¦³¨º»òªº¤£¦P¡C¨âºØ³£¬O¹B¥Î°O¾ÐÅé¤À¬q
(memory segmentation)¡B¤¤Â_(interrupts)©M¸Ë¸mÅX°Êµ{¦¡¥hºÞ²zµwÅé¡C¦ý¬O¡A³o¸Ì¦³¤@ÂIÂI¤£¦P¡A
¨ÏDOSÀ³¥Îµ{¦¡¶i¤J«OÅ@¼Ò¦¡Åܪº«n¡C
¯u¹ê¼Ò¦¡¤U¡A¦b¨Ï¥Î¤º³¡ªº¾÷¨îªº¹Lµ{¸Ì¡A°O¾ÐÅé¤À¬q¸ò¸`°Ï¼È¦s¾¹³s±µ®É³Q¦Û°Ê¦a³B²z¡C
³o¨Ç¸`°Ï¼È¦s¾¹ªº¤º®e§Î¦¨¤@³¡¥÷ªº¹êÅé¦ì§}(physical
address)¡ACPU±N¨äªí¥Ü¦b¦a§}¶×¬y±Æ(see
figure1a)¡C±N¸`°Ï¼È¦s¾¹¼¥H16¡AµM«á¥[¤W¤@Ó16-bitsªº¸`¤º¦ì¸m¥H²£¥Í¹êÅé¦ì§}¡C16-
bitsªº¸`¤º
¦ì¸m·t¥Ü CPU ³Q¨î¬°¸`°Ï¤j¤p¬°64K¡C¤@¨Çµ{¦¡³]pªÌ´¿¸gÂǵۼW¥[¸`°Ï¼È¦s¾¹ªº¤º®e¡A³]p¹L
¨î¦¨¤j¬ù64K¤j¤pªº¸`°Ï¡C¥L̪ºµ{¦¡¥i¥H«ü¦V¥H16-bytes¼W¶qªº64K¸`°Ï¡C¥ô¦ó¦b«OÅ@¼Ò¦¡¸Ì¹B
¥Î³o¼W¶q§Þ³Nªºµ{¦¡·|²£¥Í¤@Ó¿ù»~ª¬ªp(exception)
----- CPU ²£¥Í¤¤Â_¡A©Ò¥H¸`°Ï¼È¦s¾¹¤£¯à¦b«O
Å@¼Ò¦¡¤U¥Î³oºØ¤è¦¡³B²z¡C
¦b«OÅ@¼Ò¦¡¤U¡A°O¾ÐÅé¤À¬q³Q¤@²Õ¥Ø¿ý
(descriptor tables)©w¸q¡A¸`°Ï¼È¦s¾¹¦³«ü¼Ð«ü¦V³o¨Ç
¥Ø¿ý¡C¨C¤@¥Ø¿ýªº±ø¥Ø
(entry)¦³ 8-bytes¤j¤p¼e¡A¦]¦¹¥]§t¦b¸`°Ï¼È¦s¾¹¸Ìªº¼ÆÈ³Q©w¸q¬°¤Kªº¿¼Æ
(08h¡B10h¡B18h
µ¥)¡C¦b¸`°Ï¼È¦s¾¹³Ì§Cªº¤TÓbits³Q¦p¦¹©w¸q¡A¦ý¬O¬°Â²¤Æ¦Ó¨¥¡A§ÚÌ»¡¥ô¦óµ{¦¡
Ū¶i¸`°Ï¼È¦s¾¹ªº¼ÆÈ¡A¦pªG¤£¬O¤Kªº¿¼Æªº¸Ü¡A´N·|¥X²{«OÅ@©Êªº¿ù»~¡C
³o¸Ì¦³¨âºØ¥Ø¿ýªíªº«¬ºA³Q¥Î¨Ó©w¸q°O¾ÐÅé¤À¬q
¡GGlobal Descriptor Table (GDT)¡A©M
Local Descriptor Table (LDT)¡C©Ò¦³ªºÀ³¥Îµ{¦¡³£¥i¦s¨ú
GDT¸Ì¥]§tªº¤À¬qªº¸ê°T¡C
LDT ¥]§t
¦³¯S©wªºµ{¦¡©Î¤u§@ªº¤À¬q¸ê°T
¡C
¦p¥ý«e©Ò´£¨ìªº¡A
¸`°Ï¼È¦s¾¹¤£·|¦b«OÅ@¼Ò¦¡¤U§Î¦¨¹êÅé¦ì¸m¡C
¦ý¬O³Q´À¥N©Êªº¹B¥Î¦¨«ü¦V
GDT©Î LDT¥Ø¿ý±ø¥Øªº«ü¼Ð
(see figure 1b)¡C¨C·í¤@Ó¸`°Ï¼È¦s¾¹³Q¸ü¤J¡A¤@Ó°ò§}(base
address)
±qªí¤Wªº±ø¥Ø³Q¨ú±o¡A¨Ã³Q¦s¨ì¤@Óµ{¦¡³]pªÌ¬Ý¤£¨£ªº¤º³¡ªº¼È¦s¾¹¡A¥s°µ¡©segment
descriptor cache¡ª¡C¦bCPU¦ì§}¶×¬y½uªí¥Üªº¹êÅé¦ì¸m¡A´N¬O¦s¦bdescriptor
cacheªº°ò§}¡A¥[¤W 16©Î
32-bits
ªº¸`¤º¦ì§}¡C
¥t¤@Ó³s±µ¯u¹ê¼Ò¦¡©M«OÅ@¼Ò¦¡ªºÀ³¥Îµ{¦¡ªº¥DnÃö«Y¬°¤¤Â_ªº¹B¥Î¡C¦b¯u¹ê¼Ò¦¡¤U¡A«ü¦V
¤¤Â_±`¦¡ªºdouble-word(4-bytes)«ü¼Ð¸¨¦b¹êÅé¦ì§}0¡CFigure
4a¤¶²Ð¦b¯u¹ê¼Ò¦¡¤Uªº¤¤Â_ªA°È¦ì§}¡C
·í¤@Ó¤¤Â_³Q©I¥s©Î²£¥Í¡ACPU§ä´M¦b¤¤Â_¦V¶qªí
(vector table)¤¤ªº¤¤Â_ªA°È±`¦¡
Interrupt Service
Routine (ISR) ªº¦ì§}¡C¦b
CPU±NºX¼Ð±À¤J°ïÅ|«á¡A¥¦¹ïªí¤¤¦a§}µo¥X¤@Ó»»»·ªº©I¥s¡C³Q±À¤J°ïÅ|
¤¤ªº¸ê®Æ¡A¹ï³nÅé¡BµwÅé©ÎCPU²£¥Íªº¤¤Â_³£¤@¼Ë¡C
¦b«OÅ@¼Ò¦¡¸Ì¡A¦b°ïÅ|¸Ìªº¸ê®Æ¥i¥H§ïÅÜ¡A´N¹³¤¤Â_¦V¶qªí¤¤ªº°ò§}©M¨ä¤j¤p¤]¥i¥H§ïÅܤ@
¼Ë¡C¤¤Â_¦V¶qªº§ä´M¾÷¨î¬Û¹ïªº¤]¸ò¯u¹ê¼Ò¦¡®t§O«Ü¤j¡CFigure
4b Åã¥Ü¤¤Â_¬O¦p¦ó³Q«OÅ@¼Ò¦¡©I¥s
¡C¤@Ó¤¤Â_²£¥Í«á¡ACPU¤ñ¸û¤¤Â_¼ÆÈ(x8)
-- ¦s¦b interrupt descriptor cache¼È¦s¾¹
-- ªº¤j¤p¡A¬O§_
¹H¤ÏIDTªº¨î¤¤¡C¦pªG
int #x8 ¨S¦³¶W¹LIDTªº¤j¤p¨î¡A¨º³oÓ¤¤Â_³Q»{¬°¬O¥i±µ¨üªº¡A©ó¬O
IDT
°ò§}±qdescriptor cache³Q¨ú±o¡CµM«á¤¤Â_ªA°È±`¦¡
(ISR) ªº«OÅ@¼Ò¦¡¦ì§}±qIDT¸Ì¨ú±o¡CISRªº¦ì§}
¬O«OÅ@¼Ò¦¡¸`°Ï¦ì§}¦Ó¤£¬OÓ¹êÅé¦ì§}¡C¥ÎIDT«ü©wªº¸`°Ï¿ï¾Ü¾¹¡A¦bpºâ
ISR¸Ìªº¹êÅé¦ì§}®É¡ACPU
¥²¶·¦A¹ê¦æ¤@¦¸¦P¼Ëªº¬É½uÀˬdµ{§Ç¡C¨C·í¹êÅé¦ì§}³Qpºâ¡ACPU¦bÂà¦ì(branch)
ISR«e«K±NºX¼Ð¡B
¸`°Ï¦ì§}¡B¸`¤º¦ì§}¡A¥H¤Î¥i¯àªº¿ù»~½X±À¤J°ïÅ|¡C³nÅé©MµwÅ餤Â_ªº
ISRs¤£»Ýn»P¯u¹ê¼Ò¦¡¦³¥ô
¦óªº¤£¦P¡A¦ý¬OISRs¹ïªA°ÈCPU²£¥Íªº¤¤Â_©M¿ù»~¥²¶·¤£¦P¡C
CPU²£¥Í¤TºØºØÃþªº¤¤Â_¡Gtraps¡Bfaults¡Baborts
(²§±`¤¤Â_µ{¦¡)¡C°ïÅ|¹Ï¦]¬°¤£¦PªººØÃþ
¦ÓÅܤơC´N¹³¤@Ó¿ù»~½X¡A´N¥i¯à·|³Q±À¤J°ïÅ|¡Ctraps
µ´¤£·|±À¤J¤@Ó¿ù»~½X¡Afaults
«o³q±`·|¡A
¦Óaborts¬O¤@©w·|¡C
trapsÃþ¦ü©ó¥]§t³nÅ餤Â_¡A³oºØ«¬ºAªº¤¤Â_³Q¦X¾Aªº©R¦W¡A´N¹³CPU¥¿®·®»¨Æ¥óªºµo¥Í---
CPUª½¨ì¬Ý¨ì¨Æ¹ê¡A¤~·|ª¾¹D¨Æ¥óµo¥Í¤F¡C©Ò¥H¥¦¥²¶·¦b¹ï¤¤Â_°µ°O¸¹«e®·®»¨ì¨Æ±¡¡C¦]¦¹¡A¨º¨Ç
ISRªºªð¦^¦ì§}«ü¦V§ÀÀH¦b¨Æ¥óµo¥Íªº«ü¥O¡Ctraps³B²zªº¨Æ¥ó¥]§t¤F°£¼Æ¬°¹s¡B¸ê®Æ¤¤Â_ÂI
(data breakpoints)¡A©MINT 03¡C
faults¦]¬°¬Y¨Ç¨Æ±¡----À³¸Ó¬O©T©wªº¡A¥X¿ù¦Óµo¥Í¡C
CPU ¥ß§Y¦aª¾¹D¬Y¨Ç¨Æ¥X¿ù¡AµM«á¹ï
¤¤Â_²£¥Í¾÷¨îµo¥X°T¸¹¡C³oºØ«¬ºAªº
ISR ªº¥Dn¥Øªº¬O§ï¥¿°ÝÃD¡A¥H¤Î¦b¥¦¥X¿ùªº¦a¤è¡A«·s¥¿½T
¦a±Ò°Êµ{¦¡¡C¬°¤F³oÓ²z¥Ñ¡AISRªºªð¦^¦ì§}¡A«ü¦V
faulting«ü¥O---¦]¦¹¨Ïfault ¥i¥H«·s¶}©l¡C
aborts ¬O¤¤Â_¸Ì³ÌÄYÂÔªº«¬ºA¡A¥B³Qµø¬°¤£¥i«¨Óªº¡C¤@Ó¿ù»~½X³Q±À¤J°ïÅ|¡A¦ý¬O¥Ã»·
³£¬O 0¡CCPU ªº°ïÅ|¸`°Ï©Mª¬ºA¾÷¾¹¡A¥i¯à·|³B¦b¤@Ó¤£©ú½Tªºª¬ºA¡AµM«á¥ø¹Ï«·s¶}©l¤@Óabort
·|¾ÉP¤£¥i¹w´Áªº¦æ¬°¡CTable
1¤ÀÃþCPU¬°«OÅ@¼Ò¦¡²£¥Íªº¤@²Õ¤¤Â_¡C¦b«Ü¦h±¡ªp¤U¡ACPU¤]·|¦b
¯u¹ê¼Ò¦¡¸Ì²£¥Í¦P¼Ëªº¤¤Â_¡A¦ý¬O¨S¦³¥ô¦óªº¿ù»~½X·|³Q±À¤J°ïÅ|¡C
§Ú¹L¥h®É±`·QµÛ¡A¬°¤°»òBIOS¤£¯à¦b«OÅ@¼Ò¦¡¤U³Q¹B¥Î¡C¦b¨ºÓ®ÉÔ¡A§Ú·Q¥h¼g¤@Ó»P¼Ò
¦¡µLÃöªºµ{¦¡½XÀ³¸Ó¬O²³æªº¡G¥un¤£n°µ¥ô¦ó»·ºÝªº¸õÅD
(Far Jump)©Î»·ºÝ©I¥s (Far
call)¡C¦ý¬O
³o¨Ã¤£¦pÀHµÛ³o¨ÇºD¨Ò¤@¼Ë²³æ¡C¬°¤FÁ×§K¥Î¨ì»·ºÝ©I¥s©Î»·ºÝ¸õÅD¡AISR
¥²¶·²¾¥h¥ô¦ó³Q±À¤J°ï
Å|ªº¿ù»~½X¡C³o´N¬O¤£¥i¯à©Êªº¶}©l¡C¬JµM¿ù»~½X¥u¦³¦b«OÅ@¼Ò¦¡¤U³Q©ñ¶i°ïÅ|¡A§ÚÌ»Ýn¦b¿ù»~
½X³Q²¾°£«e¡A°»´ú¬O§_²{¦b¬O¦b«OÅ@¼Ò¦¡¤U¡C¬°¤F½T©w³o¡A§ÚÌ»Ýn¨Ï¥Î¨ì
machine status work
(MSW)¡A©Î¨t²Î¼È¦s¾¹
CR0¡C¦b¥ô¦ó¯SÅv¼h¦¸¤U¡A¥i°µ¨ì¨Ï¥Î
MSW¡A¦ý¬O¨Ï¥ÎCR0¡A¥u¯à¦b³Ì°ª
¯SÅv¼h¦¸----¼h¦¸
0¡C¨Ï¥ÎªÌªºµ{¦¡¬O¦b¥ô¦ó¤p©ó¼h¦¸
0 ªº¼h¦¸¤U³Q°õ¦æ¡C¦]¦¹§Ṳ́£¥i¯à¥h¨Ï¥Î³o
¨Ç¼È¦s¾¹¡C°£«D¸g¥Ñ¹B¥Î¯S§Oªº©I¥s¹h(call
gate)§Ṳ́~¥i¯à¨Ï¥Î---¨Ï§Ú̦b©I¥sISR¤§«eÂà´«¯SÅv
¼h¡C¦pªG§ÚÌ¥ÎSMSWªº«ü¥O¡A´N¤£»Ýn³o¼Ë°µ¤F¡C¦ý¬O§Y¨Ï³o°ÝÃD¸Ñ¨M¤F¡A¦b¥ô¦ó¤@Óªº¸`°Ï¼È
¦s¾¹¤¤¡A§Ú̲q·Q³oµ{¦¡¯d¤U¤@Ó¯u¹ê¼Ò¦¡ªº¼ÆÈ¡A¡C¦pªG
ISR±À¤J¥H¤Î«á¨Ó±À¥X³o¨Ç¼È¦s¾¹¤¤ªº
¥ô¤@Ó¡A³o±À¥X±N·|¾ÉPCPU¥h§ä´M¤@Ó¦bGDT©ÎLDTªº¿ï¾Ü¾¹¡C§ó¥i¯àªº¬O¡A¨Ï¥Î¤@Ó¯u¹ê¼Ò¦¡
¤Uªº¼ÆÈ·|¾ÉP«OÅ@©Êªº¿ù»~¡C¦]¦¹¡A¦b«OÅ@¼Ò¦¡¤U¹B¥Î
BIOS ¬O´X¥G¤£¥i¯àªº¡C¦pªG³o¸Ì©w¸q¤F
¤@ ²Õ¼Ð·Çªº³W«h¡A©Ò¦³ªºµ{¦¡³]pªÌ©M§@·~¨t²Î³£¿í´`ªº¸Ü¡A¥¦¤]³\¥i¥H¹ê¦æ¡C
Figure 4(a) -- Interrupt service addressing in Real Mode
Fig 4(b) Interrupt service addressing in Protected Mode
¦Wµü¸ÑÄÀ¡G
«OÅ@¼Ò¦¡¡G286¥H¤WªºCPU³£¥i¶i¤J«OÅ@¼Ò¦¡
¡C©Ò¿×«OÅ@¼Ò¦¡¡A¬O«üµwÅé´£¨Ñ¦³°O¾ÐÅé¨Ï¥Î¤Wªº«O
Å@¡A»P¦h¤u³B²zªº¯à¤Oµ¥¡C«OÅ@¼Ò¦¡¤U©Ò¼ÒÀÀªº¯u¹ê¼Ò¦¡¥s°µµêÀÀ86¼Ò¦¡¡A¥i¥Î¨Ó°õ¦æ
8088/86ªºµ{¦¡¡C |
¯u¹ê¼Ò¦¡¡G80X86¨t¦CCPU¤@¶}¾÷®Éªº¼Ò¦¡¡C8088/86¥u¯à¦b³oºØ¼Ò¦¡¤U¤u§@¡C |
abort²§±`¤¤Â_µ{¦¡¡G¦¹µ{¦¡ªº¥\¯à¦b©ó¡A·í¨Ï¥ÎªÌµ{¦¡µo¥Í¤£¥i´_쪺¿ù»~®É¡A°±¤îµ{¦¡Ä~Äò°õ¦æ¡C |
branch¡G§Q¥ÎÂà¦ì«ü¦ì¨Ï±o¤@Óµ{¦¡ªº°õ¦æ¶¶§Ç¥i¥HÀH·N¥[¥H§ïÅÜ©M¹B¥Î¡A¨Ï±oµ{¦¡§ó¬°¦³®Ä©M
¸gÀÙ¡C |
base address¡G¦b²Õ»y«ü¥O¤¤¡A«O«ù©T©w¤£ÅÜ¡A¥B§@¬°¤@°_©l¦ì§}ªº¦a§}È¡A³q±`µ{¦¡¤¤¨ä¥L«ü
¥Oªº¦a§}§¡®Ú¾Ú°ò§}´«ºâ¦Ó¨Óªº¡C |
breakpoint¡Gµ{¦¡¤¤¦]¨Ï¥ÎªÌ·QnÀˬdµ{¦¡©Î×§ïµ{¦¡¡A¦]¦Ón¨D¤¤Â_µ{¦¡°õ¦æªº¨º¤@ÂIºÙ¤§ |
descriptor table¡G¸ê®Æ¤¸¯À©M¨äÄݩʪº¦Cªí¡C |
exception¡G«ü¬YºØ¤£¥¿±`ªºª¬ªp¡C¦p³B²z¸ê®Æ¶°¦X©ÎÀɮ׮ɩҹJ¨ìªºI/O¿ù»~µ¥¬Ò¬O
¡C |
entry¡G¦ì©ó±±¨î¤À¬q¤º¡A¯à©w¸q¤@Ó¶i¤JÂI¡C |
interrupt¡G²×¤î¥¿±`°õ¦æªºµ{¦¡¡A©Î³q¹L¤¤Â_³B²zµ{¦¡¡A¼È®É§ïÅܱ±¨î¬y¦Vªº¤@Ó²§¨B¨Æ¥ó¡C |
limit check¬É½uÀˬd¡G¤@Ó¹ï¯S©w½d³ò¤º¤§¤º®e§@´ú¸Õ¥H½T«O¨ä³B©ó³Ì§C¤Î³Ì°ª¥i±µ¨ü«×¤§¤º¡C |
IDT¡Ginterrupt descriptor table¡C |
selector¿ï¾Ü¾¹¡G¦bpºâ¾÷³B²z¹Lµ{¤¤¡A®Ú¾Ú¥H°õ¦æ¤§³B²zµ²ªG¨Ó¨M©wÅÞ¿è¨Mµ¦ªº¦Û°ÊÂà¸m§@·~¿×¤§¡C |
segmentation¡G¥Ñµ{¦¡®v©w¸q¡A©M¨t²Îµ{¦¡¹ê¦æªº¤èªk¡A§âµ{¦¡¤À¬°¦n´X¬q¡A·í°õ¦æ®É¥u»Ý¸ü¤J
¬Y¨Ç³¡¤À¦Ó«D¾ãÓµ{¦¡¡C |
|
Table 1 -- Exceptions and Interrupts
Description |
Int # |
Type |
Return Addr points to faulting instruction |
Error Code |
This interrupt first appeared in this
CPU |
Division by 0
Debug Exception
NMI
Breakpoint
Overflow
Bounds
Invalid OP Code
Device not available
Double Fault
Copr. segment overrun
Invalid TSS
Segment not present
Stack fault
General Protection
Page fault
Floating point error
Alignment check
Machine check
Software interrupts |
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
16
17
18
0-255 |
Fault
*1
*2
Trap
Trap
Fault
Fault
Fault
Abort
Fault
Fault
Fault
Fault
Fault
Fault
Fault
Fault
Abort
Trap
|
Yes
*1
No
No
Yes
Yes
Yes
Yes
No
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No |
No
No
No
No
No
No
No
No
Yes
No
Yes
Yes
Yes
Yes
Yes
No
Yes
Yes
No |
8086
8086
8086
8086
8086
80186
80186
80186
80286
80286 *3
80286
80286
80286
80286
80386
80386
80486
Pentium *4
All |
*1 |
On the 386-class CPUs, debug exception can be
either traps, or faults. A trap is caused by the Trap Flag (TF) being set
| in the flags image, or using the debug registers to generate data breakpoints.
In this case the return address is the instruction following the trap.
Faults are generated by setting the debug registers for code execution
breakpoints. As with all faults, the return address points to the faulting
instruction. |
*2 |
Non-maskable. |
*3 |
Removed from the 80486, now generates exception
13 on all future processors. |
*4 |
Model dependant. Behavior may be different or
missing on future processors. |
|
|