You are on page 1of 444

See MIPS Run Linux (2nd edition)

w MIPS ——
 LinuxNX(¿Û
£1‡¤
MIPS

£d‘Aù¤Í
D. Sweetman
J.Qu£¯ï¤È

2007 c 12  31 F
Èö`²
ùpÈ©ÑuÆI‡ ?1§Ï 3€Èžå¦O(§¿¦þ
±ÖŠóº‚"3؛³ŠöÚч£œ¹e§Èö#
NÚy?Û<Ñu˜!ÆS½‰ÆïÄšJ|8§E›ÚD©
>f€"TÖ=©‡d Elsevier ч§‡8ŠöÚч¤k"k'
=©‡?Û¯K§žéXŠöÚч"
±e``Èö3€Èž˜ Ä"
È©å¦bC©"Ö©i')ħº‚'²w"€ÈžÄk¦
þyÈ©O(5"3dÄ:ƒþ§¦þbC©º‚"©¥9;
!¤Š½Ù§©zµ/§¦þ€È¤¥©¥aq`{"'X1 4 Ù'
u“skimmed the cream”Ú1 13 ÙIK€È"
éuÖ¥ã¦þì3§Ù¥©i؊€È"ù´Ä
ãÒ'†*§ã¥þ=©ã~ØAéÖöÖE¤æN"
éuÖ ¡¢Ú§3È©¥†Ñ"ù‰´Äù«¢Úéu
>f© ¿Â،"Ӟ¢Ú¥¤9=©3©õꮲ€È§
Uìi1gS|„¢ÚTXÛ­#|„‡ħ¢Ú¿Â®²Ø
Œ§q؊d¤ "
éuÖÖ¶€È§€Èž‰ AOÄ"TÖ1˜‡¥©òÖ¶
Ȥ5MIPS ?nìOßÀ6§Ù†Ø¢3´LulÌ"˜0 NX(
¡•§S Ö§1´rÖ¶‰U¤4<ر´˜0 ?nìO¡•
M‡< Ö§Š Ö¿§ kØÖöƒv"5§[«Ö
º‚§ÖÖ¶†È5w MIPS  Linux6Òé/–"´ù«Lu/–z
¶¡½NØÎÜ¥©Ööé‰EaÖ¶Ï"§Ïd€Èž‰Ö¶\þ
˜‡‡NÖSNBIK"
éuÖ¥˜ ”ا€ÈžŠâœ¹Š ØÓ?n"'XÖã
2.2§²L•Šö‡N(@ ?1 ?" ˜ ²w)ؽöü‡†Ø§K
†ƒ±?§ ؘ˜5²",˜ J±{ü?”اKì©ÈÑ"
éu˜ ;’c®§¦þæ^Ï^5‰È{"k ;’c®kü«±þ
Ï^È{£'X write-through ȏ“ߔړϔ¤§3È©¥À^˜«§
¿ ±c ˜—"3"yú@5‰È{œ¹e§(Üþe©¹Â±¿
i
Èö`²
ȏÌ"‡Oœ¹eë, È{?1?¾§½öŠâÈön)†€È"~
Xéu cache alias €È§±91ÔÙéuü«šê NaN €È"
1›Ùéu JTAG probe €È§?nk¤ØÓ"˜«2È{
´È¤“&§” Èöæ^ ù«È{"“&”˜c3"yþe©œ¹
eN´ÚåܧN´4ØÙG<@§´˜«[/"ku
d§©¥‰Ñ ,˜«È{§=“&ì"”“&”˜c u“JTAG”ÑÈ“
&‚”))qŒ±n)¿È§=“˜«8¤>´ëÿÁ!&ÿIO5
‚"”ùn)§probe ŠÎÜ“&‚”§È¤“&ì”Òég,§o
ÑÚ¿§žØ ÜÂ"È©¥Óžæ^ ü«È{§Ä±˜—"=«
È{Ð§ÖöŒgCä"
l 2007 c 7  27 Fúv§ 2007 c 9  7 FÐv§ÙmŠ Œ
?¾"d qkügÛÜ?¾§ È©¥˜ †Ø"ùgŠ ¡
?¾§?¾‰ŒÌ‡´éÖ ŒÜ©"g?¾ÌÝŒ§Ø Å)Ø
§é˜ ÈØ O(!')M!½öqØÐ/Š ØN§,
Ø ˜ßã­#?1 ›Š§‡OL‚ü‡k”‡CÄ"d §ùg?¾
dÈö3Ö O\ A^† PIC “èk'®?«Šé`²§F"é,
Öök¤Ï"
¦+ÈöŠ ««ãå±±©£5Ú›5§È©¥3ˆ«
†ØÕ¦3¤J"XJÈ©ÿkŒƒ?{§Î毧ù˜ƒÄkA8
õuŠö"XJÈ©LˆØ O(½ö” ©ºæ{§@oÄkA
´ÈöI?"È©¥««¯K§9œHÖöJÑB¿„"s1µ!
¿„ÚïƧž†ux‰Èö£jqu@softprise.com¤"

Èö
2007 c 12  31 F

ii

Èö`² i

S xiii

có xv

1 1 Ù MIPS Ú RISC NX( 1


1.1 6Y‚ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.1.1 Ÿo¦6Y‚Ç$e º . . . . . . . . . . . . . . . . 3
1.1.2 6Y‚Úp„  . . . . . . . . . . . . . . . . . . . . . . 4
1.2 MIPS Ê?6Y‚ . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 RISC Ú CISC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.4 LÚy3˜ ­‡ MIPS ¡ . . . . . . . . . . . . . . . . 7
1.4.1 R2000  R3000 ?nì . . . . . . . . . . . . . . . . . . . 7
1.4.2 R6000 ?n쵘Ý=• . . . . . . . . . . . . . . . . . . . 8
1.4.3 1˜‡ CPU Ø . . . . . . . . . . . . . . . . . . . . . . . . 9
1.4.4 QED: i\ªXÚp¯„ MIPS ?nì . . . . . . . . . . 11
1.4.5 R10000 ?nì9Ù Uö . . . . . . . . . . . . . . . . . . 12
1.4.6 ž¤a>f¬+ MIPS ?nì . . . . . . . . . . . . 13
1.4.7 ä´dìÚ-1‹<Å+ MIPS . . . . . . . . . . . 13
1.4.8 8ž“ MIPS ?nì . . . . . . . . . . . . . . . . . . 15
1.4.9 8U . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.5 MIPS Ú CISC NX(' . . . . . . . . . . . . . . . . . . . . 20
1.5.1 MIPS -8› . . . . . . . . . . . . . . . . . . . . . 20
1.5.2 όږ . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.5.3 MIPS vkA5 . . . . . . . . . . . . . . . . . . . . . . . 22
1.5.4 §S Œ„6Y‚J . . . . . . . . . . . . . . . . . . 23

1 2 Ù MIPS NX( 25
2.1 MIPS ®?Šóº‚Ð& . . . . . . . . . . . . . . . . . . . . . 28

iii
8¹ 8¹
2.2Mì . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2.1 Ï^MìS.·¶Ú^{ . . . . . . . . . . . . . . . . 30
2.3 ê¦{܇9Mì . . . . . . . . . . . . . . . . . . . . . . . . 32
2.4 \1†;µÏŒª . . . . . . . . . . . . . . . . . . . . . . . . 33
2.5 ;ì†Mìêâa. . . . . . . . . . . . . . . . . . . . . . 34
2.5.1 êêâa. . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.5.2 ™éà\1Ú; . . . . . . . . . . . . . . . . . . . . . 35
2.5.3 S¥2:êâ . . . . . . . . . . . . . . . . . . . . . . 35
2.6 ®?Šóܤ- . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.7 MIPS I  MIPS64 ISA: 64 (ÚÙ§)*Ð . . . . . . . . . . . 37
2.7.1 uÐ 64 . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.7.2 XI‡ 64 º . . . . . . . . . . . . . . . . . . . . . . . . 39
2.7.3 'u 64 † CPU ªƒ†µMì¥êâ . . . . . . . 39
2.8 Ä/Œ˜m . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.8.1 {üXÚό . . . . . . . . . . . . . . . . . . . . . . . 42
2.8.2 Ø%†^rA? . . . . . . . . . . . . . . . . . . . . . . 43
2.8.3 㔵64 /ŒN . . . . . . . . . . . . . . . . 43
2.9 6Y‚Œ„5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

1 3 Ù ?nì 0µMIPS ?n웛 46


3.1 CPU ››- . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.2 Ÿožÿ‡^= Mìº . . . . . . . . . . . . . . . . . . . . 51
3.3 CPU ››Mì9Ù?è . . . . . . . . . . . . . . . . . . . . . . 52
3.3.1 GMì£SR¤ . . . . . . . . . . . . . . . . . . . . . . 52
3.3.2 ÏMì(Cause) . . . . . . . . . . . . . . . . . . . . . . 56
3.3.3 É~ˆ£/Œ(EPC)Mì . . . . . . . . . . . . . . . . . 57
3.3.4 ÃJ[/Œ(BadVaddr)Mì . . . . . . . . . . . . . . 57
3.3.5 Count/Compare MìµCPU ¡þ½žì . . . . . . . . . 57
3.3.6 ?nì ID(PRId) Mì . . . . . . . . . . . . . . . . . . . 59
3.3.7 Config MìµCPU ] &EÚ˜ . . . . . . . . . . . . 60
3.3.8 EBase Ú IntCtlµ¥äÚÉ~˜ . . . . . . . . . . . . . . 63
3.3.9 SRSCtl Ú SRSMapµKfMì˜ . . . . . . . . . . 64
3.3.10 ë£\1/Œ£LLAddr¤Mì . . . . . . . . . . . . . . 65
3.4 CP0 ‘x——J“á\€² . . . . . . . . . . . . . . . . . . . . . 66
3.4.1 ‘x“o- . . . . . . . . . . . . . . . . . . . . . . . . . 66
3.4.2 -‘xÚ^r‘x . . . . . . . . . . . . . . . . . . . . . 67
3.4.3 3 CP0 -ƒm“o . . . . . . . . . . . . . . . . . . . 67

iv
8¹ 8¹
14Ù MIPS p„ óŠÅ› 69
4.1 p„ 9Ù+n . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.2 p„ ´NóŠ . . . . . . . . . . . . . . . . . . . . . . . . 70
4.3 @Ï MIPS CPU ßp„  . . . . . . . . . . . . . . . . . . 72
4.4 MIPS CPU £p„  . . . . . . . . . . . . . . . . . . . . . 73
4.5 p„ O˜ Ù§Ä . . . . . . . . . . . . . . . . . . . . 73
4.6 +np„  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
4.7 ?£L2¤Ún?£L3¤p„  . . . . . . . . . . . . . . . . . . 77
4.8 MIPS CPU p„ ˜ . . . . . . . . . . . . . . . . . . . . . 77
4.9 é MIPS32/64 p„ ?§ . . . . . . . . . . . . . . . . . . . 78
4.9.1 cache - . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.9.2 p„ ЩzÚ Tag/Data Mì . . . . . . . . . . . . 80
4.9.3 CacheERR!ERR Ú ErrorEPC Mìµ;ì/p„ 
ц?n . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
4.9.4 (½p„ ŒÚ˜ . . . . . . . . . . . . . . . . . 83
4.9.5 Щz§S . . . . . . . . . . . . . . . . . . . . . . . . . . 84
4.9.6 Š¢½ö£p„ ¥;« . . . . . . . . . . . . . 85
4.10 p„ Ç . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
4.11 ­#|„^‡±Kp„ Ç . . . . . . . . . . . . . . . . 88
4.12 p„ ­K . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

1 5 Ù É~!¥ä9Щz 92
5.1 °(É~ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
5.1.1 š°(É~——{¤þ MIPS CPU ¥¦{ì . . . . . 94
5.2 É~u)žÅ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
5.3 É~•þµÉ~?nm©/ . . . . . . . . . . . . . . . . . . . 95
5.4 É~?nµÄL§ . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.5 lÉ~ˆ£ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.6 i@É~ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.7 É~?n~§ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.8 ¥ä . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
5.8.1 MIPS CPU ¥ä] . . . . . . . . . . . . . . . . . . . 101
5.8.2 3^‡¥¢y¥ä`k? . . . . . . . . . . . . . . . . . . 103
5.8.3 f5±9é SR f?U . . . . . . . . . . . . . . . . 104
5.8.4 #N¥ä.«µMIPS ª&Òþ . . . . . . . . . . . 106
5.8.5 MIPS32/64 CPU ¥•þzÚ EIC ¥ä . . . . . . . . . 107
5.8.6 KfMì . . . . . . . . . . . . . . . . . . . . . . . . . . 108
5.9 éÄ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
5.9.1 uÿÚ£O\ CPU . . . . . . . . . . . . . . . . . . . . 110

v
8¹ 8¹
5.9.2ÚÚ½ . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
5.9.3 éÄA^§S . . . . . . . . . . . . . . . . . . . . . . . . . 111
5.10 -•ý . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

1 6 Ù . S+n† TLB 114


6.1 TLB/MMU M‡9ي^ . . . . . . . . . . . . . . . . . . . . . . 114
6.2 TLB/MMU Mì . . . . . . . . . . . . . . . . . . . . . . . . . . 115
6.2.1 TLB ' i——EntryHi Ú PageMask . . . . . . . . . . 115
6.2.2 TLB Ñэ——EntryLo0–1 . . . . . . . . . . . . . . . . 118
6.2.3 ÀJ TLB L‘——Index!Random Ú Wired Mì 120
6.2.4 L9ÏMì—— Context Ú XContext . . . . . . 120
6.3 TLB/MMU ››- . . . . . . . . . . . . . . . . . . . . . . . 122
6.4 TLB ?§ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
6.4.1 ­W´Nu)º . . . . . . . . . . . . . . . . . . . . . 123
6.4.2 ¦^ ASID . . . . . . . . . . . . . . . . . . . . . . . . . . 124
6.4.3 Random MìÚ Wired Mì . . . . . . . . . . . . . . 124
6.5 éM‡lАLÚ­Wś . . . . . . . . . . . . . . . . . . . . 125
6.5.1 TLB ™·¥?n . . . . . . . . . . . . . . . . . . . . . . . 126
6.5.2 XTLB ™·¥?n§S . . . . . . . . . . . . . . . . . . . . 127
6.6 MIPS TLB F~¦^ . . . . . . . . . . . . . . . . . . . . . . . . 128
6.7 {üöŠXÚ¥S+n . . . . . . . . . . . . . . . . . . . 129

1 7 Ù 2:|± 131
7.1 k'2:êÄVg . . . . . . . . . . . . . . . . . . . . . . . . 131
7.2 IEEE 754 IO9Ù{¤µ . . . . . . . . . . . . . . . . . . . . . 132
7.3 IEEE 2:ê;ª . . . . . . . . . . . . . . . . . . . . . . . 133
7.3.1 IEEE —êÚ5‚z . . . . . . . . . . . . . . . . . . . . . 134
7.3.2 Aϊ¦^ 3êŠ . . . . . . . . . . . . . . . . 135
7.3.3 MIPS FP ê₪ . . . . . . . . . . . . . . . . . . . . . . 135
7.4 MIPS é IEEE 754 ¢y . . . . . . . . . . . . . . . . . . . . . . 136
7.4.1 ¤k MIPS CPU ÑI‡2:g€?n§Sڕý§S . . 138
7.5 2:Mì . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
7.5.1 2:MìDÚS.·¶Ú^{ . . . . . . . . . . . . . 139
7.6 2:É~/¥ä . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
7.7 2:››µ››/GMì . . . . . . . . . . . . . . . . . . . . . 140
7.8 2:¢yMì . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
7.9 2:-H . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
7.9.1 Load/Store . . . . . . . . . . . . . . . . . . . . . . . . . . 145
7.9.2 MìmDx . . . . . . . . . . . . . . . . . . . . . . . . . 146
vi
8¹ 8¹
7.9.3 nöŠêŽâ$Ž . . . . . . . . . . . . . . . . . . . . . . 147
7.9.4 ¦\öŠ . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
7.9.5 ü8£CÒ¤öŠ . . . . . . . . . . . . . . . . . . . . . . . 148
7.9.6 êâ=†öŠ . . . . . . . . . . . . . . . . . . . . . . . . . 148
7.9.7 ^‡©|ÚÿÁ- . . . . . . . . . . . . . . . . . . . . . 149
7.10 ü°Ýé2:-±9 MIPS-3D ASE . . . . . . . . . . . . . . . 150
7.10.1 É~Úü°Ýé2:- . . . . . . . . . . . . . . . . . . 151
7.10.2 ü°ÝénöŠêŽâ$Ž!¦\!CÒÚÃ^‡êâD
xöŠ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
7.10.3 ü°Ýéa.=†öŠ . . . . . . . . . . . . . . . . . . 152
7.10.4 ü°ÝéÿÁÚ^‡Dx- . . . . . . . . . . . . . . 152
7.10.5 MIPS-3D - . . . . . . . . . . . . . . . . . . . . . . . . 153
7.11 -žS‡¦ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
7.12 -žSÚ„Ý . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
7.13 =IЩzڦU . . . . . . . . . . . . . . . . . . . . . . . . . . 156
7.14 2:•ý . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

1 8 Ù MIPS -8ëŒ 159


8.1 ˜‡{ü~f . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
8.2 ®?-9Ù¿Â . . . . . . . . . . . . . . . . . . . . . . . . . . 160
8.2.1 ‘ U Úؑ U (Non-U) ÏPÎ . . . . . . . . . . . . . . 162
8.2.2 Ø{ÏPÎ . . . . . . . . . . . . . . . . . . . . . . . . . . 162
8.2.3 -˜üL . . . . . . . . . . . . . . . . . . . . . . . . . 163
8.3 2:- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
8.4 † MIPS32/64 1˜‡ O . . . . . . . . . . . . . . . . . . . . . 191
8.4.1 1‡O\Êύ- . . . . . . . . . . . . . . . . . . . . 191
8.4.2 1‡O\A- . . . . . . . . . . . . . . . . . . . . 193
8.5 Aύ-9Ù^å . . . . . . . . . . . . . . . . . . . . . . . . . . 194
8.5.1 •†\1/•m\1µ™éà\1Ú; . . . . . . . . . 194
8.5.2 ë£\1/^‡; . . . . . . . . . . . . . . . . . . . . . . 197
8.5.3 ^‡Dx- . . . . . . . . . . . . . . . . . . . . . . . . . 199
8.5.4 ŒU©| . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
8.5.5 ê¦\Ú\\- . . . . . . . . . . . . . . . . . . . . . 200
8.5.6 2:¦\- . . . . . . . . . . . . . . . . . . . . . . . . . 201
8.5.7 õ‡2:^‡ . . . . . . . . . . . . . . . . . . . . . . . 201
8.5.8 ý . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
8.5.9 Syncµ^u load/store ;ì“o . . . . . . . . . . . . 202
8.5.10 ‘x“o- . . . . . . . . . . . . . . . . . . . . . . . . . 204
8.5.11 synci: U-§S‰p„ +n . . . . . . . . . 205

vii
8¹ 8¹
8.5.12ÖM‡Mì . . . . . . . . . . . . . . . . . . . . . . . 205
8.6 -?è . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
8.6.1 -?èL¥ˆ‡ . . . . . . . . . . . . . . . . . . . . 206
8.6.2 -?èLA:5º . . . . . . . . . . . . . . . . . . . . 221
8.6.3 ?èÚ{ü¢y . . . . . . . . . . . . . . . . . . . . . . . 221
8.7 -UõU©a . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
8.7.1 ˜öŠ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
8.7.2 Mì/MìDx . . . . . . . . . . . . . . . . . . . . . . 222
8.7.3 ~ê\1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
8.7.4 Žâ/Ü6$Ž . . . . . . . . . . . . . . . . . . . . . . . . 223
8.7.5 ê¦{!Ø{Ú¦{ê . . . . . . . . . . . . . . . . . . . 224
8.7.6 ꦣ\¤\ . . . . . . . . . . . . . . . . . . . . . . . . 225
8.7.7 \1Ú; . . . . . . . . . . . . . . . . . . . . . . . . . . 226
8.7.8 a=!f§SN^Ú©| . . . . . . . . . . . . . . . . . . . 227
8.7.9 ä:Úg€ . . . . . . . . . . . . . . . . . . . . . . . . . . 228
8.7.10 CP0 õUµCPU ››- . . . . . . . . . . . . . . . . . . 229
8.7.11 2:- . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
8.7.12 ^reé“/e”A5k–¯ . . . . . . . . . . . . . 229

1 9 Ù Ö MIPS ®?Šó“è 231


9.1 ˜‡{ü~f . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
9.2 Š{V‡ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
9.2.1 ÙÛ!½.ÎÚI£Î . . . . . . . . . . . . . . . . . . . . 236
9.3 -˜„5K . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
9.3.1 OŽ-µn!!˜‡Mì . . . . . . . . . . . . . . . 237
9.3.2 ‘á=ê$Ž- . . . . . . . . . . . . . . . . . . . . . 237
9.3.3 'u 32/64 - . . . . . . . . . . . . . . . . . . . . . . 238
9.4 όª . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
9.4.1 ƒéu GP ό . . . . . . . . . . . . . . . . . . . . . . 240
9.5 8I©‡9Ù3;ìN”¥ÙÛ . . . . . . . . . . . . . . . . 241
9.5.1 )æÚÒ3S¢S§SÙÛ . . . . . . . . . . . . . 243

1 10 Ù • MIPS NX(£‡^‡ 245


10.1 MIPS A^§S. ^‡µ~„¯K˜AL . . . . . . . . . . . 245
10.2 —àµi!i!Ú S . . . . . . . . . . . . . . . . . . . . . . . . 246
10.2.1 'A!i!!iÚê . . . . . . . . . . . . . . . . . . . . 247
10.2.2 ^‡Ú—à¯K . . . . . . . . . . . . . . . . . . . . . . . 249
10.2.3 M‡Ú—à . . . . . . . . . . . . . . . . . . . . . . . . . . 251
10.2.4 MIPS CPU V—à^‡ . . . . . . . . . . . . . . . . . . 256

viii
8¹ 8¹
10.2.5Œ£‡5ڗàÃ'“è . . . . . . . . . . . . . . . . . 258
10.2.6 —àÚ 5êâ . . . . . . . . . . . . . . . . . . . . . . . 259
10.3 p„ Œ„5‘5¯K . . . . . . . . . . . . . . . . . . . . . 259
10.3.1 p„ +nÚ DMA êâ . . . . . . . . . . . . . . . . . 261
10.3.2 p„ +nڕS\-µg?U“è . . . . . . . 262
10.3.3 p„ +nښp„ ½ßêâ . . . . . . . . . 263
10.3.4 p„ ­Kڐ¡XÚ . . . . . . . . . . . . . . . . . . 263
10.4 –¯SgSSü9N . . . . . . . . . . . . . . . . . . . . . 264
10.4.1 –gSÚ Àì . . . . . . . . . . . . . . . . . . . . . 265
10.4.2 ¢y wbflush . . . . . . . . . . . . . . . . . . . . . . . . . 266
10.5 ^ C Šómu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
10.5.1 ^ GNU C ?ÈìK®?“è . . . . . . . . . . . . . . . 267
10.5.2 ;ìN I/O MìÚ“volatile” . . . . . . . . . . . . 268
10.5.3 ^ C Šómu MIPS A^žÙ§,Ô,l¯K . . . . 270

1 11 Ù MIPS ^‡IO (ABI) 272


11.1 êâL«Úéà . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
11.1.1 Äêâa.°Ý . . . . . . . . . . . . . . . . . . . . . 273
11.1.2 “long”ڍa.°Ý . . . . . . . . . . . . . . . . . . . 274
11.1.3 éà‡¦ . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
11.1.4 Äa.3S¥ÙÛÚ9ّ—àCz . . . . . . . 274
11.1.5 (NÚê|a.SÙÛÚéà . . . . . . . . . . . . 274
11.1.6 (N¥  . . . . . . . . . . . . . . . . . . . . . . . 276
11.1.7 C ¥šéàêâ . . . . . . . . . . . . . . . . . . . . . . 278
11.2 MIPS ABI ëêD4ÚæÒ½ . . . . . . . . . . . . . . . . . 279
11.2.1 æÒ!f§SóÚëêD4 . . . . . . . . . . . . . . . . 279
11.2.2 o32 ¥æÒëê( . . . . . . . . . . . . . . . . . . . . 280
11.2.3 ^MìD4ëê . . . . . . . . . . . . . . . . . . . . . . 280
11.2.4 C Šó¥¼ê¥~f . . . . . . . . . . . . . . . . . . . . 281
11.2.5 ˜‡‡~~fµD4(N . . . . . . . . . . . . . . . . 282
11.2.6 D4ؽêþëê . . . . . . . . . . . . . . . . . . . . . 283
11.2.7 l¼êˆ£˜‡Š . . . . . . . . . . . . . . . . . . . . . . 284
11.2.8 Mì^{IOüzµSGI  n32 Ú n64 . . . . . . . . 285
11.2.9 ÒÙÛ!Òv±9éNÁì|± . . . . . . . . . . . . 287
11.2.10 ‡êؽëêÚ stdargs . . . . . . . . . . . . . . . . 294

1 12 Ù MIPS NÁ——NÁÚ¿Û 296


12.1 “EJTAG”¡þNÁü . . . . . . . . . . . . . . . . . . . . . . . 298
12.1.1 EJTAG {¤ . . . . . . . . . . . . . . . . . . . . . . . . 299

ix
8¹ 8¹
N›› CPU . . . . . . . . . . . . . . . . . . . . . . . . 300
12.1.2
12.1.3 ÏL EJTAG NÁÏ& . . . . . . . . . . . . . . . . . . . 300
12.1.4 NÁª . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
12.1.5 üÚ$1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
12.1.6 dmseg ;ìÈ諍 . . . . . . . . . . . . . . . . . . . . 302
12.1.7 EJTAG  CP0 Mì§cÙ´ Debug . . . . . . . . . . . 304
12.1.8 DCR £NÁ››¤;ìNMì . . . . . . . . . . . . 306
12.1.9 EJTAG ä:M‡ . . . . . . . . . . . . . . . . . . . . . 307
12.1.10 n)ä:^‡ . . . . . . . . . . . . . . . . . . . . . . . . 309
12.1.11 š°(NÁä: . . . . . . . . . . . . . . . . . . . . . . 310
12.1.12 EJTAG  PC  . . . . . . . . . . . . . . . . . . . . . 310
12.1.13 Ã&ì¦^ EJTAG . . . . . . . . . . . . . . . . . . . 311
12.2 “EJTAG”ƒcNÁ|±——ä:-Ú CP0 * : . . . . . . 312
12.3 PDtrace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
12.45UOêì . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
1 13 Ù UþKe‡~~——GNU/Linux 316
13.1 ÄVg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
13.2 SØ© ( . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
13.2.1 É~ª¥ MIPS CPU . . . . . . . . . . . . . . . . . . 320
13.2.2 '4Ü©½Ü¥ä MIPS CPU . . . . . . . . . . . . . 321
13.2.3 ¥ä‚¸ . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
13.2.4 3‚§‚¸¥‰1SØ . . . . . . . . . . . . . . . . . . . . 322

1 14 Ù ^M‡NÓóŠ 323
14.1 ¥ä?nL§Úžm . . . . . . . . . . . . . . . . . . . . . . . . 323
14.1.1 p5U¥ä?nÚ Linux . . . . . . . . . . . . . . . . . . . 325
14.2 ‚§!.«Úf5 . . . . . . . . . . . . . . . . . . . . . . . . 326
14.2.1 MIPS NX(ÚföŠ . . . . . . . . . . . . . . . . . 327
14.2.2 Linux £^£ . . . . . . . . . . . . . . . . . . . . . . . . . 328
14.3 XÚN^žu)Ÿo . . . . . . . . . . . . . . . . . . . . . . . . . 329
14.4 MIPS/Linux XÚ/Œ=† . . . . . . . . . . . . . . . . . . . . 330
14.4.1 Ÿo‡‰;ì/Œ=† . . . . . . . . . . . . . . . . . 332
14.4.2 Ä?§ÙÛÚo . . . . . . . . . . . . . . . . . . . . 334
14.4.3 ?§/Œý¢;ìN . . . . . . . . . . . . . . . . 335
14.4.4 ©N . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
14.4.5 ·‚ýŽ‡Ÿo . . . . . . . . . . . . . . . . . . . . . . 336
14.4.6 MIPS Oå . . . . . . . . . . . . . . . . . . . . . . . 338
14.4.7 ‹l?U£[“Dirty” ¤ . . . . . . . . . . . . . 341

x
8¹ 8¹
14.4.8SØé TLB ­WÉ~ÑÖL§ . . . . . . . . . . . . . . 342
14.4.9 TLB ‘o±95¿¯‘ . . . . . . . . . . . . . . . . . . 345
14.4.10 ;ì/Œ=†Ú 64  . . . . . . . . . . . . . . . . 346

1 15 Ù Linux SØ¥'u MIPS ;€¯K 347


15.1 †+np„  . . . . . . . . . . . . . . . . . . . . . . . . . . 347
15.1.1 DMA  . . . . . . . . . . . . . . . . . . . . . . . . 347
15.1.2 Ä)¤‘ ‡‰1- . . . . . . . . . . . . . . . . . 349
15.1.3 p„ /;ìN¯K . . . . . . . . . . . . . . . . . . 349
15.1.4 p„ ­K . . . . . . . . . . . . . . . . . . . . . . . . . 350
15.2 CP0 6Y‚‘x . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
15.3 õ?nìXÚÚp„ ˜—5 . . . . . . . . . . . . . . . . . . . 351
15.4 ' ~§ÃóN` . . . . . . . . . . . . . . . . . . . . . . . . . 354

1 16 Ù Linux A^§S“è!PIC!¥ 356


16.1 óüN¤˜‡§S . . . . . . . . . . . . . . . . . . . . . 358
16.2 Û £þL£GOT¤|„ . . . . . . . . . . . . . . . . . . . . 359

N¹ A MIPS õ‚§ 361


A.1 Ÿo´õ‚§º . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
A.1.1 Ӟ$1ü‡‚§I‡= ] º . . . . . . . . . . . . . 362
A.2 Ÿo‡^ MTº . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
A.3 MIPS N¢yõ‚§º . . . . . . . . . . . . . . . . . . . . . . . 363
A.3.1 MT #O CP0 Mì . . . . . . . . . . . . . . . . . . . 364
A.3.2 É~Ú¥ä . . . . . . . . . . . . . . . . . . . . . . . . . . 365
A.3.3 MIPS MT Ú¥ä . . . . . . . . . . . . . . . . . . . . . . . 365
A.3.4 ‚§`k?J« . . . . . . . . . . . . . . . . . . . . . . . 366
A.3.5 ^rÄ‚§Mï——fork - . . . . . . . . . . . 366
A.4 MT 3¢S¥A^ . . . . . . . . . . . . . . . . . . . . . . . . . 366
A.4.1 SMP Linux . . . . . . . . . . . . . . . . . . . . . . . . . . 367
^ MT ¢yp„A§SO . . . . . . . . . . . . . . 367
A.4.2

N¹ B MIPS -8Ù§ŒÀ*Ð 369


B.1 MIPS16 Ú MIPS16e ASE . . . . . . . . . . . . . . . . . . . . . . 369
B.1.1 MIPS16 ASE ¥AÏ?肪ڍ- . . . . . . . . . . . 370
B.1.2 é MIPS16 ASE µd . . . . . . . . . . . . . . . . . . . 370
B.2 MIPS DSP ASE . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
B.3 MDMX ASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372

MIPS âŠL 374

xi
8¹ 8¹
ë] 419

ÈöÖ¢ 422

xii
S
MIPS NX()u 1980 c“@ϧÐ5gu John Hennessy Ú¦
Æ)3 Stanford ŒÆ¤‰óŠ"¦‚3&¢ RISC (Reduced Intruction Set
Computing) NX(Vg§TnØ`ƒé{ü-!(Ü`D?ÈìÚ
¦^6Y‚‰1-M‡§Œ±3¡Èþ‰Ñ¯?nì"ù‡V
g´Xd¤õ§±–u3 1984 c;€¤á MIPS Computer Systems úi
±¢y MIPS NX(û’z"
3d  14 cm§MIPS NX(÷XA^ØÓ´uÐüz§Ù¢yš
~¤õ/$^uóŠÕÚÑÖìXÚ"3ùÏm§TNX(9Ù¢y²LO
r |± 64 όÚ$Ž§Óž|± Unix E,¢y SoöŠ
XÚ§±9p5U2:$Ž"´3ӘžÏ§MIPS Computer System 
Silicon Graphics  §ù MIPS ?nì¤ Silicon Graphics OŽÅXÚ
IO" 64 ?nì!p5U2:$Ž!\þl Silicon Graphics U«DÚ§¦
 MIPS ?nì¤ Œ1þÈiZś›¤ÀJ)ûY"
1998 c§MIPS Technologies l Silicon Graphics ©lÑ5¤˜[Õá
úi§;5uéi\ª½|?nì£O"(J´NX(uÐ
Úx?˜Ú\¯§Ì‡´éuù‡½|AÏI¦µp5UOŽ!“èØ !
AÛã/?n!Sy!&Ò?nÚõ‚§"NX(zguÐъ‘kƒ
A¢yTNX(?nìا¦Äu MIPS ?n줏 p5U!$õ
ÑA^IO"
8Ui\ªXچÉÃu MIPS 3óŠÕ!ÑÖìE,XÚ¥3e
¢§Ïi\ªXڏC5E, "˜‡;.i\ªXÚ
dõ‡?nü!˜‡p5U;ì±9˜‡½õ‡öŠXÚ¤"†Ù§
i\ªNX(ƒ'žÿ§MIPS NX(Jø ˜‡®²¢‚y²Œ±
3Ùþ¢yE,XÚÄ:§ Ù§NX(y3âm©ÆSE,
XÚ¤I‡ÀÜ"
3Nõ¡§5See MIPS Run 61˜‡´'u MIPS NX(9Ù¢y
mM51˜Ö"Ù§֏Qãaqá§5See MIPS Run 6;5
uŽ‡3 MIPS þ¡k?§§S ¤‡äNX(Ú^‡‚¸
£"
xiii
S
i\ªXÚ¥ØäO\E,Ý´ÏLé MIPS NX(Or5)ûù
aXÚI‡"éu?ۘ‡c3Äu MIPS i\ªXÚþóŠmu
ö§Ö1‡Ñ´˜7փŠ"Ö¥O\ Œþ#᧝) MIP32
Ú MIPS64 éNX(IOz!õ‚§#;^*Чéu261
Linux öŠXÚ3 MIPS NX(þ¢yŠ éÐ?n"Ø MIPS NX
(5‰ƒ §5See MIPS Run 61‡'u MIPS NX(cuÐ]
´#¶=¦) MIPS NX(5‰3S§TÖE,´¤k]¥äŒÖ
5"
·F"\‚U Ú·˜úÖÖQkdŠ!qk›"
Michael Uhler
Chief Technology Officer, MIPS Technologies, Inc
Mountain View, CA
May 2006

xiv

ùÖùã´ MIPS§3 1980 c“¥Ï@˜1 RISC CPU O¥Q
²º˜ž"8U§MIPS ,¿Ø´þp 32 NX(§%­Ø1
"Ù¤õƒ?§Ø^`§3uÙA^‰Œ"Œ7X MIPS CPU ï
ŒU´dŠ $35 {´d짏ŒU´dŠA›{ SGI ‡?O
ŽÅ£,‘X SGI »§ù ‡?OŽÅ´®²r ¦Þ¤"0u3ù
ü«4àƒm§k Sony Ú Nintendo iZÅ!Cisco Nõ´dì!>Àź
Ý!-1‹<Å"
ù c5§Ö1˜‡Ø=ñÑ C˜=©§ „€È¤ ¥
©"ù4·a¯U§·Ø5 >„kùoõ MIPS §S "
1‡Ö¶´5See MIPS Run ... Linux6"Ö1˜‡åã•ÖöÐ
« MIPS NX(˜ A5§ÏXJØUwù A5N3öŠXÚS
ØSåŠ^§§‚éÖöÒvk¿Â"´y3NõÖö®²é Linux NóŠ
k )§·ÒŒ±†Ú^Ù “è"­‡´§·Ú^ “èžÿ§%
pk a,Öö¬Ö “è§l¥éÑ.´No¢y"
¤±,ù´˜'u MIPS NX(Ö§´ nÙÎ=u Linux
SØÚA^?§Xڃm§Ù8´²ù %A5.ZŸo^"·F
" Linux ;[U ·é Linux [!ç´Jk‡Å¬ùã˜e3
˜‡ý¢M‡NX(þ$1˜‡ý¢öŠXÚ§NUN§†L"
MIPS ´˜« RISCµRISC ´‡k^ ¶c§·^u 1980 c“¢y
p6Y‚ u²˜|NX(ÓA5"CISC ù‡cÒk ¹ "·
ùp3dÂþ¦^ù‡c§^53 x86 ÚÙ§ 1982 cƒcNX(¥uy
A5§OžÌ‡Ä´^‡“è¢y"
k ÖöŒU‡‡é µ¦3· NX(ÚäN¢yœv†"´¦+O
ŽÅNX(A´Ú§S ƒmk'Ÿo§SU($1ƧÙg
´˜«ó§O"OOŽÅNX(´ EÑÐ CPU"‘X¡O
5E,§ù‡.‚‘XØÓï3C"
Ö´‰§S §ùÒ´·‚ÀáIO——XJ§S ŒU¬„
½öa,§@ SNÒ¬Ñy3Ö¥"ùÒ¿›X·‚ج?ؖQ²
ò ü“ MIPS M‡Oó§“Û%Xڝƒa¯K"\öŠX
xv

ڌUùX ·‚ùpùãNõ[!¶kNõ`D§S @ C Šóv
C. §„kŒ£‡5Ð?§'uNX([!£Ã';‡"´k
žÿ\(I‡eM‡¥—— <a)5Òéu'A­.󊐪
´¿÷ÐÛ"
ù«½ (JÒ´§£ã˜‡^‡ó§“ŒUØÙGÀ
Ü——AO´k' CPU SÜóŠÅ›——žÿ§·‚–•uæ^˜«
šªª"´-§S >Lá§'X`Mì!-!±9ê
â3S¥;ª¯Kž§·‚K¬æ^{²‡;’âŠ"
·‚b½ÖöÙGÚS. C Šó"Ö¥Nõë]^ C §S¡ä5
{zéöŠQã§AO´3'u-8Ú®?Šó[!@AÙ"
֘ܩé>L®?ŠóÖöµMIPS NX({ÈÚAÏ5
lù˜:þw5²w"´XJ®?Šóé\5`XÓUÖ§@Ø^ú
%U´e5"
Ö8I´wŠ\éÏ^ MIPS CPU þ?§I‡ )˜ƒ£"
(ƒ`§ÖQãNX(žUì MIPS Technologies úi MIPS32 Ú
MIPS64 ½Â——äN/`§´ 2003 cuÙT5‰1‡"·‚{¡
“MIPS32/64”"´Ö¿Ø==´˜ëÃþµ‡3ÞM¥éNX(
3e<–§Ò¿›X7L¡n)"·F"ÖUÚå3¡ÀJ;’
Æ)£3ŒÆ)½öff\ÆŒÆ)¤ )˜«y“ CPU NX(
,"
XJ\‹ŽlÞ—UìÙ!gSÖÖ§Ï"loNÅÚLÞ[!§
@oÖج4\”""´\¬uy˜ k'{¤uж·‚1˜gù
,‡Vgž§Ï~'5Ù1˜‡‡"Hennessy Peterson ¡ù“l¯Ôu
Ð{¤¥?1ÆS (learning through evolution)§”,馂5`ÐÆS
{§é·5`´"
1˜Ù·‚l˜ {¤µùå§r MIPS ˜žž“µeħ?
ØÙu²ö%¥'5Eâ¯KÚgŽ", 31Ù§·‚÷X¦‚
g´{?Ø MIPS ÅìŠóA5"
 ÏÖöïᘇoNVg§·‚31nكcÑÑ ?n웛
[!"1nÙ0 Jw%4¢^?n웛XÚ§ MIPS CPU ‡Ï
L§5?np„ !É~9éÄ!±9S+n"þ¡n‡;K§©O¤
1 4  6 ÙSN"
MIPS NX(š~%©lÑ ?n2:ê-8Ü©"ù«©l#
N›E MIPS CPU ‘kˆ«ØÓ§Ý2:|±M‡§lŠvkÜ©¢
y˜†k?"·‚r2:õUüÕ©m§3 ¡1 7 Ù"
ù:Ž§z˜Ùф옇ÜngSÅÚ0 MIPS" ¡AÙU
C •§”˜‡ëÃþ§½öÄu~fÆS§"
1 8 Ù§·‚¡‡Åì-8¶Áã3O(Ӟq‡'IO
xvi

MIPS ëÃþ{‡õ——·‚^ 10 50 3O?s ˜zõ
SN" 1 9 Ù{‡0 XÛÖÚÖ®?Šó§ Øþ˜‡®?
1

Šó?§Ãþ"
1 10 Ù´@ ØØ3O CPU Ú MIPS CPU ƒm£‡^‡<Jø
k'£‡¯K˜AL§ÓžN‘ ˜ kÃïÆ"˜!ùã CPU!
^‡ÚXÚ¥—à—ˆ«¯K9)û{"
1 11 Ùé )¤Œ±3ØÓóäpöŠ^‡ 7L^‡½£M
ì^{!ëêD4¤Š ˜‡{‡o("1 12 Ù0 3 MIPS CPU þ
IOzNÁÚ¿ÛA5"
e5·‚þ´ww MIPS N$1 GNU/Linux"·‚31 13 Ùkù
) Linux SØÚOŽÅNX(ƒm'X¶, 1 14 Ú 15 Ù\, [!
äNww MIPS NX(´N÷v Linux SØI‡"1 16 Ù¯„0 ˜
e¦ GNU/Linux A^§SóŠå5Äóś"
N¹ A ùã MIPS MT(multithreading õ‚§) *ЧùŒU´Nõc
5éNX(­‡*Ð"N¹ B £ã ­‡N\Ü©µMIPS16!#
MIPS DSP *б9 MDMX"
3Ö(—§\„Œ±w˜‡c®L——´‡éØÙG½ö;’
^cÚ Ð/——„k˜‡ëÖ!Ø©±9ø?˜ÚÖþë
]L"
º‚Úہ
zÖчN ŠögŽ§¤±·‚Ð!˜eÖg´"
Ϗ\‚¥k ´Æ)§·Q²Ž‡Ø‡«© MIPS ^{ژ„^
{"· û½Øù‰"·F"U ké5§ØšØ^“dÒUí2˜„
œ/"·Áã¦þäN ؇Ė"·¿Ø'%–“TLB”ùâŠ3
Œ‰ŒS´Ÿo¿g§·¬)º3 MIPS ‚¸¥“LŸo"<a´éõuo
(í2§ù‰Ø¬k›u\‚ÆS"
gl 1986 c¢G·m©l¯ MIPS CPU ¡óŠ±5®²k 20 c "
Ö¥k á‡Jˆ 1988 c§ž·fm©?1 MIPS NX(Ô
‘§" 1993 c§·rù áÂ8nå5§›Š¤˜é IDT  R3051 X
 CPU ^‡Ãþ"d „Ö¿ ƒõ á5⤠Ö1˜
‡§u 1999 cч"
gl 1999 c±5u) Nõ¯‡"y3 MIPS 3 SGI ÑÖì¥)·
®²r Þ§3i\ªXÚ¥àј^É´§¿ sÓ ­‡˜Rƒ
13)¤ù Lžÿ§·s¤ ƒŒ°åc[uL§L¥ýŒõêSN´é"´X
J\Xڇ^§§˜½‡uù &E"˜‡ƒŒ‚éÐ&E5 Œ±l GNU ó
ä1Ú “è¥é——´·ë ùp§¤±Ø´Õá"

xvii

/"Linux ¤ i\ª MIPS ^õöŠXÚ§´3i\ª½|E,¥
yõzÛ¡"MIPS 5‰Œ7X MIPS32 Ú MIPS64 £‡±§ŠÄ
O¤?1 ­#|„"Ö1‡®² nc "
MIPS ¯„3UY¶‡Ø,§֐U‰{¤Æ[§Morgan Kauf-
mann Ø¬Ñ‡ÖkŒ, "– 2005 c.„™uÙ MIPS ?
ЧéuÖù˜‡5`Ϗ¢3 ™U9"
ü‡½
Ö¦^iN½Xeµ
• ù«iNL«©"

• ù«iNL«>9©"

• ù«iNL«®?“èÚ MIPS Mì¶i"

• ù«iNL« C Šó“èڛ8?›ê"

• ù«iNL«M‡&Ò¶i"

—
ÖÌK˜†‹‘X·OŽ)ã"Mike Cole 4·éOŽ) ,
§·˜†3•¦E|]ÀÑÐgŽ"3 WhiteChapel Workstations
@ãá6 q¿÷-œFfp§NõÓ¯‰·OŽÅNX(ÚM
‡O£——·õ‡á Bob Newman Ú Rick Filipkiewicz "·
‡a WhiteChapel È Dave Gravell, ´¦4·Ð> MIPS"
é·3 Algorithmics Ltd Ó¯£Chris Dearman!Rick Filipkiewicz!Gerald
Onion!Nigel Stephens!Chris Shaw¤Øؗ±Va§˜´·3Ú¦
‚Ãêg&?!Ø!O¥¤Æ˜ƒÀܧ´¦‚éŠÖÓ
·TÚ¦‚3˜åžm¤‰†n)"
õa‡‰ϱ5ÖֈÙ!"v<µIntegrated Device
Technology  Phil Bourekas!LSI Logic Corporation  Thomas Daniel; Silicon
Graphics  Mike Murphy!Carnegie Mellon University  David Nagle"
'u1‡‡˜ `²µÏÑ3 MIPS úi±ŒóŠ§·@£ Paul
Cobb éÈ "Paul z Nõá# MIPS CPU {¤n㧄k?
§˜Ù§¿ n ë©zÚ^"3¤kœ¹e§ Ñ´d·?1?6
——¤±?ۆØÑATáu·"
3Où˜‡L§¥§·Ò u MIPS úi"·]ј Ó¯L«
a vkJ9Ù¦Ó¯´‡ˆx¯œ§´Ø+N·„´û½‡ù‰"
xviii

Ralf Baechle 3$Š www.linux-mips.org Õ:§N MIPS Ú Linux SØ
þóŠ"¦éu‹ž·é Linux ˜ †Ø@£Ï錵·˜m©@
Linux ÚOöŠXÚ Øõ...£Robert Love 5Linux Kernel Development 6
˜ÖékÏ¶·•?ێõ )SØ<9œíÖ¤"a MIPS ú
iÚ·ˆ?²nÚ+§¦‚#N·(¹SüóŠžm§„‡aéõ3
MIPS úiÓ¯£õ Ã{˜˜Þ6¶¤ÖÚµd Öúv"
Todd Bezenek ´·[Ó¯§´ù˜‡"v<"3 MIPS úiƒ
„k˜ "v<Ñuéù‡+OÐÚ," ֵ̇ z
ök Steven Hill (Reality Diluted, Inc)!Jun Sun(DoCoMo USA Labs)!Eric
DeVolder Ú Spphie Wilson"
Denise Penrose ´ƒÃ#Z?6"3 Finsbury Park £·[¤3
Ôí¤U `¦‚‡œ San Francisco Úчû?@ê<Øõ"
 „‡`­‡˜:Ò´§a Carol O’Brien§3·­Ö¥m
ؘƒ/g‰ ·"

xix
11Ù MIPS Ú RISC NX(
MIPS ´¢S¦^ RISC NX(¥°|˜«¶=¦ë¿éÏ
ù@§ùŒ±l MIPS éu 5NX('X DEC  Alpha Ú¨Ê
Precision )rKwÑ5"3˜‡¿÷¿½|þ§==‚°|
O¿ØUyØP§´ MIPS ‡?nì%~~UÏL±O
{z3z˜“?nìEâuХѩ5UZ1"
ƒé{üOéu MIPS OŽÅXÚúi5`5`Ñu˜«û’I‡§
Túi´ 1985 cl˜‡Æâïđ8¥©lÑ5;€l¯›EڝÈ¡"
(JTNX(3ž£y3ŒU,¤ ó’.Œ‰ŒSkKå›
Eû‚2|±"l);^8¤>´Ø%(ASIC Cores)‚[(MIPS Tech-
nologies§Philips)§)$¤ CPU ‚[(IDT!AMD/Alchemy)§˜
2¦^ 64 i\ª?nì)‚[(PMC-Sierra!Toshiba!Broadcom)Ñ
k"
3$ৡþXÚ SOC  MIPS CPU <SúAJ±w˜§ 3p
à§Instrinsity 5Uѯ?n쌱$1u 2 GHz ̪——ù‡„ݧ3Ø
ØOõÑ/u9“ PC ?nìƒ +¥§Œ±`´Ã†Ô'"
ARM ‡' MIPS ÑºÞ§´ MIPS Èþ е2004 ck˜·
¡ MIPS CPU ݘ ½|^ui\ª+"
MIPS CPU ´ RISC ( CPU ˜«, §)u˜‡ÆâïÄuÐaJ\
\žÏ"RISC(Reduced Instruction Set Computer ——°{-8OŽÅ)´
˜‡LkáÚå §†éõù ˜§i¡ ŒUõ/ùX
Ø´« ÙSº"´ RISC Š˜‡{'Ï^¶¡§3ž@
3 1986  1989 cƒmݘ½|#. CPU NX((¢å ˜½Š^"ù
NXÅ`É5UÑ uêccA‡äkmM5ïđ8¤JÑg
Ž"k<Q`µ“RISC Ò´?¿½Âu 1984 c± OŽÅNX(”¶ùé{
¿´3‹Àó’.éù‡VgE^§´lEâÝ5w§§(¢‡N
ù˜‡y¢——vk?ۘ± 1984 c± ½ÂOŽÅU À RISC mM
ö‚óŠ"
ù äkmM5‘8Ù¥˜‡Ò´d"4ŒÆ MIPS ‘8"T‘
8·¶ MIPS (Microcomputer without Interlocked Pipeline Stage ——Ãp
1
1.1. 6Y‚ 1 1 Ù MIPS Ú RISC NX(
£6Yã‡.OŽÅ—— )§ÓžÚ“million instructions per second
——z¦z^-ê” ˜ŠV'"d"4ïÄ|óŠL²,6Y
‚®²´˜«¯¤±E⧴±cNX(é§|^Ø §Ù¢
6Y‚Eâ5Œ±|^¿©§cÙ´Ú 1980 cŒNOEâƒ
(ܞ"
1.1 6Y‚
lc3=‚=ܘ‡ p§k˜[¶ Evie <mñ¿~Ú¿
Ú¡A"3Ap¡§z ïŽ‡ Ô£Ï~´¿û~§¿Ú¡§ Î
µ§ ژ ¤I‡küè§, XfC÷ ‹e5?ê"
1

Evie Ap¿Ú¡´ ¥Ð§3z‡8½F§üèïÌêèÎÑ


¬˜†üA "¤± 97ãA'€žÿ§Evie Òr§u e5¿\
˜S«"´E,ØUNBe¤k" ¡üXè΄´Úlc
@o§a² جÑvkžm‹ø "
¦‚v/2\ÑÖ@ ¶Evie ¿û~ÚËA¿Ú¡Ó÷ ˜m"
´ 5¦‚ŽÑ ˜‡h²{"¦‚r@\§Evie!Bert!Dionysuss
Ú Mary Õ¤˜ü"?5žÿ§Evie k4þ˜‡f¿þ¿û~§,
Bert ‰\þ¿Ú¡§Dionysus 2‰þ˜ 姁 Mary ¿Âa"
‚üè•c£Ä¶˜‡ εӞ§ ¡˜‡®² ¿Ú
¡§2 ¡˜‡ff~"ê¡£جد ε——@vkŸo§
¦‚Ø^l Dionysus @pÀܧl¦@p˜‡ff‡"
ù˜5èÎCá "Øȱ §¦‚qïe ,˜> 9AÁ§O\
õê "
ùÒ´6Y‚"ò@ ­E5óŠU^S©¤A‡Ú½§ÜnSü¦
óŠgÏLz‡ó<§z‡ó<I‡g¤gC@Ü©óŠÒŒ± "
,ü‡–ÑÖožmO\ §´%ko‡UӞÑÖ§ù
38½FÌêžãpU –oêO\ n"ã 1.1 `² Evie
{§´¨f Einstein 3k˜gL¯šJ[y¢žÿx " 2

XJò§Sw¤´S¥;˜æ-{§O$1§Swå5Ú
üè–Ñ֐vŸoƒqƒ?"´XJl CPU Ý5w§œ¹ÒØ
˜ "CPU lS¥ј^-§?1Èè§éI‡öŠê§‰1ƒA
öŠ§ )(J——, 2g­EÓóŠ"–‰1§SÒ
´˜‡-觧‚˜g˜‡6L CPU"
duz^-‡‰ØÓóŠ§Ï 3 CPU SÜ®²kˆ«ØÓ;^
Ü6¬§¤±E˜‡6Y‚¿vk‰ CPU  O\õE,ݶ´4
1 š=ŠÖöØ7ÄÙ¥‡©¹Â"[Èö5] εÏ~‡Úcüö˜å¯"
2 få5‰·aú¨fЖ´3wOŽÅ‰ÆÖ"

2
1.1. 6Y‚ 1 1 Ù MIPS Ú RISC NX(

ã 1.1: Evie Ap6Y‚


C„$1 ®"
CPU
¦^6Y‚EâØ´ RISC ‡?nìM#"' /3u˜ƒlÞm
©­#O——l-8m©——±¦Jp6Y‚Ç "@o§NâU¦ 3

6Y‚ÇJpQº¢Sþ´ù«¯{ŒU҆ "(¯{AT´§Ÿ
o¦6Y‚Ç$e º
1.1.1 Ÿo¦6Y‚Ç$e º
36Y‚¥˜‡ã'Ù§ãÓ^žmL¿Ø´ŸoЯ"Evie 
A|„6u Mary ˜Ã!˜Ã‰<éaUå——XJ Mary 'O<
ú§‡èÒúe5¨"
36Y‚¥§‡¦þ(z‡ãs¤Œ—ƒÓžm">´O²~¬
-‡3Ü6E,5ڄ݃m?1ïŬ¶OöŒ±r?Ö©‰
ØÓã¶c[Oˆ‡ã¦6Y‚±²ï"
¯K(J/Ø3uĊkõoE,§ 3uk J"£þ
¡A¥~f§du Cyril ÃÞ²~"a§¤± Evie ‡ Mary :¦a§
âU‰¦¿û~" Cyril ü Evie @pž§¦Ò‡Êe5–§˜†
Mary ÑÖc¡n , r¦˜æÎk:C/M1:˜Ù"ù
Cyril ÒѯK §Ï¦‡^c¡3Ó^] £I‡ Mary :
a¤§Ò´`u) ] Àâ"
Daphne Ú Lola o´˜å5¿ ©¦‚ Ô"XJ Daphne Øï
{§Lola Òجï¿Ú¡£ovkÕ¯Øe¤"Lola ò¬3ü Bert @pž
7vØc§˜† Daphne ü Mary @p§ù6Y‚Ñy ˜‡˜Y"ù
3ù‡¿Âþ1˜‡ RISC ŒU´ Seymour Cray u 1970 c“O CDC6600§žù
«gŽ„Ø61"ù®²k:lKOŽÅNX({¤þ §éda,ÖöŒ±ë
Hennessy & Patterson 1996 "

3
1.2. MIPS Ê?6Y‚ 1 1 Ù MIPS Ú RISC NX(
Ò´6(ƒA˜Y¡6Y‚˜ ——pipeline bubble)"
¿š¤k6Ñk¯K"Frank o´Ú Fred ï˜ Ô§¦
‡‹3 Fred ¡Ò1——XJ Fred ï ¿Ú¡§@ Frank ‡¿Ú¡"
‡´U üØ憐§ÒŒ±p6Y‚"ùé Evie 5`
Ø´˜‡Œ1‰{§Ï¨I‡3ù‡d//ÚÚ<‚¤|¤ þ*
)"Intel úi¡Ó¯K§§?nìáÚå6u^rU UY$1
¤k@ P^‡"´XJ´#Œ±lÞm©½Â-8 CPU§\Ҍ
±üØNõù憯œ"3 1.2 !§·‚¬w MIPS ´N‰"y3·
‚k£˜„OŽÅM‡þ5?ؘep„ "
1.1.2 6Y‚Úp„ 
·‚c¡J§p6Y‚öŠ‡¦z‡ãÓ^ƒÓžm"´˜
‡ 2006 c CPU OŽü‡ 64 ê\{„Ý'§lSÖêâ„݇
¯ 50  100 "
¤±k6Y‚„6u,˜«U òŒõêS–¯„ÝJp 50 
Eâ——¦^p„ £~{¡ ¤"p„ ´˜«Œ±p„N
þÛÜ;ì§Ù¥XSêâ€"z˜êâüÑ Ù3S
¥/Œ£=p„ I\¤" CPU I‡êâžÿÄkép„ §X
JéŒ^êâҌ±¯„x£"ϏÃ{ßÿ CPU e˜ÚI‡Ÿoê
â§p„ ´ CPU C^Lêâ¶kõêâlSˆž§
¥˜ êâI‡¿ï±BCјm"
=¦˜‡{üp„ U3 90% ±þžmJø CPU ¤‡^Iê
⧤±6Y‚O==I‡3Ñv l ¥êâžmÒ1 ¶ ™
·¥u)Ŭƒé§(¢u)ž§·‚Œ±4 CPU Êe–˜¬£h
² CPU U |^ùãžm„¿/é k^óŠ5‰¤"
MIPS NX(O ©l-Úêâp„ §¤±§Œ±3-
ӞÖêâ"
CISC NX(kp„ §´p„ ~~´Š;ìXÚ˜‡
A5 5\þ"RISC NX(·Üurp„ wŠ CPU ˜Ü©§
¿Ú6Y‚;—ƒ'"
1.2 MIPS Ê?6Y‚
MIPSNX(´6Y‚ O§ã 1.2 Cu@Ï MIPS CPU
ÚNõ;. MIPS 6Y‚"‡ CPU lp„ ¥$1§z^ MIPS -
‰1L§Ò©Ê?§z˜?¡˜‡6Y‚ã§z‡ãÓ^½žm"
ù‡½žmÏ~Ò´˜‡?n잨±Ï£k öŠ^Œ‡ž¨±Ï§
¤± MIPS Ê?6Y‚^ o‡ž¨±Ï¤"
4
1.2. MIPS Ê?6Y‚ 1 1 Ù MIPS Ú RISC NX(

ã 1.2: MIPSÊ?6Y‚
¤k-ѲL§=¦36Y‚,˜?vk?ÛöŠ‡„
ÌÓ6Y‚S"ª(JÒ´§‡±p„ ·¥§ CPU ÒU3
z‡ž¨±Ï¤˜^-"
·‚éìã 1.2§?ؘez‡6Yãu)¯œ"
• IF (insturction fetch)§l-p„ £I-cache ¤¼e˜^-

• RD ÖMì(read register)§ÖT- M썍½ CPU M


ìSN"
• ALU ŽâÜ6ü(arithmetic/logic unit) 3˜‡ž¨±ÏS¤Žâ½
öÜ6öŠ£2:$ŽÚê¦ØÃ{3˜‡ž¨±ÏS¤§éÙ?n
k¤ØÓ§ ¡¬ùù˜:¤"
• MEM –¯S£memory¤Tã-Œ±Öêâp„ £D-cache¤
¥SCþ"²þ ó§zo^-¥Òkn^-3Tãvk?Û
öŠ§´z^-Ñ© ù˜ã±(جÑyü^-ӞI
‡–¯êâp„ œ/£ùÐ'þ¡~f¥ Dionysus ‹ ε¤"
• WB £Mì£write back¤§òöŠ(JŠMìæ¥"

\N„LOwþÑkØÓ MIPS 6Y‚ã"S.þxžÿ


B§rz‡6Y‚ãxwþДÑTÐ^ ˜‡ž¨±Ï" 5˜
MIPS CPU 6Y‚½ök”‡Uħ´ù«o‡ž¨±ÏÊ?
6Y‚´ MIPS NX(Ð¤^§ 3˜ {ü MIPS CPU ¥y3
,^´†dš~ƒq6Y‚"
î‚6Y‚‡¦› -, öŠ"Äk§§‡¦¤k-‡˜
£И‡Åìi 32 ¤§ùžmҌ±´~ê"ùÒØ|±
5
1.3. RISC Ú CISC 1 1 Ù MIPS Ú RISC NX(
E,-¶~X-¥vkv  ^5?èLE,όª" 
½Ý-†—˜‡¯K¶3– x86 ùNX(þ;.§S¥§²
þ-ݏn‡i!õ˜:"MIPS “è‡Ó^õ;˜m"
Ùg§6Y‚OüØ ¢yöŠSCþ-"†6Y‚1o‡
ãâlS½p„ Öêâ§ùé ALU 5`¢3 "S–¯==
^˜‡{ü load Ú store -3SÚMìmDxê⣠¡òwù
¡ƒ load/store NX(¤"
1987 cݘ½| RISC CPU óŠéЧ´Ï3ù ›eO
-8y²˜:ÑØ'@ E,-8 £AO´éu?ÈÑ“褧
ö‰M‡‘5õÛ£"1987 c9Ù  RISC k ÓA§Ò´Œ7
p6Y‚ O-8Úp„ ¦^"
MIPS ‘8|NX(;[ë† ž'uäŸoA CPU ·
Üp`z?Èì8Ig"Ù¥éõI¦Ú6Y‚I¦´oN§¤
± MIPS CPU Ok 32 ‡Ï^MìÚnöŠêŽâ/Ü6-"3$´§
@ ‹Ï6Y‚E,;^-~~´?ÈìØ)"
RISC k°ö‚ä²É4 žm"#-8®²òM‡/^
‡©.‚• í? ˜Ú¶¡‡-i VLIW(very long instruction
word) ½öwª¿1-OŽ EPIC(explicitly parallel instruction computing)"
Ù¥wÍÒ´ Intel  IA64 NX(§¦+Ý]ãŒ%¿Ø¤õ¶w5¦
‚´á† M‡/^‡>."
1.3 RISC Ú CISC
·‚y3Œ±}Á˜e½Âùü‡®²õg^⊠"é·5
`§RISC ´˜‡^u/NÅìNX(/-8/Nc"3 1980 c“
¥Ï§§^u˜|ƒé#!ٍ-8‰ °|Úk5½±¦6
Y‚U ¤õÚp¢yNX("du SPARC!MIPS!PowerPC!HP
Precision!DEC Alpha, ARM(3ƒé§Ýþ) ²w3p݃qƒ?§
¦ RISC ¤˜‡ék^Vg"
†ù‡ƒk²(é5žÂ£ã/¤éì´§CSIC £Complex
Instruction Set Computing¤^5‘k@£ã@ vkUì'u6Y‚¢y
gŽONX("RISC NX(€·´Xd¤õ§±–u 1985 c
NX(vk=˜‡l Ä RISC K ¶Ï §CISC NX(74

,´@ )u 1985 cƒcNX("3Ö¥§\Œ±Ün@'


u CISC ÀÜQ·^u Intel x86 [x?n짏·^u Motorola  680x0 X
"
=¦´ Intel ¿÷ˆ«E,M#O IA64 äk RISC 6Y‚lÐA"´ Intel
4

^/Nc EPIC U‡N¦‚÷•8I±9­Œ”}ŒU5"

6
1.4. LÚy3˜ ­‡ MIPS ¡ 1 1 Ù MIPS Ú RISC NX(
Ø´^5-8 ´^uäN¢yžÿ§éùü‡âŠÑ´˜
«^"Œ±’½´ Intel ÏLA^ RISC k°‚¢yE|5Jp ÙÚ
RISC (ƒ é x86 [x?nì5U"´‡rù ¢y`¤´Pk
RISC ØK´˜«Ø)"

1.4 LÚy3˜ ­‡ MIPS ¡


y34·‚s:žmiA˜e3L 20 õc5 MIPS ?nì±9¦^§
XÚuÐ{§/üz{¤"·‚Œ—U쯇u)žm^SiA§÷å
ó7E–A?¶‘µ:"˜´þ·‚òw¦+ MIPS NX(˜m©
O´ÀX Unix óŠÕ•c?§l@± é ϕˆ«ˆA^
´——Ù¥Nõ3ÐAc´Š،Ž–"3e5AÙp§\ò¬é
e¡Jù ¶ikõ )"
¦+-8Ú7ŒNE⮲u)éõCz§´ 1985 c R2000 þ
^r?^‡3?Ûy“ MIPS CPU þÑU›©p$1 vk˜:¯K"
ùŒU´3¤kÌ6NX(¥• oN5‰Ð "
1.4.1 R2000  R3000 ?nì
MIPS ¤á˜[úi
MIPS OŽÅXÚkúi¤áu 1984 c§±Bòd"4 MIPS CPU ¢
yû’z¶·‚± Ò{¡ MIPS úi"d"4ŒÆ MIPS ´A‡±#
ª8¤ ¡O!?È`zÚOŽÅNX(˜N¿¤õ{I
Æ‘8ƒ˜"û’z MIPS CPU \þ S+nü§u 1985 c Œc±
R2000 Äg¡­"
=¦3 1980 c“¥Ï§ïá¡›E󂏛©[B¶ùw,‡Ñ ˜
‡#ïúiãå" MIPS úiÏL•yk®²Ý\ ã]ŒN
‚ûÇ›Eª4ÙOC¤¬"@ÏÇ)û)k IDT!LSI
Logic!Performance Semiconductor Ú NEC"
1987 c¥ÏÄg\\ õUrŒ¡ êÆ?nì£R2010 2:\„
ì¤"Ϗ MIPS úiŽ‡?\ó§óŠÕ+ù‡då㌽|§ûÐ2
:5U7،§R2010 9žJø ù˜:"
MIPS gCï ˜ ù ‚û›E¡§r§‚8¤gC.ÑÖì
ÚóŠÕ¥"ù ‚ûŒ±ŠâÇƕOrøA¡"
R3000 ?nì

Ägu 1988–1989 c¡­§Ùæ^ k?›Eó²Ú˜ ²Lc[


çÀM‡Or„–§ö(ÜEÒ 5UŒÌJ,"l?§Ý5w§
7
1.4. LÚy3˜ ­‡ MIPS ¡ 1 1 Ù MIPS Ú RISC NX(
AÚ R2000 vk O§ùÒ¿›X#O„ÝJ,Œ±ál¯„O
^‡þNyÑ5"Øȱ q\\ R3010 FPU ——†Ùþ˜‡‡‰ aq
U?"
 1990 c“¥Ï§˜ k1öm©3i\ªA^¥¦^ R3000, ˜m©ž
3p5U-1‹<ÅÚü‡¥¦^"
R2000/R3000 ¡Sk˜‡p„ ››ì——‡^p„ §‡\þ
SDRAM Ò1 "FPU 3£†ê CPU ¿1¤Ö-!DxöŠêÚ$Ž(
Jžp„ o‚"éu 1986 c CPU „ݧù©õU´#L!¢
^ڌ1¶­‡´§ù«‰{4z‡¡þ&Òëê±3žÏ^
µCEâ¤UˆÚ ꁛƒS"ù¦Œ±3Ün¤þ)
¡§¿Uæ^yk)|C¤XÚ"
Jpž¨ªÇ]Ô
¦+ù«O3ž´Ün§´ª¯K„´Ñ3 R3000! R3010
FPU Ú Üp„ õU©þ"
Äk Üp„ ¢ym— XÚO˜ JK" l Ü
 RAM ¥@ѦŒUp5U§Ù››&ÒÒ7L34à°(š~á
žm S¢yƒ†"¢y°(òžI?D4XÚO“þµ R3000 I
‡o‡d Ü)Ñ\ž¨&ÒØӃ£€§ù‡ƒ£½Âžmm
éu ››&Ò(+n´–'­‡"3 20 îâžÿù„Œ±é
G§´ž¨ªÇNp 30 îâ±þž§é°Ý‡¦Ò®²4„ §
¦ž¨+n?Ö4(J"
Ùg§JpXڞ¨Ø叉 RAM ‚û‘5 ¯Kµ †?nì6Y
‚¥Øä ឨ±Ïžm‹þÚx§¦‚Ø؎{3S¡
žm¡‰ÑƒAU?"
¤kù ¯K3 1980 c“"Ïžÿ5²w§Ù›¦ù˜“
OU‰kÌÝU?"l 1988 c 25 îâm©§R3000 XÚÐØN´3
1991 c∠40 îâ——Ò2v{Jp "

1.4.2 R6000 ?n쵘Ý=•


c“ ÏÑy ?nìOöƒm'uJp‡?n잨ªÇ
1980
Ø"AO´kü‡¯K2Ñ Y¡"1˜‡µ™5?nìOòp„ ˜3
Ü¢yÐQ§„´rp„ ‰¡þк1µ™5?nOÀJ=«
Ü6Eâk|º
1˜“ RISC CPU æ^´ CMOS ¡"§‚$1ûЧrNõÜ
6µCé˜m§ ¤k$¤£pre-RISC¤‡?nìÑæ^
CMOS" CMOS |±ö@3™5NõcS,Pkù«`³"Ø

8
1.4. LÚy3˜ ­‡ MIPS ¡ 1 1 Ù MIPS Ú RISC NX(
†§CMOS Ü6Ø´¯§´ù˜:Œ±ŽÑ——– Intel ùúi
’½é¯Ò¬?1ƒA7‡Ý]" ¦‚@ CMOS 3®²‰éÐ
¡„kJp˜m——3‰½7¡¡Èþ8¤õÜ6€!3‰½õÇ
e¢ypm'ªÇ"
,˜ Oöúé CPU 5`Jp„Ý´õo½ƒ§¦‚Ñ(Ø`p
à?nìÐæ^ ECL ¡§Ò–@ ®²3Œ.Åڇ?OŽÅ CPU æ
^@"{ü ECL Ü6€„ݍ¯§3¡ƒmux&Ò„ݍ´‡¯
õ"´§ü‡¡þ8¤Ü6€êþ§ $1žu9þŒ"
uùü«Eâˆg¡ØÓ¯K†]Ô§éJýÿ=˜‡ ò‘
Ñ"Bipolar Integrated Techonlogy(BIT)úi´ ECL |±ö"1988c§m©
¡ R6000  MIPS CPU óŠ"T‘8<%ÇǧBIT F"U– CMOS
RISC ‡?nìQ²UóŠÕ5U@§dgCU“‡?.Å”5U"
´¦‚- ¯K"Ϗ ECL —݁›§?nìOØØ©¤õ‡
¡"réu=• ECL ¡¡&ÒIO%¦Ä"BIT E
BiCMOS ·ÜN±Ï¦(Üù«EâÐ`:"
d §5õ¯Kö¨ T‘8"R6000 ‘8˜‡q˜‡¯Kö
ò§ªö R4000 ¡ƒ µR4000 ´1˜‡|^p8¤Ýrp„ £
¡þ#˜“ CMOS ¡§±,˜«å»Jp ž¨„Ý"
BiCMOS CPU ¿vk‘X BIT 4 kµAcƒ §˜‡¶ Expo-
nential Technology úi‰ Œÿ}Á§3 1996 cc ‰Ñ˜‡ PowerPC
 BiCMOS ¢y§Ùž¨ªÇ‡L 500 îâ§ù3ž-<8ƒw",
Ú BIT ˜§TúiϏEâÚÜӐ¡V­ òªr•4"
3Œ¡§VÑ‹k†Ø" §L Acžm§¡þp„ 
Eâ⤏ˆpž¨„Ý7،^‡"¨Êúij± CMOS Eâ
Ú£Œ¤ Üp„ §gCé– MIPS NX( Precision ‰mu"¨
ʁªòٞ¨ªÇJp 120 îâ†m——´¯ R3000 n——¿
vkæ^ ECL ½ö BiCMOS "¨ÊgC‰gCr§rù1?nì^gC
óŠÕþ"Túi@ù‡½|Ðd˜«â»5{§\þU «ÉpÚ
êµCEâ±9[—p„XÚ?O¤Eâ5íÄ"ù«üÑ3é
˜ãžmpr¨Êíþ ?nì5Uº¸¶I[Øo´áu-?C€"
1.4.3 1˜‡ CPU Ø
3 1980 c“@ϧLSI Logic @JÑ æ^1þ)¡OÚ\ó
Eâ4XÚúiU ÙgC¬I‡þ½‰¡gŽ"ù ¡¡
;^8¤>´——Application Specific Integrated Circuits£ASIC¤¶ 1990 c
c §ASIC Œ±¹õˆAZ‡Ü6€§ƒu˜‡Œ>´†þÙ÷ 1970
c“Ü6"ü¡¤é$§mu¤Œ±››"
·‚®²`L §LSI úié@Òé MIPS a,§ ›E ˜
9
1.4. LÚy3˜ ­‡ MIPS ¡ 1 1 Ù MIPS Ú RISC NX(
R2000/R3000¡"üc± §Túiég,=• ^¦‚gC ASIC E
â5¢y MIPS NX(¶ù˜=•‹m ϕF"3˜‡¡¥Óž)˜
‡ MIPS ?nìÚÙ§Ü6¬rŒ€"O MIPS Ç)û§'
X IDT§m©JøӞS˜˜‡ MIPS ?nìÚ8¤{ü ŒõU¬"
=B3 1990 c“Ðϧ\UéN´r˜‡ R3000 ?O CPU Ä
Ü6˜˜‡ ASIC þ¶ ASIC vkép RAM ¬§¤±8¤p„ 
´‡¯K"´ ASIC uÐ鯧 1993 c3˜‡¡þ¢y‡?nì
XÚ——Ø1´ CPU Úp„ §„kS››ì!››ì±9Ù§ˆ«
|±Ü6¬——Ž{®²Œ±¢y"
ASIC ’֝6urU 3ƒéážm——áu^/½›0¤
I‡žm——SòOÝ\)"¦+•rJøò‡XÚ8¤ü‡
¡þŽ{š~káÚå§ASIC ‚û„‡?nИ‡²ïµNQU3±
O±Ï3r±cÏ"‰ŒSӞ§q‡U·AÃ{£;OE,Ý
O\º
ASIC 1’‰Y´±Ø/ªJøk^õU܇——'X˜‡
MIPS ?nì"ØÒ´y¤µC ¤k7‡SÜOóŠÚyÜ6
¬§Ï~±˜| ASIC O^‡UÉ‚ª?›©‡ª¥y"™5
XÚOòÏLrA‡ ASIC Ø똇¡þ¶†ykXÚ——ë>´
†þ‡——ƒ'§¢yÄuØ ASIC ò¬!¯!B¨"
dc§ASIC Oögžég,Ž|ÜÜ6¬——GÅ!O
êì!)èì"‘XASIC ØÑy§Oö¿3°xÙþ^o
x)5£±§r?nì!S!S››ì±9¡So‚8¤˜å"
XJ\~¦¯œ¿Ø@o{ü§@`²\†ú´é"ùÀÜfå5é
áÚ<§¢S‰å5§Mïر9rØëå5Ñ´š~J¯œ"Ø+N
§ù @Ï ASIC ØE,äk­‡{¤¿Â¶¦‚†û) 53 2000
c“ÐÏÊ9¡þXÚ SoC O"·‚0 ‡ 1990 c“ MIPS uÐ
A^‚¢ƒ § ò£Þ2ù SoC ¯"
R4000 ?n쵘g€·

1991 c¡­ R4000 ?n짴˜‡ŒÿÚâ»5uÐ"Ù+k§mM


5A5)˜‡ 64 -8!žŒ¡þp„ £ü‡ 8 K¤§
3žpҖ´3‰Ž`¥âkž¨„Ý£uٞ 100 î⤧˜‡
¡S? ››ì§˜‡±XÚSܞ¨©ª$1Xڝ§¡Sg‘|
±;õ?nìXÚÜ6"R4000 ´Ä1æ^ Ãõ 1995 câ2¦
^NõE⡧‡5¿é­‡˜:´§¿™æ^E,‡Iþ‰1"
R4000 ¿š{§§´˜‡õUrŒ¡§ÙOéJÿÁ§AO´Ùæ
^|±õ?nìE,E|"† R3000 ƒ'§§I‡õž¨±Ï5‰
1‰½-S——ù ž¨±Ïá±—L@(姴\¿Ø¿›”
10
1.4. LÚy3˜ ­‡ MIPS ¡ 1 1 Ù MIPS Ú RISC NX(
5U" Iž¨„ݧ˜? ‰ ¡þµ ¦z‡¡¤±
Ün§˜? NþØرƒé"R4000 6Y‚§Ì‡´Žr
–¯©)õ‡ž¨±Ï¥"6Y‚—Çü$§Ï6Y‚
©|-‹Ïž›” õžm"
ACE é†åá

3 R4000 ¡­c §MIPS úiQpÝÏ"#OU Ï§3óŠÕ!


S¡XÚÚÑÖì½|I˜Rƒ/"
ùŒØ==´ MIPS úi˜„œŽ{"3 1990 c“ÐϧNõ*
[‚ýó RISC ?nìò¬lÙ CISC ¿éÃ@pØäÓ+õ½|¶
$–kŒÿýó[L« CISC [x?nìò3AcƒS”.ž”"
1991 c§Œ 20 ‡úi¤áŠ˜å¤á ˜‡¶p?OŽ‚¸
ACE£Application Computing Environment¤é†"T|„¤ ) DEC£
.Ť!Compaq£PC¤!‡^Ú SCO£žKI Unix System V¤"ACE 8I
´½Â5‰ÚIO±B4™5 Unix ½ Windows ^‡†$13?¿˜±æ
^ Intel x86 ½ MIPS CPUÅ.þ"=¦3 1991 c§PC ½|’֘ܩ
é MIPS CPU Ú MIPS Xڂû¿›XéŒ*È"
XJŠU ME¤õ{§@o ACE ½´Ù¥½½ö"´y3
£Þ5w§‡^ža,´´y²Ù# Windows NT XÚ´Œ£‡
£ùNh Intel úi˜a¤§ Ø´ýŽ‹»¦‚3 PC ½|éß
ä"éu MIPS§(J¿Ø@oЧ¡þØv±| úiJ|§ÙXڒ
Öm©ew"ØȯKCî­ëTúi™5UÄ)Ѥ ¯K"
SGI Â MIPS

?\ 1992 c §Q²F"UkÄu MIPS ?nìÎÜ ACE IO#X


ڌþÑy§®²y²´€ØŒ9¯" Ò3dž§DEC ——Š MIPS
KåŒóŠÕ^r——û½e˜“XÚò= æ^gC Alpha X
?nì"
ùÒ¦eóŠÕúi SGI§¤ æ^ MIPS ?n쁌^r"
1993 cЧ۳®²é²K§Ðd SGI ÑÃÍ MIPS úi§Ï§gC)
¿6u MIPS NX(§‡±dÞyTNX(™5جž" 1994
c.§SGI íÑ#.Ò R4400 CPU £\Œ p„ Ú²L 5U`z
R4000 ¤$1ž¨ˆ 200–250 MHz§4 SGI ­Ø RISC 5U+kö1"

1.4.4 QED: i\ªXÚp¯„ MIPS ?nì


˜ MIPS úi' O< lm Mï ˜‡#¶þfAO
QED£Quantum Effect Design¤úi"QED M©<§ë†Ll R2000 

11
1.4. LÚy3˜ ­‡ MIPS ¡ 1 1 Ù MIPS Ú RISC NX(
R4000  MIPS ?nìO"
k IDT ŠÙ›EûÚ@ÏÝ]ö§QED ìèm©M{ü¯
„ 64 MIPS ¢y"TOy´ŽMU 3ÜnÈdþJøûÐ5
U?n짱B3NõA^¥ÑU阇ávƒ?§)$àóŠÕ!.
ÑÖ짆–p?-1‹<ÅÚä´dìùi\ªXÚ"
k <jûÌÜr R4000 A^ui\ªXÚ§´{åéŒ"QED y`
R4600 éi\ªXÚOöáÚå‡' R4000 Œõ"R4600 é¯Ò
¤õ"§­#£{üÊ?6Y‚O¿3Ünd þJø Lk¿å
5U"3 Cisco ´dìÚ SGI  Indy S¡XÚ¥I ˜Rƒ/ §R4600
¤ , ˜‡1˜µ1˜‡²wJ| RISC CPU"
QED OìèUYU?¦‚óŠ§3 1990 c“¥ÏíÑ R4650 Ú
R4700"3ù R5000 ž§·‚£Þ2Ðm QED ¯"

1.4.5 R10000 ?nì9Ù Uö


3 1990 c“¥Ï§SGI épàóŠÕڇ?OŽÅš~­À"X{5U
¤ ˜‡­‡ñ:§Ù MIPS ܀‡¦3e˜“?nìO¥Aéù˜
]Ô"
SGI/MIPS R10000 u 1996 c@ÏuÙ"§´ MIPS lDÚ{ü6Y‚
­Œ l¶§´1˜‡ý|^ ÏS‰1Úõ-u CPU "3Acƒ
S§ÏS‰1Oî× ¤k CPU O§¤kýpày“ CPU Ñ´Ï
S‰1"´žyÚNÁ R10000 4Ý(J§¦ë†öÚ *öÑ@
 SGI æ^ù-?O´˜‡†Ø"
SGI óŠÕ’Ö3 1990 c“ ŒÏm©m©º›§ØŒ;šf Ù
é MIPS NX(UYÝ]Uå"Ð3ù˜žÿ§Ì6 PC ½|UY%Ç*
ܧ— Øä]7Â\6?5§† MIPS ¿NX(——Ê
8Ò´ Intel úiCX9Ù U¬§3˜½¿Âþ) IBM
Ú Motorola  PowerPC ——™5uÐJø ¿v]7"
3ù«Œµe§SGI m©ïu R10000 ƒ  MIPS CPU¶´du¡
ØäO\]7Øå§T‘83O|™U¤ƒcÒž "1998 c§SGI ú
m«ì3ٙ5óŠÕ¥òæ^ Intel  IA-64 NX(§ ˜‡S¡/Ñ
Öì¬ MIPS muìè)Ñ "2006 c£3·Š֞¤˜ SGI Åì
E,3^ R16000 CPU ¶T CPU ¦+|^ó²?ڈ pž¨ªÇ§
ÙSÜO† 1996 c R10000 ƒ'k4Or"Ӟ§IA-64 CPU 
þ$u Intel *O§­.þ¯ CPU Ñ´ x86 CN"SGI
3ÀJ CPU žÿ§ý´t[ "

12
1.4. LÚy3˜ ­‡ MIPS ¡ 1 1 Ù MIPS Ú RISC NX(
1.4.6 ž¤a>f¬+ MIPS ?nì
LSI Logic Ú Sony PlayStion
1993c§Sony Ú LSI Logic \mu^Š1˜“ PlayStation ¡"T
¡Äu LSI  CW33000 ?nìاž¨ªÇ 33 MHz ¿ 8¤ DRAM ›
›ìÚ DMA ڙA‡ ŒõU"PlayStaion pÝ8¤zOü$ )
¤§\þÙc¤™k CPU ?nUåEÒ éÐiZÅ"Sony 鯇L
@ Pý‚û§¤iZ››½|PŒ"
Nintendo64 Ú NEC  Vr4300 ?nì

Nintendo iZÅщ Sony Nõ½|°"Š‡Â§Nintendo éÜ


SGI û½aL 32 ‡?nì§3Èd== 199 {iZÅþ†æ^ 64
¡"
?u%9/ ¡——NEC Vr4300 ——Ò´˜‡à~LR4000§´
à~Øõ"~ ê8±ü$µC¤§T¡(¢k 32  Üo
‚§ 3êÚ2:$ŽmÜ6܇"´ƒéu 199 {Èd§õU
®²érŒ "
Vr4300 OŽUå!$d‚!$õÑ!>¦§3O?š~¤õ§AO
´3-1‹<Å+§ù MIPS NX(3/i\0ªA^¥qé ˜¬^
Ƀ/"
´ Vr4300 ¤  ˜‡ÀÂiZ½|Ï^?nì¶ 1990 c“ ϧ
ù‡½| CPU OC5;’z§;;/Ú;^M‡\„ì(Ü3
˜å±¢y 3D ±›!«nN±9Àª£˜" Sony ­ˆ PlayStation 2 ž
ÿ§®²æ^ ˜‡5U`É 64  MIPS CPU ŠØ%¡"T¡d
Toshiba ›E§Pk˜‡2:?nì§ÙóéþØÑu?ۘ± 1988 c‡
?OŽÅ"¯¢T¡Lu;’z ±–u3iZ½|ƒ ØUé?ÛA^"
Ә CPU ,˜‡‡^3 Sony  PSP ñiZþ§3™5AcSAT3
½|Œ±„"
ù iZÅ3­.\Oþ‡LAZ§Óâ MIPS CPU ?nì
þŒ˜¬§'Ù§?Û+ñÑ MIPS ?nìÑõ——'NõO
CPU NX(ñÑêþõ"

1.4.7 ä´dìÚ-1‹<Å+ MIPS


R5000 ?nì
R4600 9Ù U¬¤õƒ §QED e˜‡Ì‡OÒ´ R5000"u
1995 cíÑ——Óc SGI íÑ R10000 ——´˜‡‡Iþ¢y"´l
Ï~OngÚE,Ýþ5`§ùü‡OŒƒ»Ì"
13
1.4. LÚy3˜ ­‡ MIPS ¡ 1 1 Ù MIPS Ú RISC NX(
æ^ ²;Ê?6Y‚¿ U^Sux-"U Ӟux
R5000
˜^ê-ژ^2:-"MIPS NX(¦ù˜üÑ¢yƒé{ü¶ü
‡-ˆg^˜@Mìډ1ü§¤±£OVuxŬÜ6¿ØI‡õ
oE,"
, ¯œ,˜¡Ò´5UO\ƒék"ؚ R5000 ^3˜‡$1
Œþ2:$ŽXÚ§ÄK‡IþUåŠ^Ø"¦+Xd§R5000 8¤Ù
§U?¦XÚOöN´l R4600 ,?"
QED ¤˜‡vkó‚ŒN‚û

3٘m©ÞAc§QED Š˜‡X{ÑÈ£úi$1§•
ŒNúiu˜gC?nìOÇ4¦‚)ڝÈ¡" 1996 c§
Túiú±gC¶ÂÑÈ¡ŒU¬Ð ")E,d Ü܊ºŠ
?1——TúigCE,Ø)£=§¿Ø†Pk?ۘ[󂤗—´y
3 QED KI¡ÿÁ¿gC?n¤kÈ!½|±9Eâ|±"
3ùãžmc §QED éÄ ˜‡mu PowerPC ¢y‘8§æ^Ú
R4600 Ó{pº‚"Ø3´§Úd3¿•r’Ö\¡‘
(J§4¦‚À³ ÞM§(J—T¬˜†Ñvk?\½|"3ùg•
PowerPC {á?-9ƒ §QED ­#£5îÞu MIPS NX("

QED  RM5200 Ú RM7000 ?nì

QED 1˜‡/gk¬ý0 CPU ´ RM5200 X§R5000 † Y


¬"Pk 64 Üo‚¬3ä´dì¥óŠéЧ٠32 o‚$¤
µCé·Üu-1‹<Å"
QED 3 RM5200 ¤õÄ:þu 1998 cuÙ RM7000"ù±¬3
MIPS ¢yþe A‡­‡p§ µ´1˜‡Ú\£256K¤¡þ?
 "RM7000 „´˜‡ý ‚‡IþO§Ø l R5000 U«e5
5

ê/2:-|Ü §„U Ӟuxõéê-"


RM5200 Ú RM7000 3 1990 c“¥ Ϙ†ÈûЧñ Nõpà
i\ªA^¥§AO´3ä´dìÚ-1‹<Å¥ 2A^"QED ²
œ( RM7000 3?§ÚXÚOü¡ÑU¿©oN RM5200"ù¦Ï
L{ü/,? RM7000 ÒU4FL¥U RM5200 XÚ¥c“ ­#‹u
¹å§Nõruy÷Qù˜´‚馂k|"
SandCraft

1998 cc § Nintendo O Vr4300 ìè¤á ˜[úi SandCraft§


XÃ) QED  RM5200 Ú RM7000 [xÓâ½|pài\ª CPU "
åkF"^˜‡aq DRAM ;ì¦ RM7000 ? U‰é§(Ju
5 QED

y3ü‡¡þ‡o DRAM p„ÝÚp—Ý3ž´ØŒU¢y"y3„ØU"


14
1.4. LÚy3˜ ­‡ MIPS ¡ 1 1 Ù MIPS Ú RISC NX(
NX(O8Iép§é´s ˜ žmâ?\½|"¦+
SandCraft
Túi²LAcãåïá ˜‡v Œr+§´ª„´4 §Ù]
 Raza Technologies ¤ "y3„ؘ٠SandCraft 3eE⢴Ä
k˜Ü© U {Ý ­„UF"
1.4.8 8ž“ MIPS ?nì
Alchemy Semicondutorµ$õÑ MIPS ?nì
 1999 cž§£Ä>{!‡<ûÖÏÚêèƒÅ½|˜†3œ„O"
ùa?nì`k‡Ä´$õѵϏù |” §‡‚>³ø>§7
LO¤U34$õÇeóŠ"Ӟ§¿Ø処z˜“‡'Ùc“
JøõA5"›E‚û3Ϧ 32 OŽUå5÷vFÃOI¦"
ù σ(ܘ姉?nìOJÑ ˜‡Ä8Iµ3£‘X>³
zÆڛEEâ?Ú¤ úO‰½õǁ›e§lz˜“?nìO¥
G²w5UJ,"
NùýÒ´{¤|ܧdcvk<¢y˜‡¯„$õÑ MIPS
?nì" DEC ®²›E ˜‡ 200 MHz $õÇ ARM£“StrongARM”¤,
ARM úiž¿ï˜ Øp Å짱B4>³Æ·| 
žm"ž DEC úi3زœ/† Intel úi‹;|(i§¦‚Ñ §ÑK
(i§„ÑK ŒþBžm"Intel l(i¥I˜‡ÂÃÒ´Œ±mu
StrongARM "Û%´§Intel qs ücžmâ3¿ù¬dŠ§
@ž¤kmuöÑ®²r1 "
1999 c¤á Alchemy úiÒ´ 84ù‡Å¬"/Ïu Cadence §˜
‡¡Oóämuû|±§˜ StrongARM Oìè¤ =• O‡
$õÇ 32 MIPS CPU"¬$1éЧ´ÙOLupৠŒU
k  §±—u®²Ã{ÀÄ ARM 3£Ä>{¥k\Ì/ "
Alchemy = rF"M÷u‡<êiÏn½|§Ù,I‡'£Ä>{
¯ CPU"´T½|¿vkÓO" §ù‡½|½|q¤ ˜ƒ
M#Ña½|¶ª§‡^é3 MIPS þ|± Windows CE k9 e
ݦ MIPS NX(3ù˜+¤¢ "
SiByte

ù‡úi¤áu 1999 c§±˜‡Lk²Oì菥%§)˜


5 DEC Alpha Ú StrongARM ‘8 ˜ ¤ "
6

SiByte ï ˜‡p5U MIPS CPU O——§8I´3 1 GHze¢


ypVux" òæ^N´8¤Nõ¡?¬¥µC¶k
6 3{I½|§˜‡ž‘8Œ±)Øæu˜‡¤õ‘8M#¤J"

15
1.4. LÚy3˜ ­‡ MIPS ¡ 1 1 Ù MIPS Ú RISC NX(
C«rNOŽU姝¹õ‡ CPU ا,˜ C«r­:˜8¤˜ ››ì
±Jø(¹"
Sibyte O3®²æ^ QED  RM5200 Ú RM7000 ä›Eû
¥mÚå éŒ,¶, TúiÝžÿ§›þE(J— éÈ
öò§ùy²¢y 1 GHz 8I›©(J"
úi ¿µPMC-Sierrra!Broadcom!AMD
1990 c“ Ac²{ ϶èÍ/dotcom &0"NõEâú
iªªþ½§, Ù¦d‚˜´,§3A‡(ÏSÒþÞ -<Þ'8Â
pÝ"
´úi´¦½|çٽŠ´,Az·{§ùž¦‚uyÂ
Jøk^Eâ——ùkžÒ) MIPS CPU ——úiÙ¢éN´"
Ò´3ù«íÿe§Broadcom úi SiByte§PMC-Sierra Â
QED ——Ñ´3 2000 c¥"wþДpà MIPS O3i\ªXÚ¥™
5§duùü‡#1úi þ Vx", еØœ
Eâ&»5³4×ˆ" 2001 c Œc§äúi¦C
4Ù$§5gr¾ü®O»´+‚¶ 2002 c‡1’uygC?3
ìewƒ¥"k úi½Š3ؘcƒSO» pŠ›©ƒ˜"
‘ƒ 5O³ØŒ;K PMC-Sierra Ú Broadcom ´ÄkUå
UY‰1¦‚5é QED Ú SiByte ?nìOOy"ùž®²Ø1´a
¯K¶‘XNõ¤Ù¬‚Èb~{†ÒXÓÂËþ%eY%@
žäžY§ù úi$–ë阇·Ôѐ•C4Ý(J"
Alchemy Semiconductor aÉ ìC»º"¦+ÙOõÑ$
-<Ä%§TúiJ±é˜‡Œr" 5 2002 c§Alchemy  AMD
¤Â §d UYÈ AcÙ Au1000 ‚¬"ÖG<žÿ§·‚f`
Alchemy ¬‚®² Raza Technologies  "

pÝ8¤z‡?nì
Broadcom ˜m©\Ù ÙOyò SiByte  1250 OlV CPU Øüz
oاӞ8¤ S››ìÚ¯õ"ù‡‘8¤ ‡1’e
wɳö§1250 ¬‚uÐcåá\º £~ƒ¥"
Әž§QED Oìè——y3$Š PMC-Sierra  MIPS ?nì
܀——íÑ gCV CPU ¬ RM9000x2"ù8¤ ˜‡ SDRAM ››
ìڈ«Ù§"Ü©du‡½|î¤G¹§RM9000 ¦+(¢ª
CPU ž¨ªÇ 1 GHz p§ '§ÙÏérL§E,4 ú"‘ 
û)¬\\ õ§)±››ì§´TO‡¼p£,
3(J"

16
1.4. LÚy3˜ ­‡ MIPS ¡ 1 1 Ù MIPS Ú RISC NX(
c§ùapÝ8¤cµwþ-<¦Ä"‘X¡¥¬N
2006
+Øä §lÓ)¤¤¼Ü6€êO\ "´ò#OÝ
˜g5¤Å쑃O\µéC 90 B’ó²§ù‡¤‡L˜z{"
XJ\rŒ^7¡¡ÈÑWþÜ6±Or¡Uå§OÚÿÁ¤ò
±Z{5O"
 £¤§z«¡¬)·±ÏSI‡ñÑAz¡"– RM9000x2
½ö Broadcom  1250 z˜‡‡UñÑA½öA›µù‡êþŠ
Ø "y3„ؘٙ5=«a.U áÚv 1þl ½›
i\ª CPU OJø]7"
Intrinsity: ò MIPS ?nìí? 2 GHz

[%ÖöŒU®²5¿§Ž8c MIPS uÐ¥l/­‚µ@Ï


R2000/R3000 ¢yQ´‡?nì5U+kö§´¿ö¬ª` þ
5¿‡L MIPS"
¤±§N\¬¯µ3LAc¥kvk<Áã›E˜‡ý¯„
MIPS CPU Qº‰Y´kµInstrinsity Semiconductor u 2002 cuÙ Ù
FastMath ?nì"ÏLc[OEâ§lÄþ´IOó²Eâ¥÷Ñ
p5U§Instrinsity U ›Eј‡°Z 32 MIPS O§Ù̪
ˆ-<Ê8 2 GHz"
¦+ù2À˜‘#ÑEâ¤Ò§T¬%˜†3Ïé½| £
£ S"§„vky“ PC ?nì@o¯§õÑÚÑ9¯Klž¤öIO
5wk:p"
MIPS úiE¹

1998 c§SGI ——¡FÃO]76¯K——û½©lÑÙ CPU 


O܀§­#¤Õá MIPS Technologies úi"T#úi˜‡ÜÓ§‡
MŠ SoC ˜Ü©Ø% CPU "\ŒU„P·‚é@±c3!
-L SoC Ž{§@´3·‚£ã1˜‡ ASIC ØÑyžÿ"
3 SoC @ÏFfp§CPU ‚ûuyéJy˜‡Ø5U——~
X§CPU ž¨ªÇ——ؚ¦‚éý½Âz˜‡ŒU¡““ó‚(foundry)”›
E󲕐rJø˜‡ØSÜ(½Ôn‡ã——/MØ0"
MIPS 5ŽïpàMر9)ÚøA¯„ 64 O£20 Kc Ú
5 25 Kf¤"´¦‚Ù† "CAc¥§½|é§ŒnÜØ£åk
‰/^Ø0¤“àk\"
˜‡ŒnÜØ´˜X^5£ã>´Œ±?ȤýM‡O
£Ï~ Verilog¤O©‡"˜‡ŒnÜج؎´ Verilog O§„‡
)éõÙ§ÀܧϏr7LU rØ\\˜‡Œ SoC O¥§
¿ y CPU 9ÙëЧy‡¡Œ±óŠ"
17
1.4. LÚy3˜ ­‡ MIPS ¡ 1 1 Ù MIPS Ú RISC NX(
MIPS úi1˜‡ŒnÜØ´¥  32 4-K X¶l@± §q\
\ 64 5K§p5U 32 24 K§±9£2006 cÐuÙ¤õ‚§ 34
K"

1.4.9 8U
8U„3^ MIPS CPU ̇3±eoŒaµ
• SoC Ø:MIPS CPU –83ºÝÚõѐ¡ÉÃud"4‘8{ü
O"˜‡PkÏ{¤§H9lñ‡?OŽÅNX(ƒé
u;€$ཉNX( 󴘇4äáÚåO“Y"MIPS
´1˜‡Œ^u ASIC Ø/Œ¤<0 CPU ——8Ø gC3 Sony
PlayStation iZś›þ3"âÑøAûÒ´ MIPS úi§
´ Philips kgCO"
• 8¤i\ª 32 CPUµlA‡{åd§ù ¡¹ CPU! Ú
Ä¡•A^¬£䛛ìéÉ61§ÉH¤§ˆgd‚!õÑ!
?nUåÑ OéŒ"¦+ AMD/Alchemy k 4äáÚ嬧ù‡
½|q´·¥5½ $"3T8I½| CPU ¡§uy˜‡ SoC
3Œz8¤Ý¡‰Ð§!Že ' ¤ÚõÑ"
• 8¤i\ª 64 CPU: ù ¡éupài\ªA^Jø 4äáÚ
å„Ý/õÑò¥"ä´dìÚ-1‹<Ş´ù˜a¥~„A
^"´wþéJkv ÈþUy|G¡mu¤"
´ù˜aúi¥k˜ 3}Á-?#OgŽ§§‚‰ MIPS N
X( z Nõ˜#Vg§~~´‰ýc÷&¢·ÜÑu
:"Raza  XLR XõØ!õ‚§?nì“L , ˜«a.i\
ª CPU§Ù8I´'/DÚ0i\ª CPU JøõN\Š£ü‡¡
‘5õÂä"Cavium úi Octium ékcµ"
• ÑÖì?nì: SGI§Q²Â MIPS NX(óŠÕúi§UYø
Apà MIPS XÚ§˜† 2006 c»Ž§¦+džåÙ«ì™5æ
^ Intel IA-64 ®²Ôc "´ù pàXÚ´®²r ¦ÞµMIPS
5½/U0ہ32,ž¤öÚi\ª½| "
L 1.1 Ñ ˜ p§ ¿Â¬̇A5"·‚„vk?Øl MIPS
I  MIPS64 -8‡C["ù SNò32.7 ![?ا\Œ±l
T! MIPS II ·$"

18
L 1.1: MIPS CPU p§
c° ‚û/.Ò/̪(MHz) -8 p„ £I+D¤ 5
1987 MIPS R2000-16 MIPS I ¡ 4K+4K∼32K+32K ¡ £R2010¤2:ü FPU
1990 MIPS R3051-16 4K+1K 1˜‡äk¡þ  MIPS CPU§Óž´˜x3 ?oN
©y
1991 MIPS R4000-100 MIPS III 8K+8K 8¤2:܇Ú? ››ì§ŒÀ ê" 64 CPU
——´Êc „ék MIPS CPU ý|^Ù 64 -8"
6Y‚ÚŒ„kÏuJpž¨ªÇ"
1993 IDT/QED R4600-100 16K+16K ² QED °%N O'Ӟ¨ R4000 Ú R4400 ¯
õ——Ü©du­#£ ²;Ê?6Y‚"´ SGI ¯„$
à Indy óŠÕÚ Cisco ´d쭇܇"
1995 NEC/MIPS Vr4300-133 16K+8K R4000 $¤!$õÑõUû)¬"˜m©žé
Nintendo 64 iZś›§Ùi\ªA^)¨Ê LJ4000
-1‹<Å"
1996 MIPS R10000-200 MIPS IV 32K+32K R10000 š'Ï~§Ù¥¿÷ ‡?nìEâM#"§j±Ì
‡ MIPS DÚ´U˜‡K‰4—"(J´u9Œ!ØÐ^§
´zîâ5UÌ'["
1998 QED R7000- 16K+16K+256K L2 1˜‡Pk¡þ?p„  MIPS ?n짤A“-1‹
<ÅÚÏA´dìØ%"
2000 MIPS 4 K ØX MIPS32 16K+16K £;.Š¤ 8cŽ¤õ MIPS Ø——ŒnÜ ¤$"
2001 Alchemy Au-1000 16K+16K XJŽ‡ 500 mW õÇUˆ 400 MHz „ݧùò´\؃
À"T¬3½|þ¿Ø¤õ"
2001 Broadcom BCM1250 MIPS64 32K+32K+256K L2 600 MHz V CPU O£?p„ ¤"
2002 PMC-Sierra RM9000x2 MIPS64 16K+16K+256K L2 1 GHz V CPU O£z‡ CPU ˆgPk 256 K š?
p„ ¤"1˜‡ˆ 1 GHz  MIPS CPU"
2003 Intrinsity FastMath MIPS32 16K+16K+1M L2 äk•þ DSP §Ìªpˆ 2 GHz  CPU §´½|%éÙ¹
ƒ"
2003 MIPS 24K Ø MIPS32 R2 16K+16K 32K+32K 64K+64K nÜ ØUˆ 500 MHz§TØO4¤õ"
2005 MIPS 34K Ø MIPS32+MT ASE 32K+32K £;.˜¤ MIPS õ‚§k°ö"
1.5. MIPS Ú CISC NX(' 1 1 Ù MIPS Ú RISC NX(
1.5 MIPS Ú CISC NX('
äk@ÏNX(®?Šó£§S ——AO´@ 3 x86 ½ö
680x0 CISC -8e¤å5§S ——ŒU¬é MIPS -8ÚMì.
aÛ%"·‚3ùp¦þ‰˜‡o(§ù\Òؖu¬± øl;Ï
é˜ MIPS ¥ŠØ3Àܧ'XæÒöŠ push/pop -"
·‚òıeA¡µJp6Y‚Ç ‰ MIPS öŠ\þ›¶4
à{ü load/store öŠ¶ŒU´k¿ŽÑöŠ¶-8˜ ýŽØA
5¶6Y‚öŠ¥é§S Œ„/"
ÐJÑ MIPS Žd"4|§AO'5¢y{á6Y‚" 5¯
¢?˜Úy² ¦‚äµd6Y‚ ÚÑNõû½·ÜuN´Ú
¯„/¢yp5U"
1.5.1 MIPS -8›
• ¤k-ÝÑ´ 32 : ù¿›Xvk-U =Ó^ün‡i!S
˜m£Ï MIPS ?›©‡';. 680x0 ½ 80x86 Œ z©ƒ›
n›¤§vk-Œ±‡Lo‡i!"
‘ƒ 5Ҵ،Ur˜‡ 32 ~ê˜?ü‡-¥£-¥vkv
 ^5?èöŠêÚ8IMì¤"MIPS Oöû½3Ñ 26 ~ê
˜m^±?èa=ÚN^-8I/Œ¶´=k‰ü^-"Ù§
-Uk 16 ˜m3‰~ê"ùC\?¿ 32 êŠI‡˜‡ü^-
S§^‡©|› 64 K -‰Œ"
• -öŠ7L·Ü6Y‚: U3ƒA6Y‚ãâU‰1?Ö§¿
7L3˜‡ž¨±ÏS¤"~X§Mì£ãUk˜‡Š\M
ì槤±-U?U˜‡Mì"
ê¦Ø´ØŒ½"­‡-§´ØU3˜‡ž¨±ÏS¤"MIPS
CPU DÚ‰{´uxù öŠ˜‡Õá6Y‚ü§ù‡·‚±
2`"
• nöŠê-: Žê/Ü6-ØI‡½S/Œ§¤±˜Ñ ¿v
- Œ±½Âü‡Õá öŠêژ‡8öŠê"?ÈìUn
öŠê-§Ù‰ `z§SŒ˜m5`z?nE,Lˆª“è"
• 32 ‡Mì: MìêþÀJ̇´d^‡I¦°Ä§3y“NX
(¥˜| 32 ‡Ï^M촁61"æ^ 16 ‡’½Ø y“?È
ìI‡§´ 32 ‡v 4 C ?Èìr£Ø Œ E,¼êƒ ¤
~^êâ3Mì¥"æ^ 64 ‡½õMìI‡Œ-
?èMì O\ þe©ƒ†Kú"
20
1.5. MIPS Ú CISC NX(' 1 1 Ù MIPS Ú RISC NX(
• Mì": $0 Mì[ˆ£"§‰ù‡~^êJø˜‡{ ?è"
• vk^‡è: MIPS -8˜‡AÒ´vk^‡I“§ù=¦3
1985 c RISC ¥´4-?"NõNX(kõ‡I“ 5L«$
Ž(J“? ”!“"”"CISC ;.‰{´Šâ˜ -öŠ
(J˜ù I“§k RISC NX(3 I“ £¦+ Ud
'-²(˜¤"
MIPS NX(û½r¤k&EMìæ¥"'-˜Ï^M
ì§^‡©|-uÿÏ^Mì"@(¢k|u6Y‚¢y§Ï
U ~éŽâ/Ü6öŠ6|©Å›ØØ=˜«ÑӞ¬~'
/©|-饝6"
·‚ ¡¬wk^‡©|¿›X´Ä©|û½7L3Œ‡6Y
‚±ÏSŠÑ¶TNX(ÏL±©|ûüÿÁ^‡{ükÏu¢y
ù˜:"¤± MIPS ^‡©|ÿÁü‡MìÎÒ/"½ö˜é
Mì´Äƒ"
1.5.2 όږ
• –¯SUÏL{üMì\1Ú;: éSCþ?1Žâ$Ž¬
‹Ï6Y‚§¤±Øùo‰"zgS–¯Ñч˜^wª\1½;
-"ŒMìæ¦ù˜:¢Svkfþ@oæ†"
• k˜«êâόª: A¤k\1Ú;ÑÏLü‡MìČ\
þ˜‡ 16 ~ê £þ£2:-Œ±¦^kMì\Mì¤Ï
ŒS"
• i!/Œ-: ˜ êâ\ MIPS CPU M짤köŠÑ´3
‡MìþöŠ"´– C ùŠóŠÂØ·ÜØUόSi!â
ÝÅì"Ï MIPS é 8- Ú 16- Cþ£©O¡i!ڌi¤Jø
˜@C\/;öŠ"˜ êâˆMì§ÒŠMì5?
n§¤±Ü©i\1-kü«/ª——ÎÒ*ÐÚ"*Ð"
• load/store 7Léà: SöŠUléàƒAêâa.>./Œ\
1Ú;êâ"i!Œ±3?¿/ŒDѧ´Œi7L3óê/Œéà§
i3oi!>.éà"Nõ CISC ‡?n쌱l?¿i!/Œ\1/
;oi!ê⧴‡s¤ ž¨±Ï"
´§MIPS -8NX(£ISA¤(¢¹kA‡Aύ-±{zé
vk·éà/ŒöŠ"
• a=-: k 32 -Ý3Ž‡|±éŒ§SNX(þé©
|´‡¯K"MIPS -öŠè 6 §3Ñ 26 5½Âa=
21
1.5. MIPS Ú CISC NX(' 1 1 Ù MIPS Ú RISC NX(
8I"Ϗ¤k-3S¥Ñ´oi!>.éà§$ü /ŒÃI
§ùŒk 2 = 256 MB /Œ‰Œ"ù‡/ŒØ´ƒé PC §
28

´)º¤ 256 MB ãSýé/Œ"ùéŒu 256 MB ü‡§S4Ø


B§8c„vk-Œ¯K"
‡ÑãS©|Œ±ÏL¦^˜‡Mìa=-‰§T-Œ±a
?¿ 32 /Œ"
^‡©|k 16  £——‰Ñ 2 i!‰Œ§Ï-Ñ´o
18

i!éà——)º¤ƒé PC ‘ÎÒ £þ"XJ©|8I¬


3;‹©|ƒ - 128 KB ‰ŒS§?ÈìÒU)¤˜‡{ü
^‡©|-"
1.5.3 MIPS vkA5
• vki!½Œiêâ$Ž: ¤kŽâÚÜ6öŠÑ3 32 êâþ?
1"i!½Œi$ŽI‡Œþ ] ÚNõ öŠè§ é
k^"C ŠóŠ{4ŒõêOŽ^ int a.§é MIPS ó int Ò´
32 ê"
, §S²(‰ short ½ö char $Žž§MIPS ?Èì7L\ 
“è±y(J£7ÚÄѧ)¤‹ 16- ½ 8- Åìþ˜(J"
• vkéæÒAÏ|±: DÚ MIPS ®?(¢½Â ˜‡M슏æ
ҍ§´M‡þ SP vk?ÛAσ?"k˜«í'uf§SN
^ÒvÙÛ§ùŒ±·ÜØӊóÚ?È쬶\A„Åù
½§´ù †M‡Ã'"
æÒÑØU·A6Y‚§Ïkü‡M쇣5gæÒêâÚO
\Š¤"
• f§S|±: k˜:'AOµa=-k˜‡a=¿óÀ‘§
rˆ£/Œ\˜‡Mì§%@´ $31 "¤±Bå„S.þ^ $31 Š
ˆ£/ŒMì"
ù‰'årˆ£/ŒæÒþ‡{ü§%‘5²wÐ?"‘B
Þü‡Ð?yyµ1˜§± ©|ږ-©l¶1§N
^NõŠØI‡3æÒˆ£/Œ§Sž§ù‰kÏuJp
Ç"
• ¥ä?n: éJwM‡U‰'ù "§r­#m©/
Œ˜˜‡AÏMì§X=?Uff éÑNo£¯þÅì
G¿BŽ?˜Ú¥ä§, a=$àS¯k½ÂИ‡ü˜\
/Œ§d ˜ƒd^‡KI"
22
1.5. MIPS Ú CISC NX(' 1 1 Ù MIPS Ú RISC NX(
• É~?n: ¥ä´É~˜«a.£MIPS ¥É~ù‡c)¤
kI‡ CPU ¥ä~^S‰1¿N^^‡?n¯‡¤"˜‡É~Œ±
5g˜‡¥ä!5géÔnþØ3J[SÁ㖯!½öÙ§é
õœ¹"˜^k¿Ú\!aqXÚN^!^5?\Éo OS SØ
g€-u)ž§¬?\˜‡É~"¤kÉ~Ñ—››D4Ó
½\/Œ" 7

?ÛÉ~u)ž§MIPS CPU Ñج?æÒ!\S½ö°M


ì"
U콧3 ü‡Ï^Mì‰^uÉ~§ùÉ~?n§SŒ±g
Þ£3 MIPS CPU þvkMì،U‰?Û¯œ¤"éu$13#N¥
äÚg€?ÛXÚþ§S5`§ùü‡M슑žŒUCz§¤
±Ð؇^"
1.5.4 §S Œ„6Y‚J
dŽ§±þÒ´\I‡l˜‡{z CPU )ÜSN", ¦
-8·A6Y‚¬—˜ Û%J" Bun)§·‚xã5`²"

ã 1.3: 6Y‚Ú©|ò´
 ò´©|: MIPS CPU 6Y‚(£ã 1.2¤¿›X˜‡a=/©|
-ˆ‰1ã)#§SOê슞§‹3a=- -®²m
© "TNX(¿Ø´¿ïùÜ©kd3^åóŠ§ ´‡¦;‹©
| -o´3©|8I-ƒc‰1";©|-ƒ - ˜
¡©|ò´ø"
‡´M‡vkAÏ?n§´Ä©|û½±9©|8I/Œ§Ò¬3
ALU 6Yã(åž——dž§Xã 1.3 ¤«§®² §$–
7 Ñk§Ü¶ùcÞ¢SþÑkÐA‡ØÓ\:§–ü‡"œžë 5.3 !"
23
1.5. MIPS Ú CISC NX(' 1 1 Ù MIPS Ú RISC NX(
3ee˜‡6Y‚øÑ5Ø9Jø˜‡-/Œ"
´©|-­‡5v±‰ÙAÏ?n"lã 1.3 Œ„§Jø ˜^²
ALU AÏ´»Œ±4©|8I/ŒJ@Œ‡±Ïˆ"ëӍã
õÑ5Œ‡ž¨±Ï £§ÒfÐ59Ñ©|8I-Šee
˜‡-"ùM‡Ò¬$1©|-!X$1©|ò´ø-!,
´©|8I-——2vkÙ§ò´"
?ÈìXÚ½ö®?§SATÄ$–|^©|ò´¶(J´Ï~kŒU
ÏL·Sü¦ò´ø¥-‰ k^óŠ"²~Œ±rO?
-£ò´ø¥"
éu^‡©|¯K¬k:E,§©|ò´-£–¤Aéü^©|´
»Ñó"¢3éØk^¯œŒ‰ž§ò´ø¥W\˜^ nop -"
ؚ²(‡¦§ÄKNõ MIPS ®?ìÑé§S Ûõù‡%A5"

ã 1.4: 6Y‚Ú\1ò´
• êâ\1ò´£\1ò´ø¤: 6Y‚,˜‡ JÒ´˜^\1
-êâ3e˜^- ALU ãm©âlp„ /SXÚ
ˆ——¤±3e˜^-¥ØU¦^\1êâ"£ëwã 1.4 ±n)Ù
óŠÅ›¤
;\1-ƒ - ˜¡ \1ò´ø§˜‡`z?ÈìòÁã
^§‰ k^¯œ"®?ìé§S Ûõù˜:§ŒU\˜^ nop
-"
3y“ MIPS CPU þ§\1(J´p£µXJ\ÁãL@¦^(
J§CPU òÊe5–êâˆ"´@Ï MIPS CPU vkp£§3ò
´ø¥Áã¦^êâò—Ã{ý(J"

24
12Ù MIPS NX(
3OŽ+¥, NX(ù‡ƒŒiú^5£ã˜‡^u?§Ė
Åì§ Ø´˜‡ÅìäN¢y"ù˜:«Oš~k^——ŠÚ3½|
Š¥éù‡cE^«©m5"ÖökŒUØÙGĖ£ã§éÙVg¿Ø
))"XJ\mLÃÄ C„§Ò¬uyØ+T´cӰĄ´ Ӱħ
o´h€ †3m§lÜì †3†"3ùp§¦+äN¢y£=‡Óf°Ä¤
؃ӧNX(£==‡ †3=>¤%k¿±ƒÓ"
,§XJ\´˜‡ú´.åmçÄ´U 3‹w´¡þp„1
¨§ùžcӄ´ Ó°ÄÒék'X "OŽÅ´Xd——XJ\k,«
4à½ö‡~5I¦§¢y[!Òé\魇 "
˜„ 󧘇 CPU NX()˜|-8\þ˜ Mì£"
-8 †NX(ùü‡âŠÄþ´ÓÂc"3  ISA(Instruction Set
Architeture -8NX()¥\Œ±wùü‡âŠÓžÑy3˜å"
8c§é MIPS ISA Ð½ÂÒ´d MIPS úiч MIPS32 Ú
MIPS64 NX(5‰"MIPS32 ´ MIPS64 ¥^uk 32 Ï^Mì
CPU f8"/MIPS32 Ú MIPS64 NX(5‰0`å5§·‚e¡{
¡“MIPS32/64”"
Œõê›E MIPS CPU úiy3ÑoNù 5‰——@ ØUî‚oN
úi3¦þ  O"
3 MIPS32/64 uكc§LÐA‡ MIPS NX(‡"´ù P
½Âª·^==up ^‡¤^-Ú] —— röŠXÚ7I
CPU ››Å›wŠ´äN¢yƒ'"ùÒ¿›XŒ£‡öŠXÚóŠ6
u˜‡‡‘± MIPS NX(™5½Ü©­½fÆ" ‰{´z‡
NX(‡Ñg,†˜‡/1¢y0ƒ'é"
MIPS I: @ 32 ?nì£R2000/3000¤¦^-8¶¤kÑyL
MIPS CPU ÑU$1ù -§¤±E,´ MIPS ­.˜«Ï^/­.
Š0"
MIPS II: l5ÒvkªÝ R6000 Åì½Â ‡,?"´k˜
«éaq MIPS II ÀÜ3i\ª½|þ 32 CPU ¥2¦^"MIPS
II ´ MIPS32 c"

25
1 2 Ù MIPS NX(
MIPS III: d R4000 Ú\ 64 -8"
MIPS IV: 3 MIPS III þO\ A^k^£õ2:$Ž¤-§Ñy3ü
‡äN¢y£R10000 Ú R5000 ¤¥"
MIPS V: V\ ˜ Û%Ӟ‰1ü^2:öŠ£”SIMD”¤-——
´l5vk›EL MIPS V CPU "Ù¥ŒÜ©-±/¤éü°Ý0
ªŠ˜‡ŒÀÜ©­#Ñy3 MIPS 64 ¥"
MIPS32, MIPS64: 1998 cl SGI ©lÑ5ƒ  MIPS ‰Eúi›½I
O"TIO1˜g) ¡?nì 0 /CPU ››0õU"MIPS32
´ MIPS II ‡8§ MIPS64£Ù¥) 64 -8¤´ MIPS IV ‡
8£„±ŒÀ*Аª¹ MIPS V ŒÜ©¤"
Œõê 1999 cƒ O MIPS CPU oNù IO§¤±·‚Ö¥ò
æ^ MIPS32/64 ŠÄ:NX("(ƒ/`§·‚Ä:´uLu
2003 c MIPS32/64 5‰1‡"dc MIPS32/64 CPU Ò¡1
˜‡"
TNX(IO½Â kúi© ¥¤½ÂÜSN¶† MIPS
V ƒc§ù © ½Â5‰§v±yU $1Ó UNIX A^§S§Ø
v±y^ öŠXÚ½. A5“èU Œ£‡"Šé'§XJ˜
‡ CPU „Ì MIPS32/64 5‰§@ÒAU $1˜‡Œ£‡öŠXÚ"
£g R3000 m©¤@Ï MIPS CPU  CPU ››-ÚMì† MIPS32
k¤ØÓ¶ù ®²éP §ÖØ2ã"
kØ MIPS CPU ¢y\\ ˜ #-Úk¿gA5§Ø´
oUN´é^‡½óä(AO´?Èì)5¿©|^ù †äN¢yƒ'A
5"·‚ò¬JŒõê·@k¿gA5"
Œ±3ü«ØÓ gþ5£ã MIPS NX("1˜«£ã(Ù)´§
3óŠÕþ?˜‡^rA^§Sž3®?Šó gþ¤wÀÜ"ù
¿›X CPU ~óŠ‡L§´Œ„"
¡ˆÙ§·‚ò0 ˆ‡¡§)Ûõ3p öŠXÚ ¡-<
? Ü[!——CPU ››Mì!¥ä!g€!p„ öŠÚS+n"
–·‚¬òù ?Ö©)¤˜ ¡ä50 "
CPU 3^r?þoN5~~'³¤kA5žoN5Ðõ"®
¤k MIPS CPU ь±$1 MIPS I ^r?“è"
-8*Ð5‰z——ASE
·‚‡ErN§RISC ¿Ø¿›X-8Ò"¯¢þ RISC {ü5¦
ÏLénöŠêMìMì$Ž?1C/5*Ѝ-8CLuN´§
26
1 2 Ù MIPS NX(
N´4<²Ø4p¾"
 MIPS ff3i\ªXÚA^žÿ§éäNA^ O\#-X
Sœ„k Ñ5" MIPS32/64 á ٥˜ -§Óž#N± ASE
£;^-8*Ф/ªJø ˜ 5‰"ASE ´é MIPS32/64 ŒÀ*Ч
XJk{§Ù3±˜«IOªÏL˜Mì5I£"y3®²kƒ
õ*е
• MIPS16e:T*Ð3 MIPS32 Ú MIPS úiƒcÒk "3 1990 c“
kd LSI M©§Xúu  MIPS ?›“èŒ" MIPS16 ò^
r? MIPS -˜‡f8?è¤ 16 öŠè£„O\ A^AÏ
-¤"ù-8²w/0§§S?Ȥ MIPS16 )-ê
õu?Ȥ~5 MIPS -¶´ù«Ý~Œ-¬)“
è" MIPS16 -8|„¤é MIPS32 *Ч*Ð ‡Ò‰
MIPS16e"ùÖé9 MIPS16e [!µù‡K8Œ §=¦3®
? gJ±ù˜Ù§3N¹ B.1 édù Aé"
• MDMX: ù´d SGI |±, ˜«Pª*ЧO\ ˜Œ1æ^2
:£?nì 1 ¤Mì SIMD ŽâöŠ-"Ϗz‡öŠ3 64 M
쥘á.ê|z‡ƒþ¿1?n§¤±´ SIMD"ùa$
ŽNõ´/Ú0.¶=(JÄў§8IöŠê^ŒL«‰ŒS
CŠ5“O"êÚ SIMD öŠU \„ˆ«ÑªÀª/6x
N/OŽ"ù3¡ DSP(Digital Signal Processing) ;^ CPU ¥´2
æ^A5"
MDMX aqu Intel MMX *Ð@χ"´ SGI gCl5vk¢y
MDMX §Broadcom  CPU q´=¢y"

• SmartMIPS: \—$Ž@´œUk½|' §T*ÐéJp\—


5U éNX(Š *¿§Óž(Ü Ù§A‡† CPU ››X
ÚSÚº€ƒ'?¾"ò5k˜U 32 œUkò¤˜‡ãŒ
½|§´y3ù˜ƒ„vku)"
• MT: 3-¡*¿é§%kX㌿µ‰ MIPS Ø\þ M
‡õ‚§õU"ÄkÑy3 MIPS ‰Eu 2005 cuÙ 34-K x?nì
¥"N¹ A é MIPS MT Š ˜‡V)0 "
• DSP: ù´˜|ÑªÀª?n3-8§Pkéêڎâ
±9 SIMD öŠ§aqu MDMX ——3¢S¥®²²w' MDMX 
k^"ù´3 2005 c#íѧ^3 MIPS ‰E 24-K Ú 34-K x
?nì¥"DSP ASE úÙžÅTÐU 4·‚3N¹ B.2 ¥\˜‡{
࣋"
27
2.1. MIPS ®?Šóº‚Ð& 1 2 Ù MIPS NX(
MIPS32/64 5‰¥„k˜ Ù§ŒÀÜ©§Ø·ÜwŠÌ6-8*
¿µ
• 2:µP´Ð"l@ÏFfm©2:Ҙ†´ MIPS -8
ŒÀÜ©§´›3/?nì 1 0?è¥"ÖédŠ [/0
"
• CP2µ1?nì?è«3‰ÿŒrgd¦^"´ÏI‡Œþ
OÚÿÁóŠ§ék<ÁL"ùpvŸoÐù"
• CorExtendµ MIPS ‰E¦Œãåíј‡„Ž´^^rŒ½Â
-8"ù‡Vg3 2002/2003 cmŒlŠ§ARM Ú Tensilica žÑ
(¡|±"
• EJTAGµ OrNÁõU \ŒÀXÚ§3 12.1 !k0 "

• ü°Ý2:éµé2:ü*ЧJø SIMD öŠ§z‡-ӞöŠ


ü‡ü°Ý£32 ¤2:êŠ"
• MIPS-3DµÏ~o´Ú¤é2:ƒ(ܧO\ A^-§é3n‘¶4
±ã¥Œþ¦^2:Ý $Ž¢y\„"
2.1 MIPS ®?Šóº‚Ð&
®?Šó´ CPU ©?›-Œø<Ö£±9Ö¤‡"1 9
Ù;€ùã®?Šó"l5vk>L®?ŠóÖöŒU¬éÖÜ©SN
žaJ±n)——´y3m©Æ„žØ"
éuÙG®?ŠóØÙG MIPS Öö§e¡´˜ ~fŒ±ëµ
/* this is a comment */

entrypoint: # that’s a label


addu $1, $2, $3 # (registers) $1 $2 + $3

†Œõê®?Šó˜§MIPS ®?Šó´±1ü "˜1(—L«


-(姮?Šó5º½ј1¥/#0i΃ SN"3˜1pŒ
±kõ^-§ƒm‡^©Ò m"
üc ¡‹X˜‡kÒ/µ0“L˜‡IÒ——ùpüc2§Œ±
¹ˆ«Û%iÎ"IÒ^5½Â“è¥\:Ú·¶ê⫘‡;
˜"
MIPS ®?ì)º˜‡š~î‚!¿÷ Mì?ÒŠó"Œõê§S
^ C ý?n§Sژ IOÞ©‡§ùŒ±^¶iÖMì¶Ï^M

28
2.2. Mì 1 2 Ù MIPS NX(
ì¶i‡N ÙS.^{£·‚ò31 2.2 !ù¤"XJ\^ C ý?n
§S§Œ±¦^ C º‚5º"
Nõ-Ñ´Xþ¤«nöŠê/ª"8IMì3†>(5¿§ù˜:
† Intel x86 S.ƒ‡)"˜„ ó§˜(JÚöŠêMìÖ^S†
C Šó½Ù¦“êŠóª´˜—§~Xµ
subu $1, $2, $3

¿›Xµ

$1 = $2 - $3

8cùùoõÒ "
2.2 Mì
§SŒ±^Ï^Mìk 32 ‡µ$0 ——$31"Ù¥kü‡§kùü
‡^{†Ù§ØÓ"
$0 Ø+\ŸoŠ§[ˆ£""

$31 [d~¼êN^- (jal) ˜ˆ£/Œ"ž5¿MìN^‡


-(jalr)Œ±^?¿Mì5˜Ùˆ£/Œ§´¦^ $31 ƒ Mì
kŠ~5"
Ù§¡§¤kMìÑ´˜§Œ±3?ۘ‡-¥¦^(\$–
Œ±^ $0 Š˜‡-8IM짴ù-(JÒÃ(ž” ")
MIPS NX(¥§§SOêì¿Ø´˜‡Mì§\ÐŽÑ؇@
Ž——3˜‡äk6Y‚ CPU ¥§§SOêìkõ‡ŒUŠ-<· "
jal -ˆ£/Œ´Ù ee˜^-:
...
jal printf
move $4, $6
xxx # return here after call

ù‰´kn§Ï;‹N^- ¡e˜^-´N^-ò´
ø——žP4§Uì5½T-7L3©|8I-ƒc‰1"N^ò´ø
-éL¤§Ï²~Œ±^5ïáN^ëê"
MIPS pvkGè"GMì½ CPU Ù§SÜGé^r?§Sv
k?ÛK"
kü‡MìŒ(Jà£‰ hi Ú lo ¤†ê¦{$Žƒ'"§‚
Ø´Ï^Mì§Ø ¦Ø{-ƒ vkÙ§^å"´§½Â •ùü‡à
\?¿Š-——c[Ž˜Ž\Ò¬uy§ùéu¡E˜‡¥ä§
SG´7I"
29
2.2. Mì 1 2 Ù MIPS NX(
2:êÆ?nì(2:\„ì FPA ½ FPU)§XJk{§O\ 32 ‡2
:Mì¶{ü®?§S¥Ò¡ $f0–$31"
¢Sþ§éu@Ï(ÎÜ MIPS I IO¤ 32 Å짐k 16 ‡óê?
ÒM쌱^‰êÆOŽ",z‡óêÒMìQŒ±^˜‡ü°Ý
ê(32 )§qŒ±^˜‡V°Ýê(64 )¶\‰˜‡V°Ý$Žž§Mì
$f1 ˜ $f0 õ{ §±daí"3 MIPS I §S¥§k\3êÚ2:
MìƒmDxêâ½ö\1/;2:M슞ÿ§\âUw„Ûê?Ò
Mì——=Bdž®?쏐\Ø^P4ù E,5"
MIPS32/64 CPU k 32 ‡ý FP Mì"´„ŒU-˜ ^‡§
±†L CPU oN5 ;^ÛêÒMì"3››Mì¥k˜‡
ª Œ±4y“ CPU [P1"
2.2.1 Ï^MìS.·¶Ú^{
·‚®²s A£ã ˜ NX(¡SN§e¡50 ˜ ^‡
¡SN"·ú\y3k7‡ )ù "
¦+M‡Avk¦^Mì5½§3¢S¦^M임‡„̘
XS.å"M‡ŠØ'%ù S.^{§´XJ\Ž^O<f§S!
?Èì½öŠXÚ§@\Ð„Åù .~"
†ù S.^{ƒAk˜@S.·¶"XJ‡ÎÜS.^{§@ÒA
Øئ^ù S.·¶"L 2.1 Ñ ~„·¶"
3 1996 cc §SGI Ú\ ¦^#·¶½?Èì"#½Œ±^
5)¤¦^ 32 ½ 64 ό§S§ùü«œ/©O¡/n320Ú/n640"·
‚6žØ?Øù §1 11.2.8 !édŠ ˜‡{²´ƒ¡£ã"
®?§SMìS.·¶Ú^{
• at: ù‡M쏮?ì)ܤ-3"XJ\‡wª¦^ù‡
Mì£'X3É~?n§S¥Ú¡EM줞§k˜^®?–
-Œ^5BŽ®?ì¦^§——´ù˜5®?ì˜ ÷-ÒØ
U2^ "
• v0, v1: ^5˜f§Sˆ£š2:Š"XJ‡ˆ£ŠŒ§ùü‡
Mì˜Øe§?Èìò¬ÏLS5¤"[!Œë„ 11.2.1 !"
• a0–a3: ^5D4f§SN^žc 4 ‡š2:ëê"ØL󜹌U‡
E, "žë„11.2.1!"
• t0–t9: ì½§˜‡f§SŒ±Ø7 gd¦^ù Mì"ù¦
ù Mìé·Ü^ŠLˆª¦ŠžžCþ——´?Èì/§S
7LP4§ù M쥊kŒUf§SN^»€K"
30
2.2. Mì 1 2 Ù MIPS NX(
L 2.1: Ï^MìS.·¶Ú^{
Mì?Ò ÏPÎ ^{
0 zero [ˆ£ 0
1 at (assembly temporary ®?6)3‰®?ì¦^
2-3 v0, v1 f§Sˆ£Š
4-7 a0-a3 (arguments) f§SN^cA‡ëê
8-15 t0-t7 (temporaries) žCþ§f§S¦^žÃI
24-25 t8-t9
16-23 s0-s7 f§SMìCþ¶f§S\ž7Lي¿3ˆ
£c¡EŠ§l N^¼êwù MìŠvk
Cz"
26,27 k0,k1 3‰¥ä½g€?n§S¦^¶ÙŠŒU3\ú™.
eUC
28 gp (global pointer)ۍ¶˜ $1Xڑoù‡
±Bu static Ú extern Cþ"
29 sp (stack pointer)æҍ
30 s8/fp 1ʇMìCþ¶I‡f§SŒ±^5‰v
(frame pointer)
31 ra f§Sˆ£/Œ
• s0–s8: ì½§7Lyù MìSN3f§Sˆ£ž‡Úf§S
\žŠƒÓ§‡o3f§SpØ^ù M짇or§‚3æ
Òþ¿3f§Sˆ£ž¡E"ù«½¦ù Mìš~·ÜŠM
ìCþ§½˜˜ 3f§SN^Ïm7LŠ"
• k0, k1: 3‰öŠXÚg€/¥ä?n§S¦^¶^ Ø7¡E5
Š¶é^uÙ§^å"
• gp: ^uü‡ØÓ8"éu Linux §S¦^˜a ˜Ã'“è PIC §
¬ “èÚêâÚ^чÏL˜‡¡Û £þL GOT(global
offset table) L"gp Mì^5‘o•TL"œë1
16 Ù"
3~5š PIC “è£3{üi\ªXÚ¥¬^¤¥§gp kž^5
•˜‡óž(½ ˜·êâ¥Ü"ù¿›X§|^ gp ŠÄ§é
u3 gp c 32K ‰ŒSê⧐I‡˜^-Ҍ¤"
XJvkۍ§˜‡·ê⫍ŠI‡ü^-µ˜^´¼
d?ÈìÚC1§SOŽÑ 32 /Œ~þp §, ˜^âý
êâ"
31
2.3. ê¦{܇9Mì 1 2 Ù MIPS NX(
‡ïáƒéu gp /ŒÚ^, ?Èì3?Ȟ7L˜‡êâó
S/Œ3 64K ‰ŒƒS"¢Sþù´ØŒU§U‚ßÿ"
Ï~‰{´r£l‡i!±S¤Ûê⑘3 gp «S§X
J„´Œ§Ò4óìuÑ´w"
• sp: æҍþe£ÄI‡wªÏL-5¢y§Ïd MIPS Ï~
3f§S\ÚѝâNæҍ¶dN^f§S5KI¤"Ï
~3f§S\?r sp Nf§S¥mæҌUˆ$:§l
?È쌱ÏLƒéu sp ½ £þ5æÒCþ"ë„1 10.1 !
'uæÒ^{"
• fp: ‰ s8"XJdu,«Ï?È콧S ØU½öØOŽƒé
uæҍ £þ§f§SŒ±^v5P¹/‹læÒœ¹"ù
«œ¹´kŒU§AO´§S‡9$1žéæҊÄ*О
ÿ"k Šó²(|±ù‰¶®?§S oŒ±?1ˆ«¢¶^¥
¼ê alloca()  C Šó§SÒ´ù‰"
XJæÒ.Ü3?ȞØUû½§\ÒØUÏL sp 5æÒC
þ§Ïd3¼êmÞ§ fp ЩzƒéuT¼êÒv˜‡~þ ˜"|
©/|^Mì½ÒU ¦ù‡1‹¼êk'§QØKN^
¼ê§ØK?Ûi@¼êN^"
• ra: 3?ۘ‡f§S\?§ra Mì¥Xˆ£/Œ——Ïd;.
f§Sѱ˜^ jr ra -(—"nØþù§ùpŒ±¦^?¿Mì§
´˜ E, CPU Ϗæ^`zE|£©|ýÿ¤§¦^ jr ra ž
J¬Ð"
g„‡N^Of§S§S§7LÄk ra Š§Ï~æÒ
þ"
é2:Mìk˜‡ƒAIO§·‚ò3 7.5 !o(˜e"·‚3ùp
®²0 MIPS ÐuÙMì^{½¶C5#O ˜ Cz§P
½Ò¡ o32 ——·‚‡† 11.2.8 !â?؍#½"
2.3 ê¦{܇9Mì
NX(@ê¦{š~­‡§ŠÏLMق¢y¦{-"ù
MIPS
˜:31980 c“ RISC ¡p¿ØÊH", ˜«‰{^M‡¢yU š
IOê‰16Y‚˜‡¦{Ú½¶éuE,:¦{§‰^‡ÏLf§
S(5[˜‡¦{öŠ)"@Ï Sparc CPU Ò´ù‰"

32
2.4. \1†;µÏŒª 1 2 Ù MIPS NX(
„k˜«^5;Oê¦{ìE,5‰{´32:ü¥5$1
¦{——Motorola is˜y 88000 CPU [xÒ´Jø ù)û
Y——ù":´Š MIPS 2:?n슏ŒÀOЩ"
†dØÓ§ MIPS CPU æ^ ˜‡;^ê¦{܇§¿vk8¤Ì
6Y‚¥"¦{üÄöŠ´rü‡M쌊ƒ¦˜‡ü
ŒMì(J§˜3¦{üp¡"- mfhi!mflo ©üŒò(JDx
½Ï^Mì"
Ϗ¦{(Jˆ£vk¯UgÄø‘ -¦^§Ý§¦{(
JMìo´p£"3¦{$Ž¤ƒc?ÛèãÖ(JöŠÑò—
CPU Êe5–¦{öŠ(å"
ê¦{쏌±‰1ü‡Ï^MìØ{öŠ"ùž lo Mì^5
˜(J(û)§hi Mì^5˜{ê"
\Ã{3˜‡ž¨±ÏSѦ{ü(Jµ¦{‡^ 4–12 ‡±Ï§Ø
{‡^ 20–80 ‡±Ï£ûuäN¢y§ék ¢y„ûuöŠêŒ¤"
˜ CPU Pk½öÜ©6Y‚z¦{ü——Ò´`§Œ±z˜‡½
öü‡±ÏéĘ^¦Ø-§¦+ØU3oʇ±ÏS(J"
MIPS32/64 ) ˜^nöŠê mul -§ˆ£¦{(J$ŒÜ©
˜‡Ï^Mì¥"´@^-7LÊîe5†öŠ¤¶pÝ`zN
^‡,¬^©l-©OOŽ¦{ÚJ(J"MIPS32/64 CPU£)
8c½|þ„kÙ§ CPU¤„k¦\öŠ§ƒU¦{öŠÈ\\ lo/hi
é¥"
ê¦ØöŠlØ)É~µ=¦´Ø± 0 Ø¬u)É~£,ù
(J´Ø(½¤"?Èì~~¬) -uÚÓ¼†Ø§AO´
"؆Ø"
„½Â - mthi!mtlo ^5òÏ^MìŠDx¦{üSÜ
Mì"ùéul¥äˆ£ž¡E hi Ú lo Š´7،§3Ød± 
Ù§/ŒUÑج^"
2.4 \1†;µÏŒª
Xc¡¤ó§MIPS k˜«ÏŒª "?Û\1½;öŠÅì-
1

ь±¤µ
lw $1, offset($2)

\Œ±^?ÛM슏8IÚ Mì" £þ offset ´˜‡kÎÒ


16 êi(ÏdŒ±3 -32768 † 32767 ƒm?ۊ)¶\1¤^§S/
Œ´ $2 M슆 offset Ú"ù«ÏŒª˜„®v  C Šó(N
˜‡¤ ( £þ´ù‡(å©/Œ¤‡(¤ ƒmål)"
1 ®²Ø2( §y3k˜«Mì\Mìόª^u2:ê\1Ú;
33
2.5. ;ì†Mìêâa. 1 2 Ù MIPS NX(
Ӟ|±¢y±~þ¢Úê|¶^æҍ½öv¼êÛÜ
Cþ¶¿·Ú ÜCþJø˜‡± gp Š¥%·Œۘm"
®?ìJø˜‡aq{ü†όª5\1˜‡3랏âU(½
½/ŒSCþŠ"
E,όª§XVMìό½¢ÚCŒª§Ñ7LÏLõ‡-
S¢y"
2.5 ;ì†Mìêâa.
MIPS CPU Œ±3˜göŠ¥C1½;˜l‡i!"© ¥æ^±
9¤-ÏP綽Xeµ
C ¶i MIPS ¶i Œ(i!) ®?ÏPÎ
long long dword 8 ld ¥”d”
int word 4 lw ¥”w”
long2
short halfword 2 lh ¥”h”
char byte 1 lb ¥”b”

2.5.1 êêâa.
i! byte ڌi halfword \1kü«ª"ÎÒ*Ѝ- lb Ú lh 
-òê⊘3 32 Mì$ §¿òp ^ÎÒ (i! 7§Œi
15)Š5W¿"ùÒ(/ò˜‡kÎÒê=†¤ ˜‡ 32 kÎ
Òê§Xe㥤«"
ÃÎҍ- lbu Ú lhu ^"5*Ðêâ§òêâŠ\1 32 Mì
$ ¥§¿^"5W¿p "
~X§bMì t1 ¥´;쥘‡ byte i!°Ýêâ/Œ§T?
˜Š 0xFE(kÎÒê -2 ½ÃÎÒê 254¤§@o
lb t2, 0(t1)
lbu t3, 0(t1)

‰1ƒ §Mì t2 Š 0xFFFF FFFE(kÎÒê -2)§t3 Š¬´ 0x0000


00FE£kÎÒê½ÃÎÒê 254¤"
þ¡£ã´ 32 CPU  MIPS Å짴NõÅìÑk 64 M
ì"(JL²´¤kÜ©i\1£$–ÃÎÒê\1¤ÑÎÒ*Ðp 32
¶ù‡1wþ%%ék^§3 2.7.3 !¥ò[)º"
áê*ÐêØӐªm[‡«O´du C ŠóŒ£‡5
¯K{¤ÏE¤"y“ C ŠóIO½Â š~²(5K5;ŒU
34
2.5. ;ì†Mìêâa. 1 2 Ù MIPS NX(
Â5"3– MIPS ùØU†Š 8 Ú 16 °ÝŽâ$ŽÅ쥧
¹ short Ú char CþLˆªI‡?Èì\ -±(êâTÄÑ
žU ÄѶù«14^ $"£‡˜‡¦^êCþ“è
 MIPS CPU þžÿ§\ATÄéÑ= CþŒ±S=†¤ int a."
2.5.2 ™éà\1Ú;
NX(¥§~\1Ú;7LéඌiUlVi!>.
MIPS
\1¶iUloi!>.\1"˜‡éšéà/Œ\1-¬—g
€"Ϗ CISC NX(§– MC680x0 Ú Intel  x86 (¢U ?nšéà\
1Ú;§£‡^‡žÿ§\ŒU¬‘ù‡¯K¶˜‡4àœ¹´\½
NŽSC˜‡É~?n§S5[ƒA\1öŠl ¦§é^r§S±ß
²——´ù¬¦§SúJ±=ɧؚ\1š~"
C Šó“è¥(²¤kêâa.Ѭ(éà"
\¯k\§SI‡l˜‡™!ŒUØéà/ŒDÑêâ
ž§MIPS NX((¢dJø ˜‡V-S£‡'ÏL˜Xi!\
1!£ !ƒ\¯õ¤"¤S-ÙöŠ4JçÏ~Ñd÷-
ulw (unaligned load word) )"8.5.1 !ò[0 "
„Jø ˜‡÷- ulh (šéà\1Œi)§dü‡\1!˜‡£ ژ
‡Å /½0öŠ-ܤ"
"Žœ¹e§C ?ÈìKIò¤kêâ?1(é৴3k œ¹
e£~Xl©‡¥Öê⽆ØÓ CPU êâ¤U k?nšéà
êêâ´7L"Œõê?Èì#N\IP˜‡êâa.ŒU´šéà§
¿¬)£'p¤Aϓè5?n——ë„1 11.1.5 !"
2.5.3 S¥2:êâ
lS¥òêâ\12:Mì==Dxêâ؉?Û)º——Œ±\
1˜‡Ã2:êâ(Ù¢Œ±\1?¿ G|Ü)§†éù êâ$Ž
ƒcجk?Û2:†Ø"
3 32 ?nìþ§ù#N\ÏL˜‡\1ò˜‡ü°Ýêâ˜\˜‡ó
êÒ2:M쥧\Œ±ÏL˜‡÷-\1˜‡V°Ýêâ§Ïd3
˜‡ 32  CPU þ§®?-
l.d $f2, 24(t1)

Ðmü‡ëYMì\1µ
lwc1 $f2, 24(t1)
lwc1 $f3, 28(t1)

3 64 CPU þ§l.d ´ý¤êâDÑÅì- ldc1 ÄÀíO


¶"
35
2.6. ®?Šóܤ- 1 2 Ù MIPS NX(
?ۘ‡„Ì MIPS/SGI 5K C ?ÈìÑòli!V°Ý2:Cþ
éàli!/Œ>.þ"32 M‡¿vkùéà‡¦§éà==´
• oNµXJ‡ 64 CPU l˜‡™3li!>.éà/Œ\1V°Ý
êâ§Ò¬€\É~"
2.6 ®?Šóܤ-
ÅìèÖå5ŒUƒ Hœ ¶,lNX(Ï·
MIPS
‚k¿©nd`²ŸoØU†^˜^-5¤ò˜‡ 32 ~þC\
˜‡M쥧´®?Šó§S ؎zgÑÄù ¡”[!"Ïd
GNU ®?ì(„k٧РMIPS ®?ì) ¬\ܤ˜ -"\I‡
˜‡ li (\1á=ê)-§®?쬟ožÿ‡)¤ü^Åì-"
ùw,´ék^§ŒUE^"k MIPS ®?ìéuNX(A
:ùX ÎÃ7‡§Ý"3Ö¥§·‚ò¦þ^ܤ-§¦^ž¬
²(Ñ", §3-L¥§·‚˜†¬²(«©Ü¤-†Åì-"
·aú´Ü¤-´^5Ï§S §5‰?ÈìAT)¤ÚÅì
“è阍-" ´3ù‡Ø{­.p§„´kNõ?Èì¢
3

Sþ)¤Ü¤-"
®?ìJøÏ)±e¡µ
• 32 á=ê\1µ\Œ±˜‡\1?ۊ()3óžOŽS
/ŒŠ)“觮?ìò¬rÙ m¤ü‡-§©O\1ù‡êâ
pŒÜ©Ú$ŒÜ©"
• lS/Œ\1µ\Œ±˜‡\173SCþ“è"®?ìÏ~
¬òù‡O†¤ü^-§k´˜^rCþ/Œp \1–žMì
-§X´˜^±TCþ$ /Œ £þ\1-",ùØ
·^u C Šó¼êSܽÂÛÜCþ§ÛÜCþ´ÏLMì½æÒ¢
y"
• éSCþ¯„µk C §S¹ Nõé static Ú extern C
þÚ^§é§‚\1/;^ü^-mŒ "˜ ?ÈXÚÏLk
$1ž|±;m ù˜:"3?È/®?ž£~„‰{´®?ìÀ
JÓ^l‡i!½˜mCþ¤ÀJ˜ Cþ§¿ò§‚˜å˜
 Œ3 64K i!±S˜‡S«", $1žXÚЩz˜‡M
ì——S.þ^ $28 Ò´ gp ——5•TS«¥m ˜"
éù Cþêâ\1Ú;y3Ҍ±ÏL˜^ƒé gp Mìό
\1½;-5¤"
3 2003/2004 cmé GNU C ?Èì MIPS à?1­#U§Ù Á1Ò´ù^
3

K"
36
2.7. MIPS I  MIPS64 ISA: 64 (ÚÙ§)*Ð 1 2 Ù MIPS NX(
õa.©|^‡µ®?ìܤ ˜@Šâü‡MìŽâ$Ž(

J5?1^‡©|-"
• Ә-{½õ«ØÓ{µ– not Ú neg ùü8$Ž§´Ï
L[´"ŠMì $0 †öŠê nor Ú sub 5¢y"\„Œ±r
˜‡n‡öŠê-¤ü‡öŠê/ª§®?ìò¬r(J‰
Ñ1˜‡Mì¥"
• Ûõ©|ò´øµ3~œ¹e§®?ìXJwÑò3©|ƒc
-£Äò´øv¯K{§Ò¬ù‰"Ϗ®?ìU wÑœ¹Ø
õ§¤±¿ØõuW¿ò´ø"k˜^®?–- .set noreorder Œ±
^5wŠ®?ì؇gģč-§ d§S <ó››"
• Ûõ\1ò´øµk ®?ì¬uÿ;\1- Áã¦^\1(J
-§XJ1{ŒU¬þe£Ä˜^-"
• ™éàêâDxµšéà\1/;-£ulh§ulw ¤U(/
ŒiÚiêâ§=¦8I/Œ´™éà"
• Ù§6Y‚µ˜ -£'X¦^ê¦{ü-¤3˜ P
 CPU þ„k  ›"XJ\^´ù P CPU§Ò¬uy®
?ìUþa"
oƒ§XJ\ýŽ‡ò®? “è£Ø3 .set noreorder pÞ“è¤
†S¥-éAå5§\I‡/χ®?óä"
2.7 MIPS I  MIPS64 ISA: 64 (ÚÙ§)*Ð
MIPS NX(glu²±5Ҙ†3¤——wÍ´l 32 ¤
 64 "ù‡¤š~^|§±—·‚Œ±r“ MIPS £ã¤ 64 
NX(5§ 32 ´Ù$¤¢y ²(½Â˜‡f8"Övkù
‰§´kA‡Ï"1˜§¢SuÐL§Ø´ù"XJù£ã§ŒU¬k
ØÖöv¦"1§MIPS ‰’.þ­‡˜‘Ò´N²w/*И‡N
X(²â"1n§ÖáÙ¢´ 32 MIPS § 5²L*¿
â) 64 "
¤±·‚æ^˜‡·Üª"Ï~·‚¬k0 32 ‡§˜ 9
[!žÿ§Ò¬ü‡‡˜å0 "± ·‚ò^ ISA “L-8NX(
"
˜ MIPS m©üC§Ð 32 MIPS CPU () R2000!R3000 9Ù
Ù U¬)  ISA уA¡ MIPS I "e˜‡2¦^ ISA CN‰
4

ù‡Ð'˜‡K¯\wvwL>K5ª(ö I6§¯¢þl5vk˜‡>K@‡¶i"Òë
4

õ¥51˜­6Q‰5õ¥­6"
37
2.7. MIPS I  MIPS64 ISA: 64 (ÚÙ§)*Ð 1 2 Ù MIPS NX(
Nõ­‡U?¿ R4000 9Ù Y¬þJø  64 ISA§¡ MIPS
III"
¦+ ISA k NõüC§–3A^ gþ(\3˜‡óŠÕþA^§
Sž¤kŒ„“è)§#-8oU •coN§|±P?nì
§S"w, 32 ISA ØU$1 64 §S¶Ød §˜ŒUk¯K ISA
‡Ò´ MIPS V§Ù¥, -3 MIPS64 ¥vk"´d MIPS V l5
vk¢y"
MIPS II Q²˜ÝÑyL§´%䊏§Ï§1˜‡¢y R6000 
 MIPS III R4000 5Øþ ‡L "MIPS II š~Cu MIPS III Ø
64 ê$Ž f8"é MIPS II ISA ù«n)3 1990 c“Q²k¤£
Þ§Š#¢y 32 MIPS CPU ˜‡ÀJ Ñy"
X·‚c¡£ãL§ØÓ ISA üC½Â ƒASN¶–½Â 3˜
‡ÉoöŠXÚ¥^r§SŒ^܍-——)2:$Ž-3S" 5

†ù -ƒA§ISA „½ÂÚ£ã ê!2:êâÚ2:››Mì"


3 MIPS32/64 ƒc§ISA ½Âњ~%ò CPU ››£?nì 0¤M
ìÚ‡ CPU ››-8üØ3 "·Øù‰kõŒ^?§,ù
du&EØv(¢Œ± MIPS \ΒMEõóŠÅ¬¶¶5MIPS IV
-86Öé\‡ )XÛé R5000 p„ ?§vk?Û^?"
3¢‚¥§?nì 0 Š‘Xª ISA ˜åüC"†ª ISA aq§
̇kü‡‡µ˜‡Š‘X R3000 ——y3Äþ®²Lž——,˜‡5
uÐ MIPS III CPU § R4000"R4000 xæ^ªy3®²Š MIPS64
˜Ü©IOz "·ò¡ùü‡©O¡/R3000 ª/Ú/MIPS32/64/ª"
3Öù˜‡Ø¬kõ'u R3000 ª?nì 0 SN"
2.7.1 uÐ 64
‘X1990 c MIPS R4000 ¯­§MIPS ¤1˜‡Ý 64 RISC N
X(¡"MIPS64 ISA ½Â 64 Ï^M짘 CPU ››Mì
6

°ÝØŽ 32 ", §¤köŠÑ) 64 (J§,k l 32


-8U«L5-é 64 êâöŠvkŸo¿Â"3 32 -ØUo
N*Ð?n 64 öŠêœ¹e§ÒO\#-"
¦+ MIPS32 CPU #Næ^k 32 2: FPU§8cŽ„vkù
‰"MIPS32 Ú MIPS64 CPU Ñæ^ý 64 2:Mì FPU§˜gØ2
I‡˜éMì5NB˜‡V°ÝŠ"ù‡*ІP MIPS I .£k 32
‡ 32 Mì¤é¦^ùwþДk 16 ‡ 64 Mì¤ØoN§¤±3
CPU ››Mì¥k˜‡ªm'Œ±˜¤4Mì1† MIPS I ˜
5o´Œ±EÑvk¢y2: CPU"
6 R4000Ú 5 MIPS64 IO¿Øz©ƒzoN§´éC§·‚!r­:˜3
MIPS32 Ú MIPS64 «Oþ"

38
2.7. MIPS I  MIPS64 ISA: 64 (ÚÙ§)*Ð 1 2 Ù MIPS NX(
±B#N^P^‡"
2.7.2 XI‡ 64 º
 1996 c§32 ®²ØUJøv Œ/Œ˜m‰˜ ãŒóŠÕÚÑ
ÖìA^§S"q%<¬˜—@§S5±êO§z 18 ‡†
mҀ˜"Uìù‡O„ݧé/Œ˜mI¦±zc ‡ O"ý 3

CPU(68020, i386)Ñy¿“ 16/20 Åì´3 1984 cc ——(¢


4
32
32 3 2002 c†mýwØv "XJù‡êâ4·‚ú MIPS 1991 c
ÞÄØ ¤Ù§½N´é——MIPS Œ|±ö SGI † 1995 câí2
Ù1˜‡ 64 öŠXÚ"
žk˜«ïÄ@§ ¦˜‡é–Œ±3é˜ãžmSÏLÙJ
[/Œ5·¶§öŠXÚA¦^Œ‰ŒDÕJ[/Œ˜m"MIPS @Ï
ؤÙÞÄÒ´É T‘ïÄr¦"3öŠXÚuЄݤТ
Å¥§' MIPS ¶Œk<3"Intel Ú£­. 32 CPU§3 Windows
95 öŠXÚò 32 $Ž‘\Œ¯½|ƒc§ÒØØ– vv 11 c"
64 NX(˜‡ë‘A:Ò´OŽÅ˜gŒ±?nõ §ùŒ±
\„˜ ã/Úã”?n¥êâ—8.A^§S"ƒéu± Intel  MMX 
“LõxN-*¿§ù«‰{´ÄŒÿ™Œ" öÏL˜|#\
°Mì\° êâϧ¿U 3\°êâþӞ?nõ‡üi!ê
â½õ‡ 16 êâ"MIPS  DSP ASE †dk aq——„N¹B.2!"
 1996 c§?ۘ‡Ž‡Ï¦uÐNX(ÑI‡kƒA 64
¢y"½N@:¢y 64 OŽØŽ˜‡€¯"
MIPS NX(†)è5U5——æ^²"/Œ˜mÚÏ^Mì
^Š——¿›X 64 ÏŒÚ 64 M촃Š"=¦3^Ø 64 °
/Œ/§Mì°Ý† ALU °ÝO\é?nŒþêâ§Sš~k
^§ù3ã/?n½p„Ï&A^¥´é~„"
‰ MIPS NX((±9Ù§˜ {ü RISC NX()‘5˜‡F"
Ò´?\ 64 ò¦©ã£=¦3 64 ‡¥§©ãE,´ x86 Ú PowerPC
NX(˜‡Kú¤CÎÃ7‡"
2.7.3 'u 64 † CPU ªƒ†µMì¥êâ
ò˜‡ CPU *Ð#+IO‰{Ò´§éȱc DEC úil PDP-11
,? VAX !Intel úil 8086 ,? i286 Ú i386 žÿ¤^{µ3#
?n쥽˜‡ªƒ† §T ˜ ž§Ò4?nìÒLyÑÓÙc“
¬˜1"
´ªƒ†´˜«n܉{§ 3vk‡“èÅ쥢yå5é
J"MIPS64 r , ˜^´µ
39
2.7. MIPS I  MIPS64 ISA: 64 (ÚÙ§)*Ð 1 2 Ù MIPS NX(
• 3¤k 32 NX(-"
• ‡´==$1 MIPS32 -§Ò‡y 100% oNµ§S1
ƒÓ§z‡ MIPS64  64 Mì$ 32 ˜Š†ƒA MIPS32
Mì3džŠƒÓ"
• ½Â¦ŒUõ MIPS32 -§±BQU±oN5qU^‰ 64 -"

3ùp§' û½(\˜Ùù‡¯K §Òé{ü)´§$13 MIPS32


oNGež§Mìp 32 T˜ŸoŠºÀJ´kا{ü q
ýk¿ÂÒ@oA‡"
·‚Œ±{üû½Mìp 32 ´™½Â¶$13 MIPS32 oN
ªež§Mìp 32 Œ±¹k?ÛÎ-Ê"ù‡{¢yé{üØ
U÷vþã1n:µÿÁÚ^‡©|-(I‡ÿÁM슴ă½ö
K§wp —— 31 ½ 63)I‡ˆgØÓ MIPS32 Ú MIPS64 ‡"
1«‡Ð Y´§$1 MIPS32 -ž§Mìp ±"¶
´ù«{Ó‡¦éKêÿÁÚ'-\"„k§MIPS64  xor -
3ü‡p "ŠþöŠž§ØUg,)˜‡p "Š"
1n«§´ÐY´òMìp 32 †1 31 ˜"XJ(=
$1 MIPS32 -ž)·‚yz‡Mì˜X($ 32 Š¿ p 32
´1 31 E›§@o¤k MIPS64 'ÚÿÁ-ц٠MIPS32 ƒ
A‡oN——¤±·‚Œ±UY¦^ù - MIPS32 ?è"¤kÅ
Ü6öŠ-ÓU^£é 32  63 §·^é 31 ÓöŠ¤"
ù‡(/¤õ\À{Œ±ù£ã§òMì¥ 32 ŠÎÒ*
Ð 64 ¶5¿ù«{¿vkÄT 32 Š´kÎÒ„´ÃÎÒ"
æ^ù‡Y§MIPS64 I‡#O{üŽâ- 64 ‡£MIPS32 
addu -§‘ 32 Äў§7L3$ 32 ˜ÄÑ(J§¿ò1 31
E›p 32 ——ù† MIPS64 \{ؘœ¤"„I‡#O 64 ;ì\
1Ú£ -§´O\Øõ" 64 êâI‡˜‡#-ž§Ù-Ï
PÎO\˜‡”d”L«”double”§)¤– daddu!dsub!dmult Ú ld ù¶
i"
чزw´®k 32 \1- lw§y3(ƒ¿g´\1˜‡‘
ÎÒi§ÏdÚ\˜‡#p "*Ð lwu -"du|±-yk
ˆ«CNI‡§±9(3~ê£ -œ/) |±æ^ØÓöŠè±{ø
MIPS32  5 £ þ›I‡§#O-ê8„¬?˜ÚO\"
1 8 ٍ[Ñ ¤k MIPS64 -"

40
2.8. Ä/Œ˜m 1 2 Ù MIPS NX(
2.8 Ä/Œ˜m
?nìé/Œ˜m¦^Ú?nÚDÚ CISC CPU kX‡©Ø
MIPS
Ó§·‚ù˜:N´Úå·Ï"žc[Ö!1˜Ü©"·‚òlÐ
 32 m©§, 20 64 ——F%:\¬²xŸoù‰"
kw˜ ÄK"3 MIPS CPU p§\3§S¥/ŒýجÚ
¡Ôn/ŒƒÓ£kžCz駿؃Ӥ"·‚©O¡ƒ§S/Œ Ú 7

Ôn/Œ"
˜‡ MIPS CPU Œ±$13ü«A?ƒ˜þµ^rªÚØ%ª "{ 8

ü儧·‚~`^rÚØ%"´ MIPS NX(˜‡A:Ò´lØ


%^rCz¿ØUCöŠ1§´kž, öŠ@´š{"
3^r§/Œp ˜?Û§S/ŒÑ´š{¿¬—g€"„k§k
-3^rò¬—É~"
3 32 e£ã 2.1¤§§S/Œ˜my©oŒ«§z‡«k˜‡DÚ
£vk¿Â¤¶i"Šâ/Œ¤?«ØÓ§?nØÓµ

ã 2.1: MIPS ;ìNµ32 œ/


3ù‡¿Âe§§S/ŒÚJ[/ŒƒÓ——-´éÐõ<5`J[/Œù‡c4<Ž
7

NõE,öŠXÚ¯K§†·‚ùp?ØÃ'"
3 R4000 ±  MIPS CPU k1n‡+nª¶´î8Ž¤k MIPS OS ÑÑ+n
8

ª§·‚õêžÿòѧ"

41
2.8. Ä/Œ˜m 1 2 Ù MIPS NX(
$à 2G)µù /Œ´^rŒ^/Œ"
kuseg 0x000 0000 - 0x7FFF FFFF (
3k MMU Åìp§ù /Œò˜V=†£ë„1 6 Ù¤"ؚ MMU
®²˜Ð§ÄKØAT¦^ù /Œ"k © òùÜ©¡”useg”§
AO´3£ã^r§Sw/Œ˜mžÿ"ÖØ2æ^”useg”"
éßvk MMU Åì§ù /Œ1†äN¢yÅìƒ'"äN CPU
Ãþò¬Jøk'ù¡&E"XJŽ‡\“èU £‡Ã
MMU ?nìþ§½öU 3ØÓà MMU ?nìm£‡§A;
¦^ù¬«"
kseg0 0x8000 0000 - 0x9FFF FFFF(512M): ‡rp ˜"ù /ŒÒ¬
=†¤Ôn/Œ§NëY$à 512M Ôn/Œ"Ϗù«=†4
{ü§~~¡ùã/Œ/š=†/«§Ù¢Ø,"
T«/ŒAo´‡ÏLp„ 5§¤±3p„ ·Щ
zƒc§ØU¦^"ù‡«3à MMU XÚ¥^5˜Œõê§SÚ
êâ¶3k MMU XÚ¥^5˜öŠXÚØ%"
kseg1 0xA000 0000 - 0xBFFF FFFF(512M): ù /ŒÏLrpn ˜"
{5NÔn/Œ§­EN $à 512M Ôn/Œ"´ù˜
gزLp„ "
kseg1 ´˜3XÚ­éžU~óŠ/Œ˜m"ù´ŸoE
ž\:£0xBFC0 0000¤˜3ù‡«"\:ƒAÔn/Œ´
0x1FC0 0000 ——rù˜:wŠ\M‡ó§“ " 9

Ïd‡¦^ù‡«Щ§S ROM¶Œõê<rT«^Š
I/O Mì"XJM‡O< JƇrù ÀÜNÔnS$
512M ˜mƒ §\!{¦"

kseg2 0xC000 0000 - 0xFFFF FFFF (1G): ù¬«U3Ø%e¦^¿


‡²L MMU =†"3 MMU ˜Ðƒc§Ø‡T«"ؚ\3
˜‡ýöŠXÚ§ÄK5`vknd^ kseg2"
kž\ŒU¬wT«©¤üŒ§©O‰ kseg2 Ú kseg3 §¿3r
NÙ$ŒÜ© (kseg2) Œø$13+n§S¦^"‡´\ýkŒU^
+nª{. . .
2.8.1 {üXÚό
§S/Œl5جÚÔn/Œ{üƒ"éß{üi\ª^
MIPS
‡ óŒU^ kseg0 Ú kesg1 /Œ§§‚ÚÔn/ŒkXš~{üN'
X"
\M‡ó§“ج´1˜‡r ROM ˜uÔn/Œ 0xBFC0 0000 , uyXÚÃ{éÄ
9

<"
42
2.8. Ä/Œ˜m 1 2 Ù MIPS NX(
l 0x2000 0000 £512M¤m©•þÔn/Œ˜m3þã{üœ/evk
?ÛN§Œõê{üXÚ¤k/ŒÑN 512M ±e"´XJýI
‡§\Œ±ÏL˜;ì+nü£TLB¤ª§½ö¦^ 64 CPU 
˜  ˜m§5 512M ±þÔn/Œ"
2.8.2 Ø%†^rA?
3Ø%A?e£CPU éФ§Œ±Š?Û¯œ"3^re§2G£p
˜ ¤±þ§S/Œ´š{§¬—€\É~"5¿´§XJ CPU
k MMU§ù¿›X¤k^r/Œ3ýˆÔn/Œƒc7L²L MMU
=†§l ¦öŠXÚkU匱“Ž^r§S”››/ÏÀÏE"Ӟ
¿›X阇$1Xvk/Œ=† OS  MIPS CPU 5`§^rA?Ù
¢´õ{"
, §3^re§k -——AO´öŠXÚI‡@ CPU ››
-——´š{"
‡5¿´§\UCØ%/^rA?ª ž§¿ØUCé?Û1
)º——==¿›X, õU3^reØ#N "3Ø%e§CPU Œ
±$ /Œ§ÒÚ3^r˜§¿ /Œ´‰Ó=†"
„‡5¿´§¦+fþЖ´3`“Ø%´öŠXÚ^§^r´
F~{ü“è^”§´¯¢†dƒ‡"k {üXÚ£)Nõ¢žö
ŠXÚ¤ܓèÑ´$13Ø%e"
2.8.3 㔵64 /ŒN
/Œo´ÏL˜‡MìŠ\þ˜‡ 16  £þ/¤"3 64
MIPS
MIPS CPU p§Mì¥o´ 64 Š§ÏdÒk 64 §S/Œ"ù
ãŒ/Œ˜m#N·‚3y©/Œ˜m´Œ±Ã¤R§lã 2.2 ¥Œ±w
/Œ˜m´Ny©"
Äk‡5¿´ 64 ;ìN–´¹3 32 N–p¡"ù´‡Û%
E|——Җ5Dr. Who6¥ TARDIS§p¡‡' ¡Œõ—— 6
u·‚3 2.7.3 !5K5¢yµ[ 32 -8žÿ§M옴
32 Š 64 ÎÜ*Ð"ù(JÒ´§32 §SŒ± 64 §S˜m
$ځp 2 GB"¤±*ÐN”r/Œ˜m$ځp«©‰Ú 32
e˜^å§*Ð/Œ˜m uùüöƒm"
ŒŒ*Ð^rÚ+n/Œ˜m3¢SA^¥ØŒUkŒ^?§
ؚ\3¢y˜‡J[;öŠXÚ¶ÏdNõ MIPS64 ^rE,r
½Â 32 8I/Œ"@ Œ¬ÃI/Œ=†ÔnSIŒ±^u
ŽÑ kseg0 Ú kseg1  512M ›§´Œ±ÏLé;ì+nü£ TLB
¤?§5ˆÓJ"
43
2.9. 6Y‚Œ„5 1 2 Ù MIPS NX(

ã 2.2: 64 ;ìN
2.9 6Y‚Œ„5
?ۘ‡k6Y‚ CPU M‡éß@ ØU÷v‡ž¨±Ï5
KöŠÑò¬3žmò´"NX(Oö‡ÀJù Ù¥=˜ £X
Jk{¤ò´é§S ´Œ„"ÛõžSA5{z §S é CPU ?§
.§ùòE,5\ M‡¢y< þ"òžSNݯK3‰§S Ú
^‡óä{z M‡¢y§Ӟq¬‰^‡muÚ£‡‘5¯K"
·‚®²JLAg§MIPS NX(4˜ 6Y‚A:´Œ„§r?Ö
‰§S ½ö?ÈìKI"e¡A:o( 'u6Y‚JŒ„œ/µ
• ©|ò´µ3¤k MIPS CPU p§;‹X©|- -£=©|ò
´ø¥-¤=¦a=¤õ¬‰1"§S ½ö?ÈìAéј^
k^½ö–´Ã³-W¿ò´ø—— œ/´Wþ nop "
´§Øš²(½§Òë®?쏬Ûõ©|ò´"
3 MIPS II -8¥Š˜‡ŒÀ‘Ú\/ŒU©|(branch-likely)0
-¥§ò´ø¥-=3©|Éœ¹e‰1¶^T-œ
/Œë„ 8.5.4 !"

44
2.9. 6Y‚Œ„5 1 2 Ù MIPS NX(
• \1ò´µ·ŽØå5k?Û MIPS CPU Ù¥;‹3\1ƒ -
U vkò´/¦^ff\1êâ" 10

´`z?ÈìÚ§S oAT˜‡äN CPU I‡õžmr


êâOÐU^——=\1–¦^ò´"\3¦^ò´K5
U§M‡Oö¬‰NõóŠ±(êâU3C1 ee˜^-Œ
^"
• 2:ê(?nì 1)¯Kµ2:$ŽAчs¤õ‡ž¨±Ï5¤§
;. MIPS FPU M‡Ï~kõ‡ƒéÕá6Y‚܇"MIPS M‡7
Lr FPU 6Y‚Ûõå5¶#N2:OŽ†Ù Y-¿1‰1¶
˜‡-Ö˜‡ÿ™¤2:OŽ(JM잧CPU Ò¬{l"
ý­þ?`zI‡?Èìk-­E'ÇLڈ«8I CPU ò´
L"´§\ŠجŽ‡\§S$16ù "
• CPU ››-¯Kµù‡Ü©´I‡&­é–/"\UC CP0 
'X CPU GMìSNž§\d3/Ku)36Y‚¤k
ãÀÜ"
k MIPS32/64 £–1‡¤ƒ §œ¹Ðõ "† CP0 p©
¤ üÜ©"@ c˜‡ CP0 öŠŒU¬K ˜‡-œ/
´æ†§¡ƒ-‘x(instruction hazard)¶Ù{œ/¡‰1
‘x(execution hazard)"‘ƒÒJø ü«ØÓº‚‘x“o(hazard
barrier) -µ˜^·Üu‰1‘x“o-§±9U4\u-‘x
eZ^Or©|-"XJ3)öڞ¤öƒm˜þÜ·‘x“
o-§ÒUU y\ØÉÜ©¤ CP0 BŠ^K"ë1 3.4
!"
3 MIPS32/64 1‡ƒc§† CP0 ‹?Ö‰ Åìƒ'
A5"vkªJøŒ^‘x“o-§§S 7LÖ CPU Ãþ
±éÑN\þv õW¿-±( CP0 ››BŠ^kv žm
DÂ"

3éP MIPS I CPU p§‡d§S ½ö?ÈóäKISü˜^˜öŠ no-op§´\N


10

[ØI‡2ú%ù«œ¹ "
45
1 3 Ù ?nì 0µMIPS ?nì
››
Ø Ï~$ŽõUƒ §?Û?nìÑI‡˜ ܇5?n¥ä!˜
À‘±9I‡,«Å›5i›ÃX¡þp„ (cache)Ú½žìõU" ISA
é$Ž-8?nªé¤ §‰ †¢yÃ'¶´é?n웛„Ž‡
‰@o¤ ŒÒJ "
XJ·‚rØÓõU©AÙp©O0 §\‚ŒUWu´u
É"·‚e¡Ò´ù‰"´30 ƒc·‚k7‡k )˜e¢yù
A5úś"3>9Ö YnÙSNƒc§ïÆÖök‡c[Ö
Ù1˜Ü©¶AO‡5¿e˜0 ?nì˜c^{"
` ùoõ§@o. MIPS CPU þ?nì CP0 Z ŸoóŠQº
• CPU ˜: MIPS M‡~~´é(¹§sŒ±ÀJ CPU ̇A5£~
X1 10 Ù!¤ã—ध½öUCXڝ󊐪"ù À‘›
›ÚŒ„5d˜‡½õ‡SÜMìJø"
• p„ ››: MIPS CPU o´8¤ p„ ››ì§Ø P
¡ Ñ8¤ p„ "CP0  cache -^5——±õ«ØӐ
ª——öpp„ êâ¬"·‚ò31 4 Ù?Øp„ "
• É~/¥ä››: É~½ö¥äu)ž1±9N?n§Ñ´d CP0
››MìÚA^Aύ-5½Âڛ›"ù31 5 Ù?Ø"
• ;+nü››: 31 6 Ù?Ø"

• ,‘: okõÀܵ½žì!¯‡Oêì!Ûó!†Øuÿ"
z#OõU8¤ CPU p>§ØU2B/Š –¯ž§ù
pÒ¤§‚8á"

46
1 3 Ù ?nì 0µMIPS ?n웛
MIPS é?nì˜cAÏ^{
?nì˜cÏ~^5L«?n @ϧXÚøAûÎÃ~ /ÑJ
옇ŒÀ܇§KI?n-8 ø˜‡½›öŠXÚSاù
,‡*Ð"MIPS IO-8Ñ ¢ CP0 CzI‡éS؉ƒA/?
S CPU I‡éõõU§´õ U——´=uSض¿ØKA
ˆo‡?nìý3 öŠèڃ ^§SoN5"¤±l MIPS I 
A-" MIPS V § CP0 õUÑ@´
Ù¥ƒ˜£?nì 1¤´2: 6uäN¢y"
?nì§ùÒ´ýú@¿Âþ œ¹®²Ø2Xd "y3kõ
?nì" ‡ìN3 MIPS ïöŠXړè§
,˜‡£?nì 0 ½ö` CP0¤ ‡´öŠXÚ3ØÓ MIPS CPU ƒ
´ MIPS ¤¢Xڛ›?nì§Ù m„7L‡£‡â1{§@Œý
-é?n^r§S Iƒ ¤ 4<ÞD"¤±#IO MIPS32 Ú
kõUÑ´7،¶ù´Ù? MIPS64 ¿©[/½Â CP0 M
ØÌK" ìÚõU§±Bv Œ£‡
?nì 0 ´ØUÕá3§ù öŠXÚ"
¿Ø´`§´ŒkŒÃ——'`§ „´£NX(þ5µ3o‡
\،UEј‡vkGMì ?nì?è˜m¥§ CP3 ®²
MIPS CPU"§(Jø ˜«é–¯ MIPS32/64 2:-‰Ó§y3(
GMì-?1?èIO &ýéج¢y2:žÿâU¦
{"ù=¦GMì½Â3ØÓ ^"CP2 „´Œ^§ó^u½›
 MIPS ¢yƒmu) Cz§–Œ  ISA *нö3A‡ SoC A^¥J
±yÓ®?§S„U3Czc ø;^Mì" CP1 Ò´2:ü
ü« CPU þ^" g"
=^u OS ?n 0 õUk
¿/l MIPS ISA lm5"3 MIPS
·‚¬3Ù ŒÜ©o(¤k3 MIPS32/64 CPU ¥UéÀÜ"
´6ž4·‚krù õU˜˜>§ww^u¢yśj"MIPS CP0 -
ê¿Øõ——‡ŒU§é CPU . ››Ñ´éAÏ CP0 Mì 
Ö¢y"
L 3.1 0 CPU ››MìõU"L¥Ñ ÎÜ MIPS32/64 IO
7½‡¢yz‡Mì§d „kA‡~„ŒÀMì"
ùØ´˜‡L¶Ù§M소À-8*УASE¤k'§½
ö† MIPS32/64 OŒÀA5k'"
d §MIPS CPU ŒU„¬k˜ †äN¢yƒ'Mì——ù´‰N
X(O\#A5í‰{"žëäN CPU Ãþ"
47
1 3 Ù ?nì 0µMIPS ?n웛
 ;3ù‡žÿÒ4\€\˜æ[!§·‚ü ˜!µ3.3 !§;
€ùãUì MIPS32/64 5½7Lä CP0 Mìz˜ [!"XJ=
éT! ¡Ù!k,§y3Œ±6žaL@˜!"
·‚ù Mìžÿ§k0 Ú k1 £Ï^Mì $26–27¤Š˜J"ù
´ü‡£d^‡½¤ý3e5^uÉ~?n“è¥Ï^Mì"ý3–
˜‡Ï^Mì´7‡¶ äNý3=˜‡K´‘¿§ý3Mì7L
´¤ky MIPS óäÚ?›§S¥ÑÉ"
L 3.1: MIPS CPU ››Mì
MìÏPÎ CP0Mì?Ò £ã
SR 12 GMì(Status Register)§˜‡~5Ä
þdŒ›› |¤")(½ CPU A
?!= ¥äÚ ¦UÚÙ§CPU ª
"
Cause 13 ŸoÏ—É~½ö¥äº
EPC 14 É~§SOêì£Exception Program Counter¤µ
É~/¥ä(å l=p­#m©‰1"
Count 9 ùü‡Mì˜å/¤ ˜‡{ü k^p
Compare 11 ©Eǽžì§ªÇ£Ï~¤ CPU 6Y‚ª
ǘŒ"
BadVaddr 8 —C/Œƒ'É~§S/Œ"=¦v
k MMU§ˆ«/Œ†ØÑ¬˜§"
Conext 4 é;ì+nÚ/Œ=†M‡(TLB)?§M
EntryHi 10 ì§ù31 6 Ùù"
EntryLo0–1 2–3
Index 0
PageMask 5
Random 1
Wired 6
PRId 15 CPU a.ڇÒ"a.Òd MIPS úi+
n§£–¤ CP0 Mì8CĞAØÓ"
L 3.3 ¥Ñ  2004 c¥Ž^LŠ"
Config 16 CPU ë꘧Ï~dXÚû½¶˜ Œ§,
Config1-3 16.1–3 ˜ Ö"k CPU kp?Ò;^Mì"
Ebase 15.1 É~\:Čڗ—õ CPU XÚ——CPU
ID"

48
3.1. CPU ››- 1 3 Ù ?nì 0µMIPS ?n웛
L 3.1 Y
MìÏPÎ CP0 Mì?Ò £ã
IntCtl 12.1 ˜¥ä•þÚ¥ä`k?
SRSCtl 12.2 KfM웛§ë„1 5.8.6 !"
SRSMap 12.3  CPU ¦^“•þz¥ä”A5žÿ§l‡K
fMì?Òl‡ŒU¥äσmN
"
CacheERR 27 ©Û($–ŒU¡E)S†Ø§·^u3ê
ECC 26 âÏ´þ¦^†Øè CPU"[&Eë
ErrorEPC 30 „1 4.9.3 !"
TagLo 28.0 ^up„ ››Mì§1 4.9 !¬ù"
DataLo 28.1
TagHi 29.0
DataHi 29.1
Debug 23.0 ^u EJTAG NÁüMì§31 12.1.7 !
DEPC 24.0 ù"
DESAVE 31.0
WatchLo 18.0 êâ* :óä§ CPU Áã3T/Œê
WatchHi 19.0 ➬u)É~——éNÁkd3^å§ë
„1 12.2 !"
PerfCtl 25.0 5UOêMì£ YÛóҌ±ÀJõ
PerfCnt 25.1 ››/OêMìé¤"ë„ 12.4 !"
LLAddr 17.0 k CPU (̇´@ ‘k˜—5 ½öõ
‚§*Ð CPU¤˜˜‡† ll(load-linked) 
-ƒ'/Œ¶/Œ\ ´Œ„§,k
ä^‡â¬Ö§"ë„1 8.5.2 !"
HWREna 7.0 ˜‡Œ ã§û½= M‡M쌱
^r§S–¯——ë„1 8.5.12 !"

3.1 CPU ››-


kA^AÏ CPU ››-^u¢y;+n§·‚rù 31 6
Ù"MIPS32/64 ½Â ˜| cache -5¢y+np„ 7L¤köŠ§
ù31 4 Ù¬¥0 "
Ødƒ §MIPS CPU ››I‡éA^-"klژ–¯·‚fâ
Ñ@ Mì-m©µ
mtc0 s, <n> # rêâDx?nì 0

49
3.1. CPU ››- 1 3 Ù ?nì 0µMIPS ?n웛
ù^-r CPU Ï^Mì s SNDx?nì 0 Mì n§êâ
32 £=¦3 64 CPU p§éõ CP0 M쏐k 32 §éuê
CP0 Mìk˜^ dmtc0 -¤"ù´˜ CPU ››M썘{"
 MIPS ffÑyžÿ§õŒ±k 32 ‡ CP0 Mì"´ MIPS32/64
Œ±#Nõˆ 256 ‡Mì" ±-•coN§ù´ÏL3 CP0 Ò£¢
Sþ´-¥±c?è"¤ N\ 3  select 5¢y"ù mtc0
s, $12, 1 Ò)º“register 12§select 1"”·‚‰ 12.1"
3®?§Sp†Ú^››Mì?Ò5´ØûS.¶Ï~AT¦^L
3.1 ¥ÏPÎ"Œõêóäórù ¶i½Â3˜‡ C º‚ include ©‡
p§, ^ C ý?n슏®?ìcà¶ëó䝩 éÑäN‰{"
,© MIPS IOkƒKå§´éù Mì·¶„´ˆkØ
Ó"Öò˜†¦^L 3.1 ¥ÏPÎ"
l CP0 ››Mì¥ÑêↃƒ‡µ
mfc0 d, <n> # l?nì 0 Ñêâ
Ï^Mì d C\ CPU ››Mì n Š"ù´w››M슍˜
{£aqk˜‡ dmfc0 CN^uê 64 °Mì¤"ù§XJsŽ‡
#››MìSÜü‡——'X`——GMì SR j§Ï~“è´ù‡
fµ
mfc0 t0, SR
and t0, <‡˜" ‡è>
or t0, <‡˜ 1  >
mtc SR, t0

››-8 ˜‡­‡Ü©´˜«žØÉ~J{"·‚¬31 5
ٍ[?ØÉ~§Ä¯K´z‡¢y?ۘ«SöŠXÚ CPU ч
Ó¡é¶ù‡¯KÒ´É~Œ±3$1^r($A?)“èžu)§´É
~?n$13pA?" ÏdlÉ~ˆ£^r§Sž§CPU I‡;mü«
1

ºxµ˜¡§XJ3››ˆ£^r§SƒcA?Òü$ §êþҬϏŠ
‡A? ˜‡—·gÉ~¶,˜¡§XJ3ü$A?ƒck£
^r“è§@o˜‡¿ÃA§SÒkŒUŬ±SØA?$1
˜^-"l?§Ýw5§ˆ£^rÚUCA?öŠ7L´ØŒ
©£^OŽÅ1{5`§Ò´f¤"
3Ø Pƒ §¤k MIPS CPU Ñ´^- eret 5¤ù‡?
Ö£3@ ”D®È© CPU þ§I‡˜^=£- ˜^ rfe Šò´
ø¤"ù‡¯K·‚31 5 Ùò[?Ø"
1^^‡>uÉ~——XÚN^——Š^r“螦£$13pA?þ¤öŠXÚSØ
Ñ֍˜Å›§A´¤k CPU Ï^‰{"

50
3.2. Ÿožÿ‡^= Mìº 1 3 Ù ?nì 0µMIPS ?n웛
3.2 Ÿožÿ‡^= Mìº
3e¡ù œ¹\I‡Úù M싵
• þ> µI‡˜ SR 5¦ CPU ?\˜‡ŒóŠG§±BU ^|
‰1‘ ÚL§"M‡Ï~‰{Ñ´3E 4NõMì 
™½Â"
Ø @σ §MIPS CPU Ñk˜‡½öõ‡ Config MìµConfig
Ú Config1-3"k CPU ŒUõ§k˜ ;^£Config7 kž^Š
‰äN CPU ;^¤"
1˜‡ Config MìkA‡ŒŒUI‡k˜§ÄK‰Ø õ
¯œ"žÚsM‡ó§“ûþ§(@ CPU ÚXÚéu˜Mì
˜ˆ¤˜—§–Œ±éÄUù Mìù˜Ú!
• ?n?¿É~µ3@Ï MIPS CPU ¥?ÛÉ~£Ø ˜‡AÏ MMU
¯‡ƒ ¤ÑN^˜‡½\/Œú/Ï^É~?n§S0"´
g@± éõcm§k5õnd|±éØÓ8¦^©mÉ
~?n§S¶ë„1 5.3 !"
3É~\?§Ø?Û§SM짐kˆ£/Œ3 EPC"MIPS
M‡éuæҘä"3?ۜ¹e˜‡SöŠXÚPkAÉ
~?n§SØUb½^r?“è(5——AO/§§ØUb½Ò
k½öҘmŒ^"
\–I‡^ k0 Ú k1 ¥˜‡5•É~?n§Sý3˜ S˜
m", Ҍ±Àܧ7‡ž„Œ±^,˜‡5l››MìCê
â"
ÏL w Cause M쌱éÑu)´=«a.É~¿‰ƒA?
n"
• lÉ~ˆ£µ››ª7Lˆ£3É~\? EPC ¥/Œ"
Ø+´ŸoÉ~§ˆ£žÑ‡r SR MìN£5Š!¡E^r
A!#N¥ä±9žØÉ~˜„K" §É~ˆ£- eret Ü¿
¤ ˆ£^r˜mÚE SR(EXL) õU"
• ¥äµSR ^5N¥äùè§û½= £XJk{¤¥äDƒ'c
p`k?"M‡vkJø¥ä`k?§´^‡Œ±‘¿"
• X{ ÚuÉ~-µù -~^u£XÚN^!ä:NÁ±9,
-•ý)"¤k MIPS CPU Ñ¢y break Ú syscall -¶k
¢y„\  -"

51
3.3. CPU ››Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?n웛
3.3 CPU ››Mì9Ù?è
››Mì?è
`ùpk7‡é3`²˜ /reserved0½ö/x0¶ùžÒ‡%
e"Nõ™^››MìI §ù [A\"½ö\c
P/00"ù p yÖя ¡ÖÑŠ§ØA@ÖÑŠ˜
"§\vkŸo³?£,\ ½´"½öÙ§äNŠ"
Š¬Ѥ",˜ 3IP
ù˜!ù㛛M삪¿V‡£ãˆ‡õU"Œõꜹe§Œ
±3 ¡A!鍍[SN"·‚rk';+nMì31 6 Ù§r
=^up„ +nMì31 4 Ù§@p·‚ò¡/ù)p„ "
5¿äN CPU ŒU¬3, M쥽˜  "ùpQã‡
o´ MIP32/64 r›5½Ñ7Lk§‡o´wþéÏ^"
3.3.1 GMì£SR¤

ã 3.1: SR£G¤M숇
MIPS CPU k4A‡ª ¶=kA‡½Â3pÝ;nGM
ì SR ¥§Xã 3.1 ¤«"ù´ MIPS32/64 IO½ÂÜ ¶k ˜{
Œ^uäN¢yƒ'^å"
·‚2grN§MIPS CPU pvkØ?1/Œ=†( nontranslated )½öØ
?1p„ £ noncached ¤ª¶´Ä?1/Œ=†½ö²Lp„ ´§
S/Œû½"
e¡´' úk¶#¢y¥r?ۘ‡^u?ÛO^åÑ´éØÐ
§ly3Œ±ý„ò5ù ^{éŒUÑجCz"
CU3–0 z‡©O“L?nì 3–0 “?nì¦U”"?nì 1 ´2:?
nü FPU ——˜ 1 “Lk2:?nì¿ ¦^§˜ 0 K“L
BŽ FPU" 0 žÿ§¤k FPU -Ѭ—É~"vk2:M
‡žr§ 1 w,Ø1¶k2:M‡ž£ 0¤'K2:܇ŒU¬
k^" 2

ŸoÐÐ2:܇‡'KQºk öŠXÚé¤k#?ÖBŽ2:-¶T?ÖÁã
2

¦^2:ž§öŠXÚ¬Ó¼É~¿§¦U2:܇"ù§·‚Œ±«©Ñ@ lئ^2
:?Ö"3?փ†ž§·‚ØI‡@ ?ÖÚ¡E2:Mì§ùŒ±3' þe
52
3.3. CPU ››Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?n웛
RP ~õÑ£reduced power¤——äNN‰ûu CPU"'X§Œ±ü$
CPU $1ªÇ!>ؽöӞü$ö"äNœ¹žÖ CPU ÃþÚ
\ÎXÚO< "
FR ªƒ†µ 1 KÜ 32 ‡V°Ý2:Mì^‡ÑŒ„¶ 0
4§‚[ MIPS I ¤é 32 2:Mì1"
RE (‡=^re—à˜)µMIPS ?n쌱3E ž˜?ۘ«
—à(XJزxŸo¿gžë„ 10.2 !)"du<‚o´é‰§y3
MIPS ¢y©¤ ü‡­.µDEC Ú Windows NT ´—à¶SGI Ú§
‚ UNIX ­.´Œ—à"i\ªA^Ðwr–•uŒ—à§
y3®²”.· "
U$15g,˜‡/­.0^‡éuöŠXÚ¬´˜‡k^A5¶RE
¦ù¤ŒU" RE kž§^r^‡$1å5ÒЖ CPU ´
˜ƒ‡—à˜", §ý‡ˆª/­.0$1I‡^‡þ‰
éŒãå§8cŽ„vk<‰L"
MX ¦U DSP ½ö MDMX ASE£-8¤——Ә‡ CPU ،UüöÑk"
3ÖŠž§DSP ASE „ƒ#§ MDMX q"yóäóÚ¥m
‡|±"
PX ë„e¡é SR(UX) £ã"

BEV éĞÉ~•þµ BEV==1 ž§CPU æ^ ROM(kseg1) ˜mÉ~\


:(ë„ 5.3 !)"$1öŠXÚp§BEV Ï~˜ 0 "
TS TLB '4µ[&Eë„1 6 Ù"3, CPU þ§XJ˜‡§S/ŒÓ
žšü‡ TLB L‘£ù´öŠXÚ^‡Ñ ,«î­†ØI“¤§TS
Ò¬˜ 1"3˜ ¢y¥§3ù«GeöŠLÈkŒU—SÜ¿
 ›€¡§¤± TLB Ò¬'4 ʎš?Û/Œ"TLB '4´˜
‡ØŒ_L§§˜ '4§kM‡E âU˜Ø"
˜ MIPS CPU  TLB M‡›©{üÏ Ø¬Ñyù«œ¹§ùÒØ
^¢yù˜ §,˜«‰{Œ±´L²Áã\­EL‘1{
Ž "žë\ CPU Ãþ"
SR!NMI ^E ½ö،¶-¥äu) µMIPS CPU JøA«ØӐª
E §±M‡&҃«O"AO´§˜Mì Config 3^E L§
¥±ØC§´3ME 7L­#?§"MIPS E k:aqÉ
~——,^E ½öME ´˜« CPU [جˆ£É~——E
E^ NõÉ~?nś"
©ƒ†“è¥!Ž:žm"

53
3.3. CPU ››Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?n웛
SR(SR)3M‡E £¤k$1ëêч­#C\¤ ˜"§ 3^
E ½ NMI ˜ "SR(NMI) 3 NMI É~ƒ ☠"
IM7–0 ¥ä¶-µ˜‡ 8 ½Â#N= ¥ä ¹Äž)É~"Ù¥8
‡¥ä d CPU Ø Ü&Ò)£˜‡ŒUd FPU ¦^§FPU ¦+
uӘ‡¡þ§´Ü6þ¤´ ܤ¶Ù{ü‡´ Cause Mì
¥^‡Œ¥ä "
XJ\^´#ª CPU  EIC ¥ä˜§@oé SR(IM) )ºÒ¬†
dØÓ¶ë„1 5.8.5 !"
ؚ\3¦^´ EIC XÚ§ÄKØJø¥ä`k?µM‡é–¤k¥
ä ј"œë1 5.8 !"
UX,SX,KX 2Âùù ¦U 64 CPU þŒõ/Œ˜m§n‡ØÓ
£^r!+n!Ø%¤A?ˆgkØÓ "ƒA ˜ §~
„S/Œ=†É~£TLB ™·¥¤­½•ØÓ\:§3@p
^‡ò?n 64 /Œ"
d § SR(UX)  0 ž CPU òØ3^re$1 MIPS64 ISA ¥ 64
-"ù¦öŠXڌ±E˜‡^r/âÝ0§3Ù¥ 32 §
S——=¦´˜‡k"€§S‰1é 32 CPU 5`š{-——Ù
1ÒÚ3 MIPS32 CPU þ‰1˜"1‚ù A5|Ü¿šo
U÷v‡¦µ'X\Ž3^r^ 64 -´E,j± 32 ό§ù
ž\ҌU‡˜ SR(PX)"
KSU CPU A?µ0 ´Ø%?§1 ´+n?§2 ´^r?"XJ;‹É~ƒ
EXL ½ö ERL ˜ §Ø+ù‡´ŸoŠ CPU ÒÑgÄ?uØ%"
+nA?´ R4x00 Ú\§l5vk^L">9iÜ©Jø ˜
µ]"
k Ãþ© rTP1ü‡üÕ §p ‰ UM"
ERL †Ø?µ3 CPU uy†ØêâžT ˜ "MIPS CPU Œ±ÀJ
élp„ ½öSÂêâ¬?1 Ûó ½ö ECC£Å
†è¤ u"Û󆘄Ѵ—·†£Øšk®ûÐêâŒø
O†¤"´ ECC †Ø‡†Ø ؇L˜ £½ü ¤KŒ±ÏL^‡
Å"
ù«†ØÑyž§CPU ˜‡Ûó/ECC †ØÉ~§¿ T ˜
"éù‡É~?nÚIOÉ~´©m§ÏŒÅ ECC †ØŒ
Uu)3?Û/——$–u)3~5É~~§¯aÜ©——X
JXÚÁãÅ ECC †ØX$1§Ò7L3?Û/ÑU?E†Ø"
‰ù:k]Ô5 §ÏÉ~?n§S똇Œ±S¦^Mì
Ñvk¶ vk‡Mì^‰§Òv{m©MìŠ"
54
3.3. CPU ››Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?n웛
 {øù‡(¸§é SR(ERL) Dƒ ˜«AÏ?Ö§˜ ٘ §
Ò¬ÝK?nì1¶é~^r˜m=†/Œ¤k–¯Ñ
òž”§l 0  0x7FFF.FFFF §S/ŒC¤ ˜‡NƒÓÔn/
Œ؉p„ I"8´4p„ †ØÉ~?n§SŒ±^
zero Mì5‰ÄŒ§^Č+ £þª5–¯, £döŠXڏ
dý3¤Ø²Lp„ S˜m§±BM짿‰gCCÑ
˜m5$1"
EXL É~?µ?ÛÉ~u)ž˜ §ù¬r1?\Ø%¿BŽ¥ä¶8´
r EXL ‘±v žm±B^‡û½# CPU A?Ú¥ä¶-
T¤Ÿo"
IE Û¥ä¦U µž5¿Ø+ù ´ŸoŠ§EXL ½ ERL o´BŽ¤k
¥ä"
Ÿok‡+nQº
R3000 CPU Jøü‡A?§ iöŠ£ 5y²ù´ DEC 
ù®²U÷výŒÜ© UNIX ¢y ”اqØØU£5 ¤"
‡¦§´?Û MIPS öŠXÚý^ ª§wå5´ VMS ^‡ìèû
L"@oŸo R4000 Oö ½ ÀJ Alpha Ø´ R4000 ——¦
‡¤éŒ§\þ˜‡l5vk^ ‚j±@ R4000 Lu{ü CPU ›
LA5Qº ›XÚ¬¦ VMX ØS§½ö‡
3 1989-1990 cžÿ§MIPS  s¤éžm£‡"3ù¥m§¦‚A
Œ¤õƒ˜Ò´3 DEC úi OÞÑ MIPS ü?S5´‡¯
DECstation ¬‚þ¦^ R3000 K§R4000 +nÒ´ MIPS úié
CPU§MIPS úiŽ4 R4000 À d£A"
DEC ò5óŠÕ CPU"¿ö´ ·é~¦ù‡nd¶·úù
DEC úiSÜmu 5uФ Al- õ´duŠ0 „"Eâ¯
pha NX( CPU§@´l ¡ K´˜‡ë4§Ù ùX´
`þ5¶R4000 ¡­' Alpha Œ‡ DEC Ž‡gC››?nìmu¿
@ 18 ‡" ã"DEC @gC››?nìmu
Ø+ÀJŸo CPU§§7LØ= –'­‡§Nùé DEC 5`v†"
U $1UNIX§ ‡U$1 DEC ´Ž˜e§‡´ DEC Ðæ^
.ÅöŠXÚ VMS" R4000 ¿ |^ ù 18 ‡+kž
Alpha č-8Ú MIPS A m§¯œ(ÛqT¬´, ˜N
ƒÓ¶ŒØÓ´ÁãžÜ© µ–Qº

55
3.3. CPU ››Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?n웛
3.3.2 ÏMì(Cause)
ã 3.2 w« Cause M숇§^§5éÑu)É~a.§û½
N^=‡É~?n~§"Cause Mì´É~?n' Mì§l@Ï
MIPS CPU ±5Al™Cz"

ã 3.2: Cause M숇


BD ©|ò´µEPC ´É~?nƒ ˆ£/Œ"~œ¹e§ù
•É~ɳ-"
´XJu)É~-´3˜^=£-ò´øp§EPC •@
^=£-¶­#‰1=£-vkŸo³?§XJˆ£ò´ø-
§=£Òجu)§l ù‡É~ò»€¥ä§S"
‡É~u)3ò´ø-§Cause(BD) Ò¬˜ §EPC ҍ•
©|-"XJŽ‡©ÛÉ~ɳ-§‡ww Cause(BD) (XJ
Cause(BD) == 1§@oT- u EPC+4)Ò "

TI £=·^u# MIPS32/64 CPU ¤——TÉ~dSܽžì¥ä)"

CE ?nì†ØµXJÉ~´duƒA SR(CUx) vk¦U,‡?n


삪-Úå§@o Cause(CE) ù^-?nìÒ"
DC £=·^u# MIPS32/64 CPU ¤——rT \ 1 Œ±ÊŽ Count M
ìOê§kžù‰ŒU´ Ž>"
PCI £=·^u# MIPS32/64 CPU ¤——CP0 5UOêìÄÑ )d¥
ä"
IV T \ 1 L«¥äò¦^˜‡AÏÉ~\:§ë„1 5.8.5 !"

WP Öя 1 L« CPU ®²?uÉ~ªž£dž* :É~³›¤P


4>u* :"T ò— CPU ˜lÉ~ªˆ£~öŠÒá=>
u* :É~§* :É~?n§S7L˜ØT "
éT \ 1 ¥äò¦^˜‡AÏÉ~\:§ë„1 5.8.5 !"
IP7–0 –û¥äµ‰Ñ–u)¥ä"Cause(IP7–2) ìˆ CPU M‡Ñ
\&Ò§Cause(IP1–0) £^‡¥ä ¤ŒÖŒ¹\C\Š"
ƒA SR(IM) £„‡ÉÙ§BŽ¥ä^‡å¤#Nž§ùl
¥?¿˜ ¹ÄѬ—˜‡¥ä"
56
3.3. CPU ››Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?n웛
Cause(IP) Ú Cause MìÙ§kX‡©ØÓµ§¿ØwŠ\É
~>užu) Ÿo§ ´wŠ\y33u)Ÿo"
5¿é Cause(IP7-2) )º\¦^ EIC ¥äXڞ¬k¤Cz§ù
31 5.8.5 !ù"
ExcCode ù´˜‡ 5 ?è§wŠ\u) =«É~§„L 3.2"ùpI
‡k˜‡L§´Ù¥£ãNõ^‡Ö8c„vkù"y3Òr
§¤˜‡ëá¶Ù¿Â ¡Ò˜Ù "
3.3.3 É~ˆ£/Œ(EPC)Mì
ù´˜‡É~ˆ£:Mì"—(½ö;É)É~-/Œ\
EPC§Øš Cause Mì BD ˜ §ù«œ¹e EPC •c˜^£©
|¤-"XJ CPU ´ 64 §o EPC ´ 64 "
3.3.4 ÃJ[/Œ(BadVaddr)Mì
ù‡MìÚuÉ~/Œ¶3u) MMU ƒ'É~ž!3^r§
SÁ㖯 kuseg ± /Œž!½ö/Œvk(éàž§TMì˜"
u)Ù§?ÛÉ~ §ŠÑ´™½Â"AO‡Jž5¿´§u)o‚†
؞¿Ø˜TMì"XJ CPU ´ 64 §@o BadVAddr ´ 64 "
3.3.5 Count/Compare MìµCPU ¡þ½žì
ù MìJø˜‡{üÏ^m ½žì§§ëY$1¿ Œ±^?§
¥ä"T¥äÏ~l CPU Ñ5, që‚ CPU ¥äÑ\§äNś†X
Úk'——ëw IntCtl Mì±éÑäNś"
Count ´˜‡ëYOê 32 4OOê짱 CPU 6Y‚ªÇÓ
ª!Œª½ö£é„¤Ù§©ª$1"Œ±ÏLÖ˜‡M‡Mì5éÑO
êìªÇ§31 8.5.12 !ù"
 Count Oꁌ 32 ÃÎÒꊞ§ÒÄÑ £""\Œ±Ö
 Count ¼c“žm”"\Œ±‘ž\ Count ——´Ï~؇ù
o‰"
Compare ´˜‡ 32 ŒÖMì" Count OêO\u
Compare ¥Šž§¥ä&ÒÒ¬,å"¥ä&Ҙ†±k§†–e˜g
\ Compare â˜Ø"
‡)˜‡±Ï5¥ä§¥ä?n§SAo´±½OþO\
Compare £ Ø´O\ Count§Ï@±ÏҬϏ¥äò´ чò
¤"^‡I‡uù«ŒU5——˜‡´¥äAŒUr Compare ¤

57
3.3. CPU ››Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?n웛
L 3.2: ExcCodeµÉ~ØÓa.
ExcCode ÏPÎ £ã
0 Int ¥ä
1 Mod ;öŠž§T3 TLB ¥IPÖ"
2 TLBL vk TLB =†£Ö©O¤"Ò´ TLB ¥vkÚ§S/Œš
k\"
3 TLBS Švkš‘£ëÚ‘Ñvk¤¿ CPU ÿ™?
uÉ~ª—— SR(EXL) ˜ ——= TLB ”ž§p²
w?nù«~„¯‡ æ^AÏÉ~\:"
4 AdEL £ê!½öꞤ/Œ†Øµù‡o´3^rÁã
5 AdES  kuseg ± ˜m§½ö´Áãl™éà/ŒÖ˜‡V
i!i½öŒi"
6 IBE o‚†Ø£½öÖê⤵ ÜM‡uÑ ,«Ñ†&Ò¶
7 DBE äNTNo‰†XÚk'"Ï; —o‚†§UŠ˜
‡ ¼‡\p„ 1 ‰1p„ ÖöŠ(
JmÑy"
8 Syscall ‰1 ˜^ syscall -"
9 Bp ‰1 ˜^ break ä:-§dNÁ§S¦^"
10 RI Ø@££½öš{¤-è"
11 CpU Áã$1˜^?nì-§´3 SR(CU3–0) ¥¿vk¦U
ƒA?nì"
äN`§Ò´ FPU Œ^ SR(CU1) vk˜ žl2:öŠ
É~¶Ï ´2:•ým©/"
12 Ov g€/ªêŽâ-£'X` add  addu ج¤—Ä
Ñ"C Šó§Sئ^ÄÑ-g€-"
13 TRAP ÎÜ teq ^‡g€-,˜^"
14 8c™^"3k Pk L2 p„ Pª CPU þ§M‡&
ÿŒUp„ ­Kž¦^ù §3 4.12 !édk)º"
15 FPE 2:É~"£3, éP CPU þ§2:É~±¥ä/ªÑy"¤
16–17 - ½›É~a.§†äN¢yƒ'"
18 C2E 5g?nì 2 É~£XJk{§Ò´é-8˜«½›
*Ф"
19–21 - 3‰™5*Ц^
22 MDMX Áã$1 MDMX -§´ SR(MX) vk˜ £éŒUT
CPU vk¢y MDMX¤"
23 Watch load/store Ôn/Œš ¦U WatchLo/WatchHi M
ì"
58
3.3. CPU ››Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?n웛
L 3.2 Y
ExcCode ÏPÎ £ã
24 MCheck Åìu——CPU iÿ CPU ››XÚ¥/J5†
Ø"MIPS úik Ø TLB ¥\1 šӘ‡§S/Œ
1‡=†‘žuÑTÉ~"
25 Thread ‚§ƒ'É~§ù3N¹ A ¥k£ã"„k˜‡Mì
§VPEControl(EXCPT)§Jøk'‚§É~õ[!"
26 DSP Áã$1˜‡ DSP ASE -§´‡oT CPU Ø|± DSP 
-§‡oSR(MMX) vk˜¤¦U DSP"
27–29 - 3‰ò5*Ð"
30 CacheErr 3!Öê!½öp„ W¿ž§ØS,‡/u)Ûó
è/ECC ņè†Ø"ù«†Øk§‚gC£ uš ˜
m¤É~\:"¯¢þ§3 Cause(ExcCode) ¥l5wØ
ù‡Š¶´ù‡L¥, ?觝)ù‡3S§3 EJTAG
NÁüNÁªe´Œ„——ë„1 12.1 !§AO´T
!'u Debug Mì`²"
31 - y3™^§´{¤þ^L§‹þ¡ 14 Øõ"
˜‡ Count ®²L Š¶;.‰{´3 Compare ƒ ­#Ö
Count Š"

3.3.6 ?nì ID(PRId) Mì


ã 3.3 w« PRId MìÙÛ§ù´˜‡I£ CPU a.ÖM
ì"CPU Id A¬ˆØƒÓ——–——-8½ö››Mì½Âu)
Czž§CPU Id Š‡UC"/Revision0ûu›E‚[§´^5
Ï CPU ‚[‹l¡‡§^‰Ù§?Û^åѴ،‚"

ã 3.3: PRId Mì


Company Id ——Œ±l MIPS úiTŠ——ƒé#§{
¤þ±  CPU ÑòÙ˜""Company Options 3\ CPU Ãþ¥
k½Â"
L 3.3 ¥Ñ ·‚¤˜ CPU Id ˜"
XJsŽ‹<Ñù Š§S.þ¤/x.y0/ª§Ù¥ x Ú y ©O
CPU ID Ú Revision ›?›Š"¦þ;6ù‡MìSN5(½,
ëê£'Xp„ Œ§„ݤ½ö(½,‘A5kÃ"k A53
59
3.3. CPU ››Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?n웛
,‡ Config Mì¥kIO?è5(½§½öŒ±˜ã“èS5&ÿ
ü‡A5´Ä3"
L 3.3: PRId(Imp) ¥ MIPS CPU ¢yÒ
Id CPU a. Id CPU a.
1 R2000, R3000 128 MIPS 4KC
2 IDT R305x family 129 MIPS 5KC
3 R6000 130 MIPS 20KC
4 R4000, R4400 131 MIPS 4KMP
5 Early LSI LOgic 32-bit CPUs 132 MIPS 4KEc
6 R6000A 133 MIPS 4KEmp
7 IDT R3041 134 MIPS 4KSc
9 R10000 135 M4K
10 NEC Vr4200 136 MIPS 25Kf
11 NEC Vr4300 137 MIPS 5KE
12 NEC Vr41xx family 144 MIPS 4KEc(MIPS32R2oN)
16 R8000 145 MIPS 4KEmp(MIPS32R2 oN)
32 R4600 146 MIPS 4KSd
33 IDT R4700 147 MIPS 24K
34 Toshiba R3900 family 149 MIPS 34K
35 R5000 150 MIPS 24KE
40 QED RM5230, RM5260

3.3.7 Config MìµCPU ] &EÚ˜


IO½Â o‡IOMì‰Ð©z^‡¦^µConfig Ú
MIPS32/64
Config1–3"ŒõêM썴Ö§^‡˜"¯Ò¬–Ñ CPU M‡ƒ
'&E¶´£AO´Ð Config Mì——du{¤Ï vk‰
Config0¤k˜ Œ§^5ÀJ阇äNXڐUÀ٘ CPU À
‘"

ã 3.4: MIPS32/64 Config M숇


¤k MIPS32/64 oN CPU Ñk Config Mì§Xã 3.4 ¤«§k±e
ù µ
M Y ——Öъ 1 `²–„k˜‡˜Mì£= Config1 ¤Œ^"

60
3.3. CPU ››Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?n웛
Impl 6uäN¢y˜"Œõê CPU 3ùpk˜ ½›§QŒ±Ö
Ñ&EŒ±\XÚ˜"žëwäN CPU Ãþ"
BE 1 “LŒ—à§0 “L—à"

AT ´MIPS32 „´ MIPS64 º?èXeµ

0 MIPS32
1 MIPS64 -8´ MIPS32 /Œ˜mN”
2 MIPS64 -8/Œ˜m

AR NX(‡Òµ

0 MIPS32/MIPS64 1˜‡
1 MIPS32/MIPS64 1‡

Ö´Äu MIPS32/MIPS64 1‡"


MT MMU a.µ

0 vk£None¤
1 MIPS32/64 IO TLB
2 BAT a.
3 MIPS32 IO FMT ½N

BAT a.´dué˜ Pª CPU {¤oN5Ï 3§ØŒŒU


„-"
VI ˜ 1 “L L1 ˜?-p„  I-cache ±J[/Œ£=§S/Œ¤¢ÚÚI
P"J[ I-cache ‡¦öŠXڊAÏ?n/é–"
K0 Œ§^5û½½ kseg0 «´Ä²Lp„ "XJ‡²Lp„
§Ù(ƒ1XÛºT?èÚ3 EntryLo0-1(C) ¥„ TLB ‘
p„ ÀJ˜§3ã 6.3 5º¥k`²"
ã 3.5 kXeê⍵
Config1(M) UY § 1 “L„¢y Config2"

Config1(MMUSize) TLB ê|Œ~˜" £Tê|k MMUSize+1 ‘¤"


L1 I-cache, L1 D-cache éz‡p„ §w±en‡Šµ

S p„ Œ†¢Ú ˜ê 64 × 2 "¦±ƒéêp„ 


S

êâ1ê"
61
3.3. CPU ››Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?n웛

ã 3.5: MIPS32/64 Config1–2 M숇


L "“LŠvkp„ ¶ÄKwŠ\p„ 1Œ´ 2 × 2 i L

!"
A ƒéÝ——Tp„  (A + 1) ´|ƒé"

¤±XJ(IS, IL, IA)(2§4§3)§Ò´`p„ k 256 |/´§32 i


!/1§¿ ´o´|ƒéµ@Ò´ 32-KB i!p„ "
Config1(C2)  1 KL²k?nì 2 £éŒU´, ;^?nì¤"

Config1(MD)  1 KL²32:܇p¢y P MDMX ASE£ë„N


¹B.3¤"
Config1(PC) L²–¢y ˜‡5UOêì§ë112.2 !"

Config1(WR)  1 L² CPU –k˜‡* :Mì§ë„112.2 !"

Config1(CA)  MIPS16e Ø è-8Œ^ž 1§ë„112.1 !"

Config1(EP) XJJø EJTAG NÁüK 1§ë„112.1 !"

Config1(FP) N\ ˜‡2:ü"

Config2(M) UY §1 “L¢y Config3"

Config2(TU) † L3 p„ ƒ'äN¢y^ §kŒUŒ"

Config2(TS, TL, TA) L3 p„ ŒÚ/G——Ú Config1(IS, IL, IA)


ƒÓ?è"
Config2(SU) L2 p„ ƒ'äN¢y^ §kŒUŒ"

Config2(SS, SL, SA) ?p„ ŒÚ/G——Ú Config1(IS, IL, IA)


ƒÓ?è"
ã 3.6 ¥)µ
Config3(M) UY § £4ŒU¤ 0 “Lvk Config4"
62
3.3. CPU ››Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?n웛

ã 3.6: MIPS32/64 Config3 M숇


LPA |±ŒÔn/Œ(LPA)ž 1§dž#NÔn/Œ‰Œ‡L 2 i 36

!"k LPA |±žÿ§„¬k˜‡ ¶ PageGrain  CP0 M


ì§Óž EntryLo0-1 Ú EntryHi ¥Ùۏ¬Cz"
MIPS32 Ø£8cŽ¤vk¢y LPA §¤±ÖØ?Ø"I‡ž
žë‚ûÃþ"
DSPP XJ¢y MIPS DSP *ÐKT  1§XN¹ B.2 !¤ã"

VEIC Ö §L²´Äk EIC oN¥ä››ì¶ë„1 5.8.5 !"


5¿§¥ä››ì¿Øáuؘܩ§¤±;.‰{´dXÚOö
ÏLقë CPU ½ö CPU Ø"
VInt XJ CPU Œ±?n•þz¥äKÖя 1"

SP XJ CPU |±u 4 K ¡ŒKÖя 1"ŒõêÏ^ MIPS CPU


Ø|±"
MT XJ CPU ¢y õ‚§KÖя 1§N¹ A k'u MIPS MT *Ð]
"
SM XJ CPU Œ±?n5g“SmartMIPS”ASE -KÖя 1"T*Ðé
3ú„ CPU þ\—~§Jø Ï§Œõê½ 3œUkïE
CPU"

TL Öў 1 L«\،±P¹ÚÑэ-‹l&E"-‹l´ EJTAG


NÁü˜«p?ŒÀA5§3 12.1 !k£ã"
3.3.8 EBase Ú IntCtlµ¥äÚÉ~˜
ù Mì£3 MIPS32/64 1‡¥#O¤4\U ››@p#O¥
äUå"
\þ EBase #N\­#½ ˜‡ CPU ¤kÉ~\:¶Ù̇´^
u‰Sõ?nìXÚ§ùØÓ CPU ÒØ7^ÓÉ~?n§S
"
ã 3.7 ¥‰Ñ EBase Mì¤kµ
1§0 Ö ŠÄŒcM ±(É~•þ á\ kseg0 «§S.þ´‰
öŠXړè^"
63
3.3. CPU ››Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?n웛

ã 3.7: EBase MìÙÛ


ExceptionBase ´É~•þȧŒ±N?¿ 4KB /Œ>."ë„
L 5.1§Ù¥Œ±N ¤kÉ~\:3Ÿo/"
ù¿›X?ۘ‡ CPU £$–)õ‚§ CPU þ“J[” CPU¤ÑŒ
±kgCÕáÉ~?n§S"
CPUNum ˜‡êi^±«©ù‡ CPU ÚӘ‡õ?nìXÚÙ§ CPU"
TSN4ŒU´d\XÚO< ÏLM‡Ù‚(½"

ã 3.8: IntCtl MìÙÛ


, ´Mì IntCtl§Xã 3.8 ¤«µ
IPTL, IPPCI Ñ´Ö§wŠ\½žìÚ5UOêì¥ä£CPU SÜ)
¤´Në‚\XÚ¥"ù3š•þz±9{ü•þz£VI¤
¥äª¥k^"
z‡Ñ´ 3 ?›ê§I£Ú=‡ CPU ¥äÑ\Sܽžì
¥ä£IPTI¤½5UOêìÄÑ¥ä£IPPCI¤"
=‡¥äÏL‰Ñ Cause(IPx) ҍ½§l@pŒ±w¥ä"Ϗ
Cause(IP0–1) ´^¥ä §Øë?ÛÑ\§¤± IntCtl(IPTI) Ú
IntCtl(IPPCI) Ü{Š3 2  7 ƒm"
½žìÚ5UOêì¥äÚÑ CPU  ܧ, 3@pq÷X
Ù¥˜‡¥ä&Òx£"¤±ù‡&Ò3 CPU SÜØU(½§ ´dX
ÚO< Jø"
VS Œ§Œ4\^^‡››•þƒmm µƒëü‡•þ\m
å IntCtl(VS) ×32 i!"k 1!2!4!8 Ú 16 ù Š£©O‰Ñ
32!64!128!256 Ú 512 i!må¤U^""Šý‰Ñ"må§ùž¤
k¥äÒÑӘ‡/Œ"
3.3.9 SRSCtl Ú SRSMapµKfMì˜
KfMì´ MIPS32/64 1‡#OA5"CPU C ˜‡½öõ‡
 Ï^Mì|§¿ 3É~u)ž——AO´¥äu)ž——ƒ†,
|"
64
3.3. CPU ››Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?n웛

ã 3.9: SRSCtl MìÙÛ


3ã 3.9 ¤« SRSCtl ¥µ
HSS 3 VPE/CPU þŒ^Mì8p?Ò£=Œ^Mì8‡
ê~˜¤"
3õ‚§ CPU þTŒU©KfMì8^‡?U"õꜹ
e§T´Ö"
CSS c¦^Mì8"3ùp´Ö¶É~žgʧeret -ˆ£
ž^ SRSCtl(PSS) ¥Š“"
ESS TŒ§d^‡ÀJŒ^u/¤kÙ§0É~Mì8¶¤¢/Ù
§0´Ø VI ½ö EIC ª£öÑkgCÀJMì8Aϐ{¤
¥äƒ "Tš"Šœ¹4¾„"
PSS /c˜‡0Mì8§‘ e˜^ eret -¬^"
\Œ±^ rdpgpr Ú wrpgpr ¼T|M쥊"
SRSCtl(PSS) Œ§#NöŠXÚ3#Mì8¥¯„?n“è¶
\1ù‡Š, ‰1˜^ eret"
EICSS 3 EIC ª£ë„ 5.8.5 !¤§˜‡ ܥ䛛ìzgž¦¥ä£š"
 IPL¤žJƘ‡KfMì|Ò" CPU ɘ‡¥ä§ ÜJø
|Òû½e˜‡|Ò§¿ T|҆e˜‡¥äc´Œ„"
´J2˜eµ¿Ø´¤kÉ~Ѭ# SRSCtl(PSS) Ú SRSCtl(CSS)§
#=u@ • EPC \#ˆ£/ŒÉ~£†é{`§É~?O
SR(EXL) l"C˜|ܤ"Ø\ EPC É~)µ

• SR(EXL) ®²˜ žu)É~

• p„ цÉ~§džˆ£/Œ\1 ErrorEPC

• EJTAG NÁÉ~§džˆ£/Œ\1 DEPC

3.3.10 ë£\1/Œ£LLAddr¤Mì
TMìXþg/C$1Lë£\1öŠÔn/Œ§TŠ´
 i›ŒU—ò5^‡;”}–¯¶ë„1 5.8.4 !"^‡é LLAddr
–¯=^uä"
65
3.4. CP0 ‘x——J“á\€² 1 3 Ù ?nì 0µMIPS ?n웛
3.4 CP0 ‘x——J“á\€²
Ϗ CPU ´6Y‚z§ CP0 öŠJŒU† CP0 - Ïã
âUˆÙ8I——=BdžŒU„‡A‡ž¨DÂm5ˆM‡"´=¦
3·‚ CP0 -‰16Y‚ σc§Ù§-ŒU®²Ñ¿m© "
·‚NâUyù -UU췂Cz # CP0 ‰1Qº
nØþ`§dM‡ó§“éÑz‡ŒUp¿p£§l Eј‡^‡<
ŠØI'%ù˜¯K CPU"SGI  R10000 Ò¢y ù˜nŽ"
´ CP0 öŠ Û©JçNõöŠé^§ Ñ´35Ò7L&
? OS ^‡››ƒe"ù3 MIPS NX(Ú CPU O< w5§rÙ
¥˜ JKí^‡< p“þ´Ün"
{¤þ§^‡< ‡ÏL©Û§S6§§ьUѯK/¿?1
?"¦‚ÃþÉìÒ´ nop -§3CzDÂL§¥ŸoØZ±(S
¶±9©|/ =£-§§‚¬/Š¢0^Sэ-S§r›­#
Ú­#‰1"XJ\w˜eoN 2003 c‡£1‡¤ MIPS32/64 IOƒc
MIPS CPU Ãþµ.§Ï~Ѭé˜Ük' CP0 ‘xL§L¥[£ã
 y U-w®²)ˆ«Cz¤I‡s¤Džm"
=¦´@ϐk{ü6Y‚ CPU§‰ù:Ñk:]Ô5"‘X6Y
‚\ڍE,§ùéuŒ£‡^‡5`ý¤ ˜‡æ†"˜ k CPU
Œ±¿1‰1-£{üVu$–ÏS‰1¤§OŽI‡õ^ nop -Ò
Cé(J "˜ÝžÏ§·‚$–Ñk ssnop(superscalar no-op) -§ü
ÕuT-ÒUyÑK˜‡ž¨±Ï"
´ MIPS32/64 CPU y3k ˜‡ƒÜ¢S{µ‘x“o-"
ù ´Aύ-§‡˜3I‡/§ÒUò´ U-†kc CP0
-¤kJD "
MIPS32/64 Šâ6-ÉK´=‡ã«©ü«ØÓ CP0 ‘x"
‰1‘x´@ 6-†Ö˜‡ CP0 M슞ÿâÉK
œ/"-‘x´@ 6-3ف@ÏÒÉKœ/——€
œ/´§lS½öp„ m©Ò®²ÉK"
,˜‡k¿g«O´@ KÙ§ CP0 -£7,´öŠXÚ˜Ü
©¤‘xÚ@ £·‚Œ±¡Ù^r‘x¤ŒUKÊύ-‘x"
3.4.1 ‘x“o-
3·‚m©ƒc§5¿?ÛÉ~ѬžØ¤k‘x£¤±Ø¬ÏÉ~?
n§Sm©ž,‡öŠÿ™¤ —ц¤§éu eret ´˜——öŠX
ÚØ+‰?Û¯œÑجr憑£‰^r§S"
kn‡²(‘x“o-"\Œ±^ ehb žØ‰1‘x——Pª CPU
r§¤´˜‡ no-op"-‘xÏLAÏMì=£- jr.hb Ú jalr.hb
66
3.4. CP0 ‘x——J“á\€² 1 3 Ù ?nì 0µMIPS ?n웛
5žØ§~„^{´©OO†~f§Sˆ£ÚN^-"
MIPS e“3ÀJAÏMì=£-žékk„ƒ²§¤À-3P
ª CPU þTÐÈè¤ jr!jalr -"3ù CPU þ§ù«-˜˜ CPU 6
Y‚£Mì=£-Ÿþ´“،ýÿ”¤§¿éØÎÜ 5 MIPS32/64
5‰ CPU 3Œõꜹe¬Jø7‡ò´"
3.4.2 -‘xÚ^r‘x
ù«y–u);.œµ´·‚é CP0 G£,‡Mì!,‡ TLB L
‘!½öp„ ,1¤?1?U¬K·‚~ª£½ö3ê
œ¹e§Kload/store -–¯Sª¤"ù«‘x7L3·‚ˆ£?
Û“š››”“èƒc\±)û"
3ù œ¹e§\7Lò‘x“o-˜uUCG CP0 öŠƒ "
~„œ/´r§˜3;EÙ  ˜——´\N¬kÙ¦óŠ\Œ
±3‘xöŠJDÂL§¥S‰1"ùd\gCM•û½"
ù«a.‘x)µ
TLB L‘UC ⇒ 3ÉK¡þ!;ÚÖ
öŠê
EntryHi(ASID ) UC ⇒ šÛN”!;ÚÖö
Šê
UC ERL ª ⇒ l kuseg «!;ÚÖö
Šê
?Up„ 1 cache - ⇒ 3ÉKp„ 1þ!
;ÚÖöŠê
* :MìUC ⇒ 3ƒš/Œþ!;Ú
ÖöŠê
KfMì˜?U ⇒ ?Û¦^Ï^MìöŠ£‰1
‘x¤
BŽ¥ä CP0 Mì?U ⇒ ,U ¥ä-£‰1‘x¤
Œõêù áu-‘x——vk eret ù -Jøv “ož
ÿ§\A^˜^ jr.hb ½ö jalr.hb -"‰1‘xŒ^˜^ ehb -5ž
Ø"
3.4.3 3 CP0 -ƒm“o
?Û mfc0 -Ñwª6u˜‡ CP0 M쥊§´Ï¤k
TLB&EчÏLMì?1§tlbwi!tlbwr Ú tlbr Ñ˜"aq§@
l CP0 MìÖÑêâ cache -k6"
67
3.4. CP0 ‘x——J“á\€² 1 3 Ù ?nì 0µMIPS ?n웛
ÏLÙ ASID  6u EntryHi§ù˜:Òvk@o²w"
tlbp
¤kù Ñáu‰1‘x§ÏL3I‡Ö&E CP0 -ƒc˜˜˜^
ehb -Ҍ±yS"XJ\kŬr§˜@A^- ˜þ§@
o@Уk CPU 3˜^ ehb ƒ A‡ž¨±ÏSŒU¬BŽ¤k
CP0 -¤"

68
14Ù MIPS p„ óŠÅ›

vkp„ (cache) MIPS CPU Ø´ý RISC"ù`Nk”ú


#¶nØþ`§\Œ± AÏ^å O˜‡vkp„  MIPS CPU§T
CPU ¹˜‡U3½‡ê£ÐÒ´˜‡¤6Y‚±Ï–¯;ÍÜ
NþS"¢S MIPS CPU ѹk;—ÍÜ?6Y‚p„ "
ù˜Ùò0 MIPS p„ óŠÅ›§±9^‡ATNo‰âUŒ‚
k|^p„ "E ž§†p„ k'GAÑ´Ø(½§¤±
Ú^‡7Lš~%§3¦^ƒc‡(Щzp„ "(½p„ 
Œžÿ§k ‚¢ÚE|ék^£b½p„ Œ¯k®´˜‡ØÐ
^‡S.¤"éuä§S §·‚ò?ØNÿÁp„ ÚuÿA½
‘"
k ¢žA^§S§S §ŒUŽ‡U °(››= Ü©3p„ 
¥$1"·‚ò?Øù‰˜ ‚€§´·é¦^ù ‚€´Ä²œL
«~¦"
uÐL§¥kL˜ †Ù0 ƒ¿p„ +nś"@Ï
32 MIPS ?nì§p„ +næ^,˜«Yµk4p„ ?\˜«
AÏG§, ÏLÊÏÖöŠBŠ^ép„ ?1Щz½öŠ¢
ÙSN"´·‚ùpج[ùù‡§=¦ØoN MIPS32/64 IO
CPU§˜„æ^éCu·‚3e©¥£ãś"

4.1 p„ 9Ù+n
p„ óŠÒ´òS¥C֘ܩêâ3˜‡°§¦ù
êâU¯„¿ˆ£‰ CPU"éu˜?(L1)p„ §7L3½žm
S¤±y6Y‚ëY$1"
MIPS CPU -ÚêâˆgkƒA˜?p„ £©O¡ I-cache Ú
D-cache¤§ùÖ˜^-Ú˜‡êâöŠÒUӞ?1"
‘kp„ DÚ CPU [x£'X x86¤‡yU oNvkp„
69
4.2. p„ ´NóŠ 1 4 Ù MIPS p„ óŠÅ›
 CPU “è"“ x86 ¡Pk°%OM‡Œ±y^‡Šv
k7‡ )p„ £bX\3C˜‡ MS-DOS Åì§ù«M‡é
±• oN5´7،¤"
 MIPS ÅìϏo´Pkp„ §¤±–þ¡@oœUzp„ 
ÒØ´ýé7‡"p„ éA^^‡7L±ß²§˜Cz´$1„Ý
O\"´ MIPS CPU Ϗokp„ M‡§Òvk<Áã4p„ é
XÚ§S½ö°Ä§S±ß²——SCp„ M‡8´ 4 CPU
¯§ Ø´ ÏXÚ§S ", Unix ƒaöŠXÚéA^§S
Ûõp„ §´”þ?öŠXڌUÛõp„ öŠ[!§
\ŒUE,I‡3ŸožÿN^·~§"
4.2 p„ ´NóŠ

ã 4.1: †Np„ 
lVgþù§p„ ´˜‡ƒé;ì£associative memory¤§êâ\
Œ±^?¿ê⪊' i5é"3p„ ¥§' i´S
70
4.2. p„ ´NóŠ 1 4 Ù MIPS p„ óŠÅ›
/Œ"JøƒÓ' i‰ƒé;ì§\òƒÓêâ"˜‡ýƒ
é;쌱ɦ^?¿' i#ê⑧ؚ§®²÷ ", §du‰
Ñ' i7LÚz‡;' iӞ'§?ÛÜnŒýƒé
;ì‡ožÑ] õ§‡o„Ýú§$–üöÑk"
NâUO˜‡¯„pk^p„ ºã 4.1 Ыp„ ÄÙ
Ûáu˜«{üp„ §= 1992 c±cŒõê MIPS CPU ¦^†
N£direct-mapped¤p„ "
†Np„ ¦^˜¬{üp„;ì£ Ò¤§ÏLv õ/
Œ$ ¢ÚŒ±*ÐNþ" Ò¥z˜1¹˜‡½õ‡iêâژ‡
P¹TêâS/ŒI\£tag¤"
zgÖöŠ–¯p„ 1ž§ÙI\†S/Œp ‰'¶XJš
§·‚Ò(é ê⧡/·¥£hit¤0 p„ "T1¹õ
‡iê➧ÏL/Œ$A 5ÀJÑéA@‡iêâ"
XJvkI\ƒš§@ovkéêâ§I‡lS¥Ö\êâ§, E
›p„ ¥"p„ ƒA ˜?kêâÒ{ü¿ï§CPU I‡ž§
2lS¥­#Ö"
ù†Np„ k‡5Ÿ§Ò´éu?¿‰½S/Œ§3p„
¥k˜1Œ±Ùêâ" ùkÐ?k€?"Ð?Ò´ù{
1

ü(Œ±4‡ CPU ¯"{ükÙØ|˜¡µXJ\§S


‡ØÊ/O¦^ü‡ê⧠§‚fУŒU´§‚/Œ$ fÐ3˜å¤
p„ ¥Ó˜‡ ˜§ùùü‡êâÒ¬ØÊòéO†Ñp„
§Çò:ìeü"
ýƒé;ìج‘ù€5C5£òC§´úB"
ò©{Ò´¦^ü´|ƒép„ ——Ù¢Ò´ü‡¿1†
Np„ §Óž3ü‡¥éS/Œ§Xã 4.2 ¤«"
ùžéA˜‡/Œòküg·¥Å¬"o´|ƒép„ £uk
o‡†Nfp„ ¿¤3¡þp„ O¥é~„"
3õ´ƒép„ ¥§)ûp„ ™·¥žk؎˜‡p„ 
˜ŒÀ"ù‡¿ïO†p„ 1êâk؎˜‡Œ±ÀJ"nŽ
)û{´‹lép„ 1–¯§]ÀÑ/C¦^£LRU¤0p„
1?1O†§´‘oî‚ LRU g^S¿›XzgÖp„ ž§Ñ
‡#z‡p„ 1 LRU " éu‡Lo´|ƒép„ 5`§
‘oî‚ LRU &EC؃¢S"¢Sp„ ~~¦^–“CW
¿”ùò©Ž{5ÀJ‡O†p„ 1"
,ù´k“d"'å†Np„ 5§|ƒép„ 3
¡Ú››ìmI‡õo‚ë"ùÒ´`§ŒJ±8¤3ü‡
3ƒé;쥧†‰½S/Œ£=' i¤ƒéê⌱˜?¿ ˜¶†Np
1

„ ålSNόØU2 "

71
4.3. @Ï MIPS CPU ßp„  1 4 Ù MIPS p„ óŠÅ›
¡þp„ ‰¤†N‡N´õ"‡©/3u§du†
Np„ éuI‡êâk˜ÿÀ ˜§kŒU4 CPU 'I\u
Jc$1£‡ CPU ؊âTêâ‰1،£’öŠ¤"{üÚJc$1
u¯ž¨ªÇ"
$1˜ãžm p„ ¬C÷§¤±¼#SêâžÏ~҇
¿ïc¡ ˜ êâ"XJ\ù ê⮲S\ S§\Œ±
†¿ïp„ SN¶XJp„ ¥êâ'S‡#§\ÒI‡k
rù êâS"
ùґ‰·‚˜‡#¯Kµp„ N?nöŠ"

ã 4.2: ü´|ƒép„ 

4.3 @Ï MIPS CPU ßp„ 


CPU ¿Ø´==Öêâ£þ¡?Øqb½Ö¤§§‡êâ"du
p„ ´òÌ¥˜Ü©ê≘‡ÛÜ°§¤±?n CPU öŠ
˜‡w ´„{Ò´æ^¡ƒßp„ {"
3ߪp„ ¥§CPU êâo´Ì¥¶XJéAÌ ˜
êâ3p„ ¥k˜‡°§@où‡°‡#"XJ·‚[ù
‰§@op„ ¥?ÛêâòÚÌ¥±˜—§¤±·‚‘žŒ±¿ï
,‡p„ 1SN§ Ø¿”?Ûêâ"
‡´·‚–ÌßöŠ¤§Ò¬:ìü$?nì$1„ݧØL
ù‡¯KŒ±Å"3Ì››ì?1OÚ\êâӞ§ò‡\Ì
72
4.4. MIPS CPU £p„  1 4 Ù MIPS p„ óŠÅ›
êâ9Ù/Œk˜‡è", dÌ››ìgCù êâ¿
¤öŠ"ù‡žöŠ/|„¤˜‡k\kÑ£FIFO);
«§¡ Àì£write buffer¤"
@Ï MIPS CPU k˜‡†Nßp„ ژ‡ Àì"‡
ÌXÚU éОzù CPU ±²þ„Ç)öŠ§±ù«ª$1
A½§SÒóŠéÐ"
 CPU „ÝO';ì¯õ" 32  MIPS 4 ‰ 64 
R4000 c @ãžm§MIPS CPU „ÝÒ®²‡LSXڌ±Ünžz
¤köŠ.: " 2

4.4 MIPS CPU £p„ 


¦+@Ï MIPS CPU ¦^{üßp„ § 5 CPU du¯
Ø·^ù«{——§‚öŠ¬Pl;ìXÚ§4„Ýú–´Ú÷
1"
)û{Ò´r‡êâ33p„ ¥"‡êâp„
¥§¿ éA@^ 1‡‰˜‡IP§y·‚± ج#Pr§£
Ì¥£˜‡I‡£Ìp„ 1§¡ƒ dirty ½ö modified¤" 3

£„Œ±©¤A«ØÓfª"XJcp„ vk‡/Œ¤
éAê⧷‚Œ±†rêâÌ¥ Ø+p„ §Œ±^AÏ
ªrêâkÖ\p„ , 2——ù«ª¡ƒ©£write
allocate¤"©™7o´Ð‰{µé‰ø I/O Ö£ CPU ج2
gÖ¤êâ§nŽ‰{´Ø²Lp„ "ùk‚§S wŠöŠX
ÚâU‰"
Ø 4$ ƒ §y“ MIPS CPU Ñ8¤ 1Œ 16 ½ 32 i!
¡þ£ªp„ "
R4000 Ú 5˜ CPU ^3 SGI ÚÙ§úiŒ.OŽÅÑÖìþ"§
‚p„ OÀJ„‡Éõ?nìXÚI¦K"31 15.3 !{á0
;.õ?nìXÚ"
4.5 p„ O˜ Ù§Ä
3 1980 Ú 1990 c“ép„ TNO‰ éõóŠÚ&¢"e¡
0 Ù§˜ ‡Ä/µ
2'u§S˜‡éoѲêâL²§Œz›^-Òk˜‡öŠ§¤±ß)û
{˜†;ì±ÏˆŒ 5–7 ^-±ÏžEk"@ž DRAM ˜‡±ÏŒ 180 ns§
ù«{ü)û{3Œ 30–40 MHz žÒ” "
3\ŒU¬¯§Q,·ò5´@‡£Ì§,Œ±y3Ò£ º´¢Sþ§S²~
éӘ¬ÌëYÐõg§£p„ #NrNõü‡öŠÜ¿é̘g\"
73
4.5. p„ O˜ Ù§Ä 1 4 Ù MIPS p„ óŠÅ›
• Ônό/J[ό£Physically addressed/virtually addressed¤: CPU 3
$1¤ÙöŠXڞ§§S¥êâڍ-/Œ£§S/Œ½J[/Œ¤
¬=†¤XÚ;ìÔn/Œ"
X{óŠ3Ôn/Œªep„ éN´+n£·‚ò3 ¡)º
Ÿo¤"©§S/Œ£=J[/Œ¤Œ±@/m©p„ š§
4XÚ‡¯˜:"
@o§S/ŒkŸo¯KQº§‚Ø´˜¶$13˜‡ CPU þØÓ
/Œ˜mSNõØÓ§S¦^ØÓêâŒU¬Ó§S
/Œ"·‚3ØÓ/Œ˜mƒ†ž§Œ±zgÑ­#Щz‡p„
¶ù«ªõcÒ^L§éép„ ŒU´˜«Ün‰{"
´éuŒp„ §ù«ªÇ$Œ¶ ‡3p„ I\
¥¹˜‡/Œ˜mI£±“Ž· "
Nõ MIPS CPU Ñæ^§S£J[¤/Œ˜?p„ Jø¯„¢
Ú"´%æ^Ôn/ŒIPz˜‡p„ 1§ Ø´æ^§S/Œ\
/Œ˜mI£Î"éAp„ 1Ôn/Œ´˜ Ǎp§Ï
ùO#N CPU 3ép„ Ӟ?1§S/ŒÔn/Œ
=†"
'u§S/Œ„k˜‡\‡©¯K§æ^Ôn/ŒI\ØU)û"
ÓÔn/Œ3ØÓ?Ö¥ŒU£ã¤ØÓ§S/Œ"ùŒU
—ÓÔn/Œ\p„ ü‡ØÓê④Ϗ¦^ØÓ
J[/ŒÀJ ØÓp„ ¢Ú¤"Nõ MIPS CPU vkM‡5uÿ
½ö;ù«p„ ­K£cache alias¤ r¯K3‰öŠXÚS
+n§S5)û§[œ¹žë1 4.12 !"
• p„ 1ŒÀJµp„ 1ŒéAz˜‡I\Œ±Ñõ
iêâ"@Ï MIPS p„ ˜‡I\UéA˜‡i§˜‡I
\UéAõ‡iêâÏ~Ð§cÙ´3SXÚ|±¯„âuÖ
ž£ŒõêÑ|±¤"y“ MIPS p„ ª•u¦^o‡i½l‡i
Œ1§´ŒNþ?Ún?p„ ŒU¦^Œ1"
u)p„ ™·¥ž§‡lS¥­#Ö1êâ"
• ©m/ژ£Split/unified¤: MIPS ˜?p„ o´©¤ I-cache Ú
D-cache§ÀJ=˜‡ûuõU§-ž w I-cache§Öêâž
w D-cache"£^B`˜e§ùu`§XJ\Ž‰1 CPU ff€
S“è§\7LØ==‡rù #-l D-cache £S§
„‡Š¢c I-cache§±y\‰1(¢´#“è¤"
´?p„ é‰ù«y©——ù‰E,![B 5UØZ"

74
4.6. +np„  1 4 Ù MIPS p„ óŠÅ›
4.6 +np„ 
·F"\„P3 2.8 !ùL˜‡ MIPS CPU kü‡½ 512M Œ
ÔnSI§˜‡?1p„ £“kseg0”¤,˜‡Ø?1p„ £“kseg1”¤"
;.‰{´§öŠXړè$13 kseg0§¿ ^ kseg1 )¤‡¦Ø²p„
Ú^"
pu 512M Ôn/Œ3ùp´ØŒ–¯µ64- CPU Œ±ÏL, ˜
‡I†–¯§½ö\Œ±˜ TLB(S+n/=†M‡¤?1/ŒN"z
‡ TLB L‘ÑkI“L²–¯´Ä²Lp„ "
p„ M‡3XÚ^‡Ïe§7Ly?ÛA^§SêâÚ
3vkp„ XÚe´Ó§ ?¿†;얯£DMA¤I/O ›
›ì£†l;ì¥êâ¤êâÒ´T§S@gC\êâ"
·‚dcQ²`L3 PC ژ Ù§8¤XÚ¥§XÚ^‡Ï~~v
k7‡¶ U 4p„ ýß²§Š3M‡þsù‡a!¡¡È!
±Ï“d"ù«M‡+np„ ¡˜—
CPU p„  SN3þ> Ï~Ñ´‘Å"Ú^‡KIЩz
p„ ¶ùŒU´˜‡š~E,L§§e¡‰ A:ïÆ"´˜ CPU
®²éÄ$1å5 §kn«œ¹âI‡ CPU Zýp„ µ
• 3 DMA lSêâƒcµXJ˜‡lÌ¥Ñê⧧
(êâҖ'­‡"XJêâp„ ´£ª§¿ §SC
®² ˜ êâ§@oéŒUÙ¥˜ #(êâ„33 D-cache
p„ ¥ vk£Ì¥"CPU ,Ã{uyù‡¯KµCPU
wÌ/Œž§¬lp„ ¥#(êâ"
¤±3 DMA lS¥m©Öêâc§XJÖ«„kêâ3
3 D-cache ¥§Ò7L£Ì"
• DMA êâSµXJ˜‡‡òêâ;S¥§éAu
\S/Œp„ 1SNÑ7LŠ¢§ù:魇¶ÄK§CPU
Öù /Œžòp„ ¥Lžêâ"ƒAp„ êâ7L3
CPU DMA Ñ\6êâƒcŠ¢§~„‰{´3 DMA m©ƒc
Ҋ¢"
• -\µ CPU gC-S¥§ ¡2‰1ù -ž§\Äk
7Lyù -¬£S¥§Ùg‡yéA I-cache ˜þ
Š¢"MIPS CPU  D-cache Ú I-cache ƒm´vkéX"
3Œõêy“ MIPS CPU ¥§synci -¤˜ƒ7‡öŠ±B4\
ff\S-U ^u‰1——§„´˜^^rA?-"

75
4.6. +np„  1 4 Ù MIPS p„ óŠÅ›
ŸoØÏLM‡5+np„ ?
M‡5+np„ Ï¡/˜ ¯¢¿Ø˜½Xd"˜‡fp„ 
—0£½öª˜:§“f”¤",˜ ››ì7L3z‡ ܱÏч w 
‡ CPU ½ö´ DMA –¯Sž§Ò I\§ùŒU4 CPU v{¦^p„ 
¬wp„ ››Ü6"k‡ë Cú¶fp„ ››ìÏ~)ûù
o‚þ CPU§ù‡¯ÒéN´‰¶ ‡¯K{Ò´±p„ I\ü
/Œo‚¹ ¤I‡Œõê&E"= °€£˜‡ CPU ;^‡ژ‡ú^
¦3 CPU Ø^o‚žÿ§p„ ›› ‡¤"^‡+nŒ±3ü‡¯„Ì‚¥
Ü63* £f¤/Œo‚§]Ñk ӞöŠõ‡p„ ¬"M‡+nI‡
'o‚±Ï"§ÏLégCp„ O£ڊ¢öŠ4 CPU ± I/O „Ý
5wwgC´Äk––¯/Œꆖ¯§ùÏ~¿›Xõ®àm"
" {¤þ§MIPS Oöæ -?
XJk<ép„ S/Œê⧠RISC á|µMIPS CPU ‡ovkp„
››ìŒ±* êâ¿ #gC€ +nM‡§‡oÒÑk£õ?nì
§ŒU´Š¢gC®²LžPê O¤"
â"XJk<Ö3p„ ¥#ê Õ3 21 ­VÝw5§ï(J
⧛›ìŒUZýo‚§wŠS››ì Òؘ "éuŒõêa. CPU§
y3k #êâ‡" ;§S 3I‡5¿p„ žÏ
ù«‰{˜‡Ì‡¯K´·^u Õ¦ —XÚ^‡Ñ†§3M‡E,
O¤@«ªóŠXÚ"¿š¤kX ݐ¡Gј½“dwå5\yŽ"
ÚÑk˜‡¤k¯ÖÑÑy3þ¡ü˜ 3ÖŠžÿ£2006 c¤§Ø 
o‚§l Ü ˜ I/O ››ì،ŒU MIPS CPU ƒ §k˜«ª³3ŠX^˜
ЄÅ(Æ" ½§ÝM‡+n¢y/ß²0p„ 
„k‡‰éõf"CPU ^Œõ •uÐ"XJ\ CPU ¢y ˜
ê/ŒáuT CPU ;^«¶[ج —p„ §\ŒUŠØI‡Ö
Ù§ CPU ÚÖ"·‚ØŽ3p„ Ù£´ék CPU ‰ù˜:¤"3
M‡¥sõ%g§ 3‡Ož ™5AcS¡­Nõ MIPS ØE,ج
ÿâ^õU ‰z‡p„  ˜Ú k˜—p„ ››ì§¤±ù‡LÞ
o‚±ÏÑ\þ E,Ý"<‚N´ ‡séžmâU¤"
@M‡p„ ››’½'^‡¯§
XJ\^‡I‡)ûù ¯K§ÒI‡U ˜‡p„ ‘?1ü«Ø
ÓöŠ"
1˜‡öŠ‰£öŠ"a,êâ up„ ¿ ®²À
/£IPglþglSÖ\p„ ½ölp„ £Sƒ §q
CPU ?U¤§@o CPU ‡rêâlp„ ?Ì"
1‡´Š¢(invalidate)"a,êâ3p„ p>§CPU r§I
76
4.7. ?£L2¤Ún?£L3¤p„  1 4 Ù MIPS p„ óŠÅ›
PÃù‘ –¯Ò¬lS¥с#êâ"
3ù‡þe©¥¦^“flush”ù‡LkßþœaÚçckp¾å"´
ù‡ckN´Úåܧ§Œ±£!Š¢½öü‡öŠ(Ü——¤±
Ö;^§"
kü‡½öõ‡?nìSžÒ¬9˜ E,õ¯K"
ŒõêSXÚLuE,±–u˜‡ CPU v{O CPU ‡Ö
˜§¤±^‡v{(ƒ=‡S«I‡Š¢½ö£"‡oS
–¯[Ø?1p„ £ØšpékÄKéú¤§‡op„ 7LkA
ÏM‡±p„ £ÚS¤˜—5"õ CPU p„ ˜—5¯K3
1980 c“¥Ïd˜+t FutureBus IOó§“?1XÚzƒ vk±c@o
Œù "31 15.3 !éõ?nìśŠ ?Ø"
4.7 ?£L2¤Ún?£L3¤p„ 
3Œ.XÚ¥§Ï~I‡ki@õ?p„ "˜‡ ¯˜?£ L1
¤=Ìp„ l CPU C"–¯ L1 ™·¥ž§Ø´†lS¥é ´k
é L2 =?p„ ——Ï~'˜? ‡ŒAúA£´'S„
´‡¯ÐA¤"p„ I‡A?ûuÌS„ÝÚ CPU ¯–¯„Ý'
å5kõú¶du CPU ž¨±Ïžm'Sžm±Ï ¯õ§2006 c
S¡XÚÊHPkn?p„ "i\ªXڇá uS¡XÚAc£„k
ØÓå§AO´õÑÚÑ9¡¤§Ø A‡;€pàA^ §2006 câ
ffˆæ^?p„ /Ú"
4.8 MIPS CPU p„ ˜
·‚y3Œ±rl8˜ ;.k“L5 MIPS CPU§UìÙæ^
p„ ¢yª?1©a§5wwˆ?p„ üz£ë„L 4.1¤"
L 4.1: MIPS CPU p„ üz
L1 L2 L3
Nþ A´ ¡þ A´ ¡þ A´ ¡þ
CPU(MHz) I-cache D-cache ƒé? 8¤º Nþ ƒé? 8¤º Nþ ƒé? 8¤º
R3000-33 32K 32K 1 Ä
R3052-33 8K 2K 1 ´
R4000-100 8K 2K 1 ´ 1M 1 Ä
R10000-250 32K 32K 2 ´ 4M 2 Ä
R5000-200 32K 32K 2 ´ 1M 1 Ä
RM7000-250 16K 16K 4 ´ 256M 4 ´ 8M 1 Ä

77
4.9. é MIPS32/64 p„ ?§ 1 4 Ù MIPS p„ óŠÅ›
‘Xž¨„ÝJp§·‚wõzp„ ˜§ÏOö
{Aé„Ý'SXÚ5¯ CPU" ‘±$1^„§p„ 
7LÏL²w¯u ¡e˜?;ì„ÝJøêâ§Óž‡3õꜹU
¤õJøêâ£=·¥¤5Jp5U"
\þ ?p„  CPU Œ±~˜?p„ ™·¥“d——ù
˜?p„ Ҍ±‰½{ü";.äk¡þ L2 p„ 
CPU ÑPk L1 p„ §V 16-KB L1 p„ ¤4ɁH/†
0"†CŽ§Œõê MIPS CPU 8¤ L1 p„ ь±3˜‡ž
¨±ÏS¤–¯"knd@§‘X¡5UO±9ž¨ªÇJp§3
˜‡ž¨±ÏSU ;ìŒÄþ´‡~ê"´¯¢þ§¡þ
;ì„݇¢ uÜ6"y“ CPU O²~\6Y‚̇´ U #N
V±Ïp„ –¯" 4

¡ p„ ~~´†N§Ï|ƒép„ I‡°õ
±Dxõ‡I\¿1š"
3¤kù üz¥§Ì‡kü“Ú MIPS p„ ^‡"˜«´d
R3000 mM¿Œõê@Ï 32  MIPS CPU ¤J‘º‚¶„k˜«´d
R4000 m©§38cŽ¤k 64 CPU ¥æ^º‚"R4000 ªp„
y3¤ MIPS32 IO˜Ü©§y3®²ÊH¦^ ——·‚0
ù˜«"
Œõêy“ MIPS CPU Pk£ª!J[¢Ú!ÔnI\!ü´½ö
o´|ƒé˜?p„ "p„ +nÏL˜^AÏ cache -?1"
1˜1 R4000 CPU Pk¡þ?p„ ››ì§QED  RM7000£1998
cc ¤Ú\ ¡þ?p„ §ù38pàO¥é~„"MIPS32/64
½Â cache -·^u*Ð L2 Ú L3 p„ "

5¿œ k XÚ?p„ Ø´d MIPS CPU SÜM‡5››


§ ´ïá3;ìo‚þ"éuùap„ ^‡ò
†äNXÚk'§ÚÙ0 d CPU ¢y½ö CPU ››
p„ ƒ'§ŒUkéŒØÓ"
4.9 é MIPS32/64 p„ ?§
½Â ˜‡š~{'{5+np„ £3 R4000 ƒ §
MIPS32/64
¦‚é@Ï CPU p„ ¥@«Ø”‘o{Š ?¤"
MIPS32/64 CPU ~~¬k'±c CPU E,õp„ ——æ^£
ª¿ p„ 1"Ϗ´£ªp„ §z‡p„ 1ÒI
ùØ´Câu²"æ^ RISC HP-8x00 CPU X›E@ÏXÚɘ‡V±Ï L1 p
4

„ ò´®†Nþ㌠ܘ?p„ § 5U؆"


78
4.9. é MIPS32/64 p„ ?§ 1 4 Ù MIPS p„ óŠÅ›
‡˜‡G §±B3T1 CPU \ž£džÙSNڃAÌêâØÓ
¤IPL"‡+np„ §kA‡ÄöŠ´š‡ØŒ"·‚‡U‰
±eA:µ
• Š¢,¬p„ «µòT/Œ‰ŒSêâ˜ØÑp„ §ùe
˜gÚ^žÿÒ¬lS¼#êâ"
- cache HitInvalidate /ªÚ load/store -˜§Jø˜‡J[/
Œ"T-Š¢¹J[/Œ¤Ú^êâp„ 1"3‡/Œ‰Œ
Sz ˜‡ 1Œ/Œþ­ET-"
• £˜ã/Œ«µy CPU •T/Œ‰Œ\êâXJ3®²
?U 1¥Òx£Ì"
- cache HitWritebackInvalidate £¹J[/Œ¤Ú^ƒAê
âp„ 1§^Br§IPŠ¢"
• Š¢‡p„ µ¿ïp„ ¤kêâ"Ø Ð©zƒ 4I‡
ù‡öŠ§´kžöŠXÚtؘ.‡Š¢=Ü©p„ ž§^
§Š ˜ç"
- cache IndexInvalidate Ò´3ù«œ¹e¦^"Ù/Œëê=
=)ºé¤p„ ;¡/Œ¢Ú—— Yp„ 1
l¢ÚŠ 0 •þOê§zg±p„ 1Œ4O"
• Щzp„ µl˜«™Grp„ ‘\Œ^G¤7I
ÜöŠ"˜p„ ››£=/I\0¤Ï~9é CP0 TagLo M
ì˜"§±9éz˜p„ 1þ‰1 cache IndexStoreTag -ö
Š"‘kêâ p„ „I‡^êâW÷——¦+p„ Ñ´
çW¿êâØAk†Ø "W¿ I-cache I‡AO
%§´Ï~Œ±^˜^ cache Fill -"
4.9.1 cache -
cache -/ªÚ MIPS  load/store -Ï^/ªƒÓ£æ^Ï~
Mì\þ›8 kÎÒê £þ?1ό¤——´éAuêâMì
?è/´‡ 5 öŠ§^±?è–öŠp„ !(½Néƒ
Ap„ 1!±9éƒA1ƒ No?n"^®?˜‡p„ 1Ҕ
cache OP, addr ù§Ù¥ OP ´˜‡“LöŠêŠ"
Ð‰{Ò´¦^˜‡ C Šóý?n§S½Â˜‡©“¶i”“L
ƒAöŠêŠ"édvkIO·¶¶·Ò‘B^ 3 MIPS móäÞ©
‡pé C ý?n¥½Â¶i"
T 5 p 2 ÀJ‡öŠ´=‡p„ µ
79
4.9. é MIPS32/64 p„ ?§ 1 4 Ù MIPS p„ óŠÅ›
0 = L1 I-cache

1 = L1 D-cache

2 = L3 XJk{
3 = L2 XJk{

3·‚Ñù öŠƒc§k`²˜e§z‡öŠÑkn«/ª§«O3u
NÀJ‡öŠp„ ‘£=p„ 1¤ªµ
• ·¥.öŠµ‰Ñ˜‡/Œlp„ ¥é"XJé£=/·¥0¤K
‰1öŠ§ÄKŸoØZ"
• ό.öŠµ‰ÑS¥,‡êâ/Œ§?nÒÚ²Lp„ –¯˜
"Ò´`§XJ\ό1Ø3p„ §3‰1p„ öŠƒc‡
lSÑêâ"
• ¢Ú.öŠµŠâI‡^J[/Œ$ gÀJp„ 1Si!§
, ´p„ ,˜´S1/Œ§, ´T´" \7Lp„  5

Œ£Œl Config1-2 §œë1 3.2 !¤âUˆ‡(


ƒ>.§/Œ^{‹e¡ Øõµ
31 5 4 0
Unused Way1–0 Index byte-within-line

˜ À½ ƒAp„ ±9,˜1§\kA‡öŠŒ±ÀJ§XL 4.2


¤«"CPU 7L|±ùn«öŠâŽþ´ MIPS32/64 oNµ¢Ú.Š¢!
¢Ú.;I\!·¥.£Š¢"Ù{öŠÑ´ŒÀ——XJ‡^{§˜
c[éì CPU Ãþ"
synci -£MIPS32 1‡#O¤y\ff\-U (‰
1£Ü¿ ˜‡ D-cache £Ú I-cache Š¢öŠ¤Jø ˜‡²(˜ßś"
XJ\ CPU |±§ÒA¦^ synci Ø´DÚO“Y£^˜é cache
-5‰µD-cache £ ‹˜‡ I-cache Š¢¤"
4.9.2 p„ ЩzÚ Tag/Data Mì
U Öp„ I\UåkÏuäڑo"MIPS32/64 ½Â ˜é
32 Mì TagLo Ú TagHi 3p„ I\Ü©Ú+n^‡ƒmCê
6

k „3^ MIPS CPU ¦^/Œ$k (½ÀJ=´p„ "ù CPU ŒUI


5

‡AÏЩz"·Øk=‡ÎÜ MIPS32/64  CPU ´ù‰µù´,˜£‡%¯


"
k CPU Ãþæ^ØÓMìÚ I-cache Ú D-cache Ï&§©O‰ ITagLo "
6

80
4.9. é MIPS32/64 p„ ?§ 1 4 Ù MIPS p„ óŠÅ›

L 4.2: z‡p„ 1þŒ^öŠ


Š ·- õU
0 Index invalidate ˜Tp„ 1“Ô"XJ´ D-cache 1k¿
?ULÀ/£lSÑ ®\¤§@ÒkrÙ
SN£S"
ù´Ð©z CPU žŠ¢- Z´{ü
{——,XJp„ kÛóo§\„‡W\‘
( êâ"ë„e¡ Fill"ùéêâp„ 
D-cache Ø·^§ÏŒU—‘Å£µë\e¡
IndexStoreTag a."¤k MIP32/64  CPU Ñ7LJ
øù˜öŠ"
1 Index Load Tag Öp„ 1I\ 9٤όViêâ
TagLo/TagHi Mì"ù‡·-')œ§=øä
ÚAϐÐö¦^"
2 Index Store Tag ^ TagLo/TagHi M슘p„ I\"‡l™
GЩzêâp„ §r TagLo/TagHi Mì
"§, Å1‰1TöŠ"¤k MIP32/64  CPU Ñ
7LJøùöŠ"
4 Hit invalidate Š¢¿Ø£êâ£=¦®²À/¤"¤k MIP32/64
 CPU Ñ3- þ¢yù‡öŠ"ؚêâv
kÀ/£?U¤§ÄKkŒU—ê⿔"
5 Hit Writeback Š¢T1——´XJÀ/‡k£êâ 2Š¢"
invalidate 3$1¥êâp„ ù´íŠ¢{"¤k
MIP32/64  CPU Ñ3 D-cache ¢yöŠ"
5 Fill /Œa.öŠ——^Jø/Œ?êâW\Ü·p
„ 1——Җ3T/Œ?n I-cache ™·¥@À
J"
^5Щz-p„ 1ê⍧AT3Ûó
oe˜ CPU ž¤"
6 Hit Writeback XJT1À/§£S´4p„ ±k"
3$1XÚ¥\Žyêâ(¢®²í\S±B
 DMA ½öÙ§ CPU –¯ž¦^T-"
7 Fetch and Lock /Œ.öŠ"rT/Œ?êâ\1?–~p„ Ú
^žÓ˜p„ 1£XJêâ„Ø3p„ §ŒU‡
rkcê⣤"
, £4T1"£413p„ ™·¥žÿØ
O†"
˜†±£½G§†¦^,« cache“invalidate”²
(Š¢Ž"

81
4.9. é MIPS32/64 p„ ?§ 1 4 Ù MIPS p„ óŠÅ›
â"TagHi ~~Ø´7‡µXJ\Ôn/Œ˜m؇L 36 §TagLo Ï~
ÒU‡I\Jøv ˜m"
ùü‡M쥍‡N p„ ¥I\§Ï 6uäN CPU"
˜µŒ±y˜:Ò´µTag Mì¥"ŠéAu˜‡Ü{k
êâI\§L«ƒAp„ 1عkêâ"CPU ¢y˜^ cache
IndexStoreTag -§T-rI\MìSNDxp„ 1"¤±Ï
LòM슏"§¿ \I\Š§\Ҍ±l˜«™Gm©Ð©z
p„ "
MIPS32/64 ½Â “;êâ”Ú“C1êâ”p„ öŠ§Ñ´ŒÀ
§UdéäN CPU “è¦^"\[Œ±ÏL“·¥”êâ5–¯ê
â"
˜‡p„ I\7L±¤kØUlp„ ¢Ú¥†/Œ
£XJúؘٞë„ã 4.1¤"
¤±XJ˜?p„ I\ÝÒ´¤|±Ôn/Œ êÚ^
5¢Ú˜?  êƒ ——é 16K o´|ƒép„ 5`Ò´ 12
"TagLo(PTagLo) Œ±NB 24 §ù˜‡p„ õŒ±|± 36
Ôn/Œ‰Œ"
TagLo(PState) ¹kG "\ CPU Ãþ¬wŠ\õ[!¶,
éu¤kp„ +nÚЩz5`§"I\[˜‡“LƒAp
„ 1SNŠ¢kI\Ò "
4.9.3 !
CacheERR ERR Ú ErrorEPC Mìµ;ì/p„
ц?n
p„ ´;Xږ'­‡˜Ü©§éupŒ^ݽpŒ&Ý
CPU
XÚ¬uy^  5i›;3@pêâ5´Š"
nŽêâ5u¢yA´àéà¶êâ˜)½˜?\XÚ
ÒOŽ ¿‘êâ˜å˜§3êâ¦^c2‰1u"ùuòØ=¬
uy;ì†Ø UuyE,o‚†Ø§±9ê☴ˆ CPU ڈ£
奤ÑyÙ§†Ø"Ϗù‡ϧŒ^u¢ypŒ‚XÚ MIPS CPU
~~ÀJ3p„ pJø†Ø"ÚÌXژ§\QŒ¦^{üÛ
󏌱^E,ņè£ECC ——Error Correction Code¤"
X8Ffp§ï;XÚ‡–•u±õ‡ 8 °Ý/ªJø§#
NSXÚ¬Jø 64 êâÚ 8  "¤±·‚^OÀ܏
‡„Ìù˜:"
Ûó{ü/S¥z‡i!¢y˜‡  "˜‡Ûó†ØwŠ
XÚù‡êâ،‚§#N3,«§Ý››e'4XÚ Ø´d\‘ņØ"Û
󘇭‡Š^Ò´3XÚmuL§¥Jø㌐ϧϏ§U
²(佯K´Ñ3Sêâ5þ"
82
4.9. é MIPS32/64 p„ ?§ 1 4 Ù MIPS p„ óŠÅ›
´-Ãê☇i!kz©ƒÊ›VÇ)˜‡(Ûó
§3 64 o‚þ‘Å-Ãêâ9Ù z 256 g¥òk 1 g<øuÿ"
k Xڇ¦'ùp"
ņèOŽå5E,§Ï9‡ 64 iÚ 8 ‡ "ù
”.µ1 †Øò˜£O¿Å§?Û 2 †ØÑUuÿÑ
5"3š~Œ;쥧ECC ´üؑņØrŒóä"
Ϗņè˜gŒ±u‡ 64 êâi§¤±¦^ņè ECC S
ØUæ^ÀJ˜‡êâi˜Ü©ª?1Ü©iêâöŠ§ 
Uæ^Ü¿#êâ¿­#OŽÅ†èª"Ø^p„ ž$1 MIPS
CPU ‡¦;ìXÚU?1Ü©iêâöŠ§ùò¦¯œCE,z"
;ìXÚM‡7LòÜ©iêâöŠ=C“Ö-Ü¿-­#OŽ-\” 
öŠS"
éu{üXÚÏ~ÀJÛó ½öZyŸoÑvk"4ŠŒ
À‘´ék¿Â§ù3OïuL§¥k|uä§ 3¤¬ž%Ø^GÑ
ƒA“d"
nŽœ¹e§;ìXÚgæ^Ÿoś§p„ XڏÒæ^Ÿ
o"ŠâØÓ CPU§\Œ±æ^Ûó !z‡Vi 8 ņè!½öZyŸo
oÑØ^"
XJŒU§êâ Ï~†ÏLXڝxp„ µêâl;ì
ˆ\1?p„ žØI‡u"êâ3¦^žÿâ?1u§ùŒ±
y?ÛÛóÉ~Ñ=‰ÚåÉ~-§ Ø´=‰-| uӘ
1-"
XÚo‚þêâ†éušp„ êâæ^Ó?nś"
ù¿›X¬w¤/p„ Ûó†0——N´4<t æ"
5¿§Xڝr?5êâIPvkk ´ŒU"3ù«
œ¹e§CPU ¬§SÜp„ )¤ "
XJu)†Ø§CPU ¬)¤˜‡AφØg€"ùž››Úšp
„ ˜m;€ ˜£XJp„ ¹k†Ø§UYlpމ1“èw,éy
Y¤"XJXÚæ^ ECC§M‡‡ogCņا‡oJø‰^‡v &E
?†Ø"
CacheErr MìûuäN¢y§\I‡ CPU Ãþ"\NU
l\ CPU øAû@pp„ †Ø+n~§«~“è"
4.9.4 (½p„ ŒÚ˜
éuÎÜ MIPS32/64 oN CPU§p„ Œ!|„!±91°ÑŒ
±Š 3.3.7 !¤ù CP0 Config1-2 Mì˜Ü©Œ‚‰Ñ"
´ oN5§Ö½öE^U 3é2‰Œ MIPS CPU þÑU
Œ‚$1Щz^‡k¿Â"e˜!ù }ÁÚÿÁ)û{"
83
4.9. é MIPS32/64 p„ ?§ 1 4 Ù MIPS p„ óŠÅ›
4.9.5 Щz§S
ùò0 ˜‡éЉ{µ
1. m8˜ S±BŒ±l§5W¿p„ ——\\Ÿoêâvk'
X"XJ\XÚ¦^Ûó轴ņè§\7L( ´
("˜‡Ð‚€´–p„ Щz¤ƒcý3XÚS$
32K ^ud8"XJ^زp„ \êâ5W¿§Ò¬¹(
 "
éuЩzŒ?p„ §@Œ À«Ø §\ŒUI‡‰
E,¯œ"
2. ò TagLo Mì"§ùUyéA1k@˜ ج˜ ¿
I\Ûó贘—£3I‡ CPU þ‡˜ TagHi¤"
TagLo Mìò cache IndexStoreTag -^5r›Š¢éAp
„ 1¿˜ØI\Ûó "
3. BŽ¥ä±“˜u)"

4. kЩz I-cache§, ´ D-cache"e¡´Ð©z I-cache  C “è"


£\
7Lƒ&– Index_Store_Tag_I() ù‰1. õU¼ê½÷¶§
‚‡o´$13ƒAÅì-¡”®?“è~§§‡o´——éuŒ
ÿ GUN C ^r——N^ C i\®? asm Šé÷"¤
for (addr = KSEG0; addr < KSEG0 + size; addr += lnsize)
/* clear tag to invalidate */
Index_Store_Tag_I(addr);
for (addr = KSEG0; addr < KSEG0 + size; addr += lnsize)
/* fill once, so data field parity is correct */
Fill _I (addr);
for (addr = KSEG0; addr < KSEG0 + size; addr += lnsize)
/* invalidate again õ prudent but not strictly necessay */
Index_Store_Tag_I();

·‚‰1W¿öŠ§´Ïk CPU $–é²wÃp„ 1Œ


UuÿÛó†Ø¿u)g€"Ø3´§MIPS32/64 vkr›‡¦¢y
Fill I öŠ"\Œ±ÜnÏ"?Û¢y ÛóÚ ECC o CPU
ÑAT¹ TöŠµØop„ êâ CPU I‡1˜‡;I
\̂"
„k§·‚^ n‡©Ô§ vkÜ¿¦‚§Ï\3?nI\ž
7Lš~%¶éuü´ƒép„ §ü‡Ì‚¬é˜Œp„ 
84
4.9. é MIPS32/64 p„ ?§ 1 4 Ù MIPS p„ óŠÅ›
Щzüg§Ï^"I\Mì“index store tag”¬E LRU §
T û½=|p„ 13e˜g™·¥ž¦^"
5. D-cache Щz‡‡E,˜ §ÏvkéAê␠fill öŠ¶·‚
UÏLlp„ \1 ‚Ï~p„ ”?n"e¡´äN
{"
/* clear all tags */
for (addr = KSEG0; addr < KSEG0 + size; addr += lnsize)
Index_Store_Tag_D (addr);
/* load from each line (in cached space) */
for (addr = KSEG0; addr < KSEG0 + size; addr += lnsize)
junk = *addr;
/* clear all tags */
for (addr = KSEG0; addr < KSEG0 + size; addr += lnsize)
Index_Store_Tag_D (addr);

4.9.6 Š¢½ö£p„ ¥;«


^uŠ¢½£ëê˜ÆéAu˜ I/O À«§S/Œ½Ôn/Œ
‰Œ"
Ao´^·¥.öŠ5Š¢½£"XJ\I‡Š¢½£˜Œ¬
;«§¦^¢ÚöŠ5Š¢½£‡p„ ¬'¯§ù´Jø˜‡`
z{§\Œ±ÀJѐ{"
e¡ù‰Ò µ
PI_cache_invalidate(void *buf, int nbytes)
{
char *s;

for (s = (char*)buf; s < buf + nbytes; s += lnsize)


Hit_Invalidate_I (s);
}

‡ buf ´§S/ŒÒvk7‡)¤AÏ/Œ"XJ\ØØÄuÔn
/Œ p 5Š¢§‡ p 3Ôn˜m1˜‡ 512M ƒS§\þ˜‡~þÒU)¤
ƒA kseg0 «/Œµ
PI_cache_invalidate (p + 0x80000000, nbytes);

85
4.10. p„ Ç 1 4 Ù MIPS p„ óŠÅ›
4.10 p„ Ç
lʛc“@Ï=¡þp„ §pà CPU 5U錧ÝþûuÙ
p„ XÚ5U"y3NõXÚ£cÙ´i\ªXÚ§I‡3p„ N
þÚS5Uþ!¤§CPU k 50¨65% žmž3–p„ ­W"Òù
:5`§ò CPU Ø5U€UòA^§S5UJp 15¨25%"
p„ ÇûuXÚ3–p„ W¿s¤žm"\Œ±òƒ
8(ü‡ê¦Èµ
• ²þz^-p„ ™·¥Çµp„ ™·¥gêر‰1
-ê"
• p„ ™·¥/­Wmµ;ìXÚ­Wp„ ¿2gm© CPU
‰1¤sžm"
\ŒU¬Ž§Äp„ ™·¥Ç——zgS–¯²þ™·¥Ç"
´p„ ™·¥ŒUkNõσK§Ù¥k Šv{ý"އ~
f§x86 CPU Mì‡ê駤±Ó§S?ȉ x86 ¦^¬'‰ MIPS
¦^õéõêâ"´ x86 ¦^æÒ5“OMì‰ù  ¦^¶
ùæÒ ˜ò´S¥¦^š~ª„«§éA¦^Ǭš~p"z
Z^-™·¥ÇÉù« OKÒv@oŒ"
=¦–þ¡ù{ü©Ûéue¡ÑA«\¯XڄÝw ´„
{ékÏ"
• ~p„ ™·¥gêµ

- \Œp„ "ùo´k§´d‚[B"64K Œp„ 


Óâ¡¡ÈŒu$–‡L{ü CPU ¥Ù§¤kÜ©£Ø
¹2:M‡¤Óâ¡È\å5oÚ"
- O\p„ ƒéÝ"O\o´ƒé„´Š§2O\e5U
JpÒAwØ " 7

- 2\˜?p„ ",ùò¦OŽC\E,"ØO\ ,˜
‡fXÚE,Ý §?p„ ·¥Ç$4<ßÔ¶˜?
p„ ®²l CPU ­Eê▯1¥“Mr hY£©
skimmed the cream§†È§ Eh¤” " ¦ÙÔk¤Š§
8

?p„ 7L'˜?ŒNõ£˜„5`´l½öŒ¤§¿ 
? ·¥–¯žm7L'S¯£ü½öõ¤"
(¢kl´½öõ´ƒép„ §´Ï~ù‰´ÏOÏ š~p„ ™
7

·¥Ç"Jø¿vp„ ƒé´êŒ±kü$õÑ£Ø^žÿ´ÑŒ±'K¤§kžÿ
Œ±;1 4.12 !Jp„ ­K¯K"
a Hennessy Ú Patterson JÑù‡/–'’"
8

86
4.10. p„ Ç 1 4 Ù MIPS p„ óŠÅ›
­#|„\^‡l ~ ™·¥gê"ؘÙù3¢‚¥´
-
Äkµéu§SéN´­#|„wÍJ§î8Ž„
vk<¤õ‰ÑLé?¿§SÑkÏ^óä"ë„1 4.11 !"
• ~p„ ­Wmµ

- ¯4 CPU ¼1˜‡iêâ"DRAM ;ìXÚ7L‰Nõ


óŠ5éħ, âU¯„Jøêâ"Så CPU C§§‚ƒm
´»á§êâˆÒ¯"
O\‘°I‡sa" ,˜¡§~žòÏ~Œ±ÏL{zXÚ5
ˆµ¤±ù´d?э˜QŒ±ŽaqŒ±ÓžJp5U
{"ØLÛ%´ù:é5¿§N´Ï§I‡3 CPU
Ú;ìXÚOƒmčõ8¤"CPU Oö3(½
¡žØ?nXÚ¯K§ŒU´Ï¦‚󊮲 E,
œ
- O\Sâu‘°"ùDÚþ´ÏL[B/O;0Eâ‰
µ^ü‡½öõ;ì5O;êâi¶²LЩò´
§ÒŒ±OXlz˜‡;ì¥êâ§4Œ^‘°€";
ìžò‘X¡ ü$4 ú§, lü‡IO;ì܇
Œ‘°%3 ¿5O" 3˜‡ DRAM S^p§¡
é ¥yь±‰6Y‚z–¯©mSÜ;¬±ü$oNž
ò"Ï §ÔnO;y3é„ "
• @:­#m©$1 CPUµUý CPU 3‡p„ 1W÷#êâƒc
Ò¬ä"´\Œ±Sü45gSêâ3D4p„ Ӟ†
x– CPU§–êâ˜Ò4 CPU á=m©‰1"p„ 
Ù{Ü©­WÚ CPU ¹ÄŒ±¿1?1"Nõ MIPS CPU éù˜:‰
Or§D4>up„ ™·¥ž¦i/ŒS››ì¿4¬¥
;‡iÄkˆ££“;‡i`k”¤"
• † CPU 7L¦^êâžÿâÊeµ-?ª´4 CPU 7L
êöŠUY‰1e¶êöŠ‰o‚ü§CPU UY$1†§
ýI‡Ú^Öêâ"ù¡ƒÃ{lÖ§y3®²´ÊH‰
{"
3~ CPU þ§±9Œõê^‡¥§¢SþrØ õ§Ò¬-k
-‡^ff\1êâ ¦ CPU ‡Êe5"ù«‰{k
/~ A‡±Ïžò§3k?p„ žÿŒUAOk^"
-?{´§Œ±‰1?Û YØ´3–\1êâ“
è§R10000 ÏS£OOO¤‰1Ò´ù‰"OOO OÊHæ^ù‡
Eâ§Ø1^uÖêâ„^uOŽÚ©|-"y3¯pà CPU
87
4.11. ­#|„^‡±Kp„ Ç 1 4 Ù MIPS p„ óŠÅ›
Ñ¢y OOO 6Y‚"؆§OOO Ø=E, õь§ù:ŒU¬ò
§?\õѯai\ªA^§==´‡žm¯K"
• õ‚§z CPUµp„ ™·¥Úåžòé§S5UØ|KU
)%،;"¤±ý-?{´3 CPU þ$1õ‡‚§§Œ±
3pƒ–žmp|^˜s CPU ] "ëN¹ A é MIPS MT X
Ú{0"
4.11 ­#|„^‡±Kp„ Ç
3ŒU$1Œþ¯kÃ{(½A^§SXÚ¥§Uép„ 1
?1O"3$1ü‡A^§Si\ªXÚ¥§p„ ™·¥ª
ûu,‡A½^‡äNïL§"ù˜:AO4<N´éŽ´ÄU ^
˜«XڐªéA^§S“艘eU±U?p„ Ç"‡ )N
âUk‰ù:§I‡Uì)Ïép„ ™·¥©aµ
• 1˜g–¯µ?Ûêâ7L–lS¥Ö\˜g"

• O†µp„ Œ´k§¤±\§Svk$1õÈÒ¬Ñy§
p„ ™·¥Ú­#W¿§¬r˜ kêâO†Ñ§Ù¥˜ ê
ⴊ33p„ ¥"§S$1L§¥§Ò¬ØÊ›”êâ
, qØØ­#\1"\Œ±ÏL¦^\Œp„ Ú~§SŒ
£ªåŠ^Ò´§SŒÚp„ Œƒ'¤5¦O†—™·
¥~"
• ËÄ"3o´|ƒép„ ¥£õ´œ¹3 MIPS CPU ¥é
„¤§¤±éu?ÛS/Œ3p„ ¥õko‡ ˜Œ±˜"£3
†Np„ ¥Òk˜‡¤"
XJ\§S-|¬š~ª„¦^,A¬ê⧠ùA¬êâ/Œ$
qš~C§±–u§‚TЦ^ƒÓp„ 1§@oêâ¬
ê8‡Lp„ |ƒé´êž§\Ò¬3, žmãS-4ª„
p„ ™·¥§ÏØÓ¬êâ¬pƒréØÊ/ü@Ñp„
"
Ë씑X|ƒéê8:ì~¶ŒõêïÄL²‡Lo´p„
éu5UAvkJp£´ŒUkÙ§OÏI‡ïl´$
–õ´p„ ¤"
k þ¡µ£§@oé§S‰NCz¦§3p„ ¥$1
Ðº

88
4.11. ­#|„^‡±Kp„ Ç 1 4 Ù MIPS p„ óŠÅ›
¦§SµXJU‰{§ù´‡ÐÌ¿"\Œ±¦^?Èì¥Ý

`zÀ‘£LÝ`z~~¦§SŒ¤"
• 4§S¥²~‰1@Ü©µ§S¥–¯—ÝØ´²þ©Ù
"²~¬kƒ˜Ü©“èAlØ^£†Ø?n§)œXÚ+
n¤§½ö^˜g£Ð©z“è¤"XJ\UŸlÑ5ù é^“
觐{Ü©“èÒUképp„ ·¥Ç"
˜«²L¢y²3˜½§Ýþ¤õ{´§|^¿Ûì(½§S
3;.K1e¦^ª„¼ê§, Uì¼ê‰1žm4~^S
3S¥Sü¼ê"ù–ù ²~¦^§Sجƒpöp„ 
 ˜"
• r½˜ ­‡“è½êâ~7p„ µk ‚ûJø ˜«Å›U#
N˜Ü©p„ \1êâ ØO†"ùwþД´¥ä?n§S
½´Ù§­‡^‡¼(½5U˜«{"Ï~¢y´Ó^õ´|ƒ
ép„ Ù¥˜´"
·é~¦ù‡{k5§·Øk?ÛïÄ(J|±§k
5"XÚÙ{Ü©5U›”éŒU‡L @ ' “è5UU?"p
„ £½^Š˜‡š~Œ¦EÃã5‹žrép„ éu
ªA5Ä"ù‡Ä´Œ±n)§´¯„!E,!Œ.XÚ
qŸþҴ،ýÿ§Œõêmu< NATƬÉ Ø´;
§——p„ .¾´¯K˜Ü©"
• Sü§SÙÛ;ËÄµØ 4§S¹ÄÜ©C£ë„þ©¤
ƒ §·úù¬—õ‘o¯K§¤±Ø´‡Ð{"£=¦´ü´¤
|ƒép„ 4ù«‰{” ¿Â"
• 4@ é^êâړèزLp„ µrp„ 3‰@
­‡“è½êâ¦^§üØ@ ^˜g½é¦^“è"
ùAo´˜‡†Ø"XJêâýé¦^§@o5Ò،¬?\
p„ "Ϗp„ Ï~o´±Ý 4–16 i1ü Öê⧤
±=¦´H{^˜gê⽓èUkãŒ\„¶lSâuW¿
'ü‡i–¯AØõsžm§„U‰\^BJø,  3–15 ‡
iêâ"
{ 󃧷‚9œí±e¡{Š˜‡å:£²Lõg¢‚ÿþÚ
\g â⌱˜ï¤"Äk§4Ø I/O MìÚ^Øõ§;ì
ƒ ˜ƒ–¯Ñ¦^p„ "* ˜ewwp„ é\A^§SkŸ
oK§ ؇Š¯ ßÿ"Ùg§^M‡)ûM‡¯K"vk?Û^‡U 
£Ïp„ ­WžòL½öS‘°L$ ›”5U"Áã­#|„
89
4.12. p„ ­K 1 4 Ù MIPS p„ óŠÅ›
^‡ O\p„ ·¥Ç§7,ў E,"˜m©Ò‡²xù‰Â
¼$ 5ƒØ´"ÁÁM‡{œ
4.12 p„ ­K
ù‡¯K¬Kù˜ap„ §^u)¤p„ ¢Ú/ŒÚ
˜3p„ I\S/ŒØ˜"æ^J[/Œ)¤¢Ú ^Ôn/ŒŠ
I\§´ MIPS CPU ˜?p„ ~„‰{"ùé5UkÐ?µ‡´^Ô
n/Œ)¤p„ ¢Ú§·‚‡˜†/Œ² TLB =†ƒ ⌱m©
ép„ "ùŒU—p„ ­K(aliases)¯K§Xã 4.3 ¤«"

ã 4.3: p„ ­K
Œõêù CPU Uì 4KB Œ5=†/Œ§ùÒ´`§J[/Œ
$ 12 ØI‡=†"‡\p„ ´ 4K ½ö§J[¢ÚÚÔn
¢ÚÒ´˜—§@Òvk¯K"Ù¢ù‡^‡„Œ±˜°µ‡p„ ¢Ú
ªÝ‰Œ´ 4K ½ö§Òvk¯K"3|ƒép„ ¥§z‡¢Ú–
¯A‡p„ ø£z´˜‡¤——¤±=¦´ 16K o´|ƒép„ §J
[¢ÚÚÔn¢ÚE,ƒÓ§Ø¬u)­K"
´Ž˜e\p„ ¢Ú‰Œˆ 8K œ/£32K o´|ƒép
„ Ò´ù¤"\ŒUlü‡ØÓJ[/Œ–¯Ó˜‡Ônµ~XJ[
90
4.12. p„ ­K 1 4 Ù MIPS p„ óŠÅ›
/ŒŒU´ëXü——'X`/Œ©Ol 0 Ú 4K ?m©"XJ§S–¯ 0
?êâ§TêâÒ\1,‡p„ ø¢Ú 0  ˜"XJdž2l,
˜‡/Œ 4K –¯Ó˜‡êâ§2glS¥ј\p„ ØÓ¢Ú
4K ?"y3Ә‡êâ3p„ ¥kü‡K”§éÙ¥˜??U,˜?Ã
{"ùÒ´p„ ­K"Öêâ­KN´Úå·ÏkŒU—†
ا éu3êâ­KÒ´˜‡‘žŒUå ¿"
MIPS  L2 ?p„ o´Ôn¢ÚÚÔnI\§¤±Ø¬k­K¯
K" 9

­K¯K´ó,σÚ\ MIPS ­.¥"‡\¦^ Ü


?p„ §© R4000 CPU ——þ¡J——´vk­K"´ 5
uy R4000 Œ±^5Evk?p„ .ídXÚ"ùÒ³Ñ ­
K¯K¶´ 64 MIPS CPU Ž‡Ñ­."Ø >&l¯Šº§­
K¯K­#½ÂdXÚ^‡5ŽÑ¯K"
­KجÑy3˜é)¤ƒÓp„ ¢ÚJ[/Œƒm"éu 4-KB
¡§p„ ¢Ú$ 12 y´ƒ¶˜7‡´yéAuӘ
‡Ôn¡ØÓ§S/Œmål L1 p„ z´ŒNþê"X
J\öŠXÚ3˜õ‡J[/ŒӘ‡ÔnNž%/yJ[
/Œmå 64K ê§ÒéJŽ–\„¬Ñ¯K" 10

¤±‡ OS éuÓÔnêâ‰Ñõ‡J[/Œž¿©%§;­K
´ŒU"Ø3´§Linux ´˜‡Œ£‡öŠXÚ§@mu< čõ
´Ï^S¡½öÑÖìXÚ¯K§ Ø£½öØ'%¤K MIPS
CPU A½¯K"ù Linux SØ; Œõê­K§´Áã3Ù{­
K"
{üöŠXڇovkõ­N§‡oU 3ù«åeóŠ"´
p„ ­K´öŠXÚéõdϯKچؘ‡5 §‡´M‡O<
cPùÙ¢´‡"€TõÐBœ´Ï›Êcc˜‡Ò †§˜
†Ør"€¤ AÚ. . .

‘k¡þ? ››ì CPU Œ±^? ¥˜ ‹l?\˜?p„ Ö


9

¶R4000 Ú R4400 CPU ^ù‡5uÿp„ ­K¿)AÏÉ~4XÚ^‡)ûù‡¯


K"´ù‡DÚqvk 5 CPU D«e5"
, CPU 8¤ÝڄÝzL˜cѬÜ/O§˜?p„ z˜´Nþ،ŒU
10

‡L8c3 64K o´|ƒép„ ¥w 16 KB P¹"L1 p„ ± CPU ž¨„Ý„$


1§Ò¯¶± 8¤z§Ýp CPU ò¬= J¦¡þ L2 p„ "
91
1 5 Ù É~!¥ä9Щz
3 MIPS NX(¥§¥ä!g€!XÚN^±9Ù§‹ä§S~‰16
¯‡Ú¡É~§Ñæ^Ә«Å›?n"Ñ´ Ÿo¯‡Qº
• ܯ‡µ3 CPU ؃ ¯‡——=5guý¢/ë‚0þÑ\&
Ò"ù Ò´¥ä" ¥ä^54 CPU 5¿=, ܯ‡µù´‡
1

Ӟ?nõ‡¯‡öŠXÚ¤7،A5"
¥ä´˜d CPU ~-6± ¯‡ÚåÉ~^‡"Ϗ¥äØ
´·‚%ÒU;§¤±7Lk,«^‡Å›37‡žBŽ¥ä"
• ;ì/Œ=†É~µ,‡/ŒI‡=†´M‡ØUk=†ž§½
˜‡kož§¬u)ù‡É~"
OS 7L(½ù‡É~.´Ø´†Ø"XJÉ~wG´duA^§S–
¯ #N/Œ˜mƒ š{S§¯K)û´öŠXÚªŽA^§S
±oXÚ٧ܩ"~„´û5S=†É~Œ±^5N^ö
ŠXÚõU§E,Œ±´UINJ[;XÚ§½ö{ü´*
¿æҘm"
• Ù§I‡SØZýš~œ¹µÙ¥w͘‡~fÒ´2:-
—^‡§džM‡Ã{?n, (JÚ„öŠÎÚöŠê|Ü
Ϧ^‡•ýÑÖ"
ùaœ¹' §ÏØÓSØéùaœ¹¬kØÓ?n"™éà
\13˜‡XÚ¥ŒUŠ†Ø§3,˜‡XÚ¥d^‡?n"
• §S½M‡uÿ†Øµù )Ø3-!3^reš{
-!3ƒA SR BŽž‰1?nì-!êÄÑ!/Œéà
ц!^r¥–¯ kuseg ± /Œ"
• êâ5¯KµNõ MIPS CPU é5go‚Ú êâŠi!Ûó
½i°ņèu"p„ ½öÛó†3|±êâ
CPU þ)˜‡É~"
1„k ')œÛ©š¥ä ܯ‡'XÖžwo‚†——y36 r¦‚ÑŠ
˜«AÏa.¥ä"
92
5.1. °(É~ 1 5 Ù É~!¥ä9Щz
XÚN^Úg€µù -‡8Ò´)½ÂÐÉ~¶§‚^5

±˜«SªJø^‡ÑÖ£XÚN^!°%‡\^‡g€“è±
9ä:¤"
k ¯œØ¬)É~§¦+†\Ï"TЃ‡"'X‡uÿ±Ïo
‚†\ÒØØ^Oś"@´ÏŒõêy“XÚéöŠ?1üè
Àµ?ۆöŠƒ'†Øu)žm±–éJäÑ´=^-Úu
†Ø"¢37LéöŠ†Ø?1ÏXÚ7L‡^ CPU ÜM‡§
Næ^¥ä&Ò"
3ù˜Ùp§·‚‡ww MIPS CPU Nû½ÉÉ~±9^‡‡N‰
5(?nÉ~"·‚¬)ºŸo MIPS É~‰´/°(0!?ØÉ~
\:¿?ؘ ^‡½"
5g CPU ÜM‡¥ä´i\ªXÚ¥~„É~§éžm‡¦î
!kŒU—Ø´ú†Ø"i@É~ ——3˜‡É~?n„v¤
ƒcqu),˜‡É~§ŒUÚå˜ AϯK"
XÚE MIPS CPU ­#éĐª´Š˜«É~5¢y§/^
É~?nõU——¤±˜3ù˜Ù?Ø"
3ù˜Ù"—§·‚¬wü‡ƒ'{KµN^^‡[˜^-£3
-8*Ðś¥‡^¤§„kNE˜‡&Òþ3¡é¥äžJø?Öm
èFÏ&"1 14 ٍ[£ã 3˜‡ý¢!¤Ù MIPS öŠXÚ¥´N
?n¥ä"
5.1 °(É~
3 MIPS © ¥¬wù˜‡áŠ°(É~(precise exception)"ù´˜
‡k^A5§‡n)Ÿok^§\I‡kwwO“Y"
3ÏL6Y‚£½ö^\E,-­U‰1E⤠¼Z5U
 CPU ¥§NX(^S‰1.Ù¢´M‡|©‘ob–"XJM‡
OØ |©§É~ҌU—Tb–³/³}"
É~6Ê3‰1‚§ž§CPU 6Y‚¥„kA^?uØÓãÿ
™¤/(å-"Q,·‚Ž‡U lÉ~ˆ£¿ ØÉ»€X‰1‹
ä‰16§6Y‚¥z^-‡o‰1.§‡oҖ·‚Šv„L˜
" d §·‚I‡P4=^-áu=˜a."
2

XJ˜‡ CPU NX(‰ù‡¯KmÑ)ûY4^‡)¹¦ŒU


N´§@o§Òä°(É~A5"3˜‡°(É~ CPU þ§?ÛÉ~
u)ž§·‚э•˜^-£É~ɳ-¤"3T-ƒc¤k-щ
\Ù¢Œ±téE,§4 CPU ˜ ¥m(J§4É~?n§S)mÏæq­#73
2

˜å§X¬I‡ùoE,Qº

93
5.1. °(É~ 1 5 Ù É~!¥ä9Щz
1.§´É³-9Ù Y-ÒЖl5Òvkm©˜" É~°3

(žÿ§?nÉ~^‡ÒŒ±Ñ CPU ¢yžSK"


MIPS NX(Cu5½¤kÉ~я°("ÜSNXeµ

• ²(‚yµ3?ÛÉ~ƒ §CPU ››Mì EPC э•˜‡


(/§É~?nƒ lT?m©­#‰1"3Œõêœ/§§•É
~ɳ-¶´XJɳ-?u©|ò´øƒS§K EPC •c
¡©|-µˆ£©|-¬­#‰1ɳ-§´ˆ£ɳ
-ò—©|Ñ"ɳ-?u©|ò´øž§ÏMì
Cause(BD) ˜ "

• É~Ñy3-S¥µ‡´˜‡š6Y‚ CPU ù:w ´„§6


Y‚¥É~ŒUu)3A‡ØÓ‰1ã§ù¬—d3‘x"~X§
e˜‡\1-;É /ŒÉ~§‡†/Œ=†®²¤6Y‚ã
â¬u)——Ï~ùž®² "XJe˜^-3ž£fÐ36Y
‚m©¤Ò- ˜‡/Œ¯K§@oK1^-É~¯‡¢S
þ¬ku)"
 ;ù‡¯K§@ÏuyÉ~¿Øá=æ„–¶T¯‡´P
¹¿÷X6Y‚D4"3Œõê CPU O¥§½˜‡A½6Y‚
㊏uÿÉ~/"XJ·‚É~P¹3÷X6Y‚•eD4
ž§P- Ïuÿ¯‡ˆ ù‡ª:‚§džÉ~P¹Ò†
¿ï"3þ¡~f¥§/Œ¯KÒ#P——·‚?nÉ
³-¯K ­#‰1ɳ-Ú Y-žéŒU¬2gu)"
• Y-õϏ6Y‚ϧ?u EPC ¥ɳ-ƒ -
®²m© "´Œ±•\yù -)JجKMìÚ
CPU G§ Œ±yù -ҖÉ~vku)˜§ŠÒجK
± l EPC ­#m© Y‰1L§"
MIPS ¢y°(É~¤š~p§ÏÙ› 6Y‚‰Œ"ù3 FPU
¥cÙî­/²w§Ï2:öŠ²~‡s¤Nõ‡6Y‚ãâU¤"‹3
MIPS FP 2:-ƒ -Ø#NJG£½öˆ§gCÉ~û½
:¤§†M‡U(@2:-ج)É~"
5.1.1 š°(É~——{¤þ MIPS CPU ¥¦{ì
Ð¦{/Ø{-d mult ½ div ù-éÄ/m©§$ŽI
MIPS
‡ü‡MìöŠêx\¦{ì"§S, ux˜^ mflo -£kž„‡˜^
ùØu`§É~ɳ-±9 Y-ŸoÑvZ"´(¢kù‡¦µÉ~(å
3

­#‰1ž§ù -1ÚÉ~Švku)ž1˜"OŽÅNX(“`?ÛB
Š^Ñ7L´˜ ——‰ügژgJ˜"
94
5.2. É~u)žÅ 1 5 Ù É~!¥ä9Щz
mfhi-§X‡ 64 (J½{ꤧr(J£Ï^Mì¥"XJO
Ž„vk(å§CPU Ò¬3 mflo þ{l"
3 MIPS ¢y¥§˜g¦{‡s¤ 4–10 ‡±Ï§Ø{ŒU‡ 15–30"
ÏLrù òž'-©ü‡ã£/uÄ0Ú/¼(J0¤§
-8y¦^Ú~5êüÕá6Y‚¦{ì" 5 CPU Jø
´L-8§)¦\-§‰^‡Jø |^/u÷6Y‚ØӐ
{——œžë1 8.5.5 !"
3ÎÜ MIPS32/64 IOy“ CPU þ§ù -ގ5Ý"´Pª
 CPU kŒU¬Ñ¯K" {zM‡§ÐNX(#N¦{/Ø{$Ž
،ʎ§=¦ÒŽÉ~ØUʎ"~œ¹@Ø¤¯K§´Ž˜e·
‚kXe“è§Ù¥·‚3J˜‡¦{ü(J á=m©,˜^-µ
mflo $8
mult $9, $10

XJu)É~Ù­#m©/Œ´ mflo -§@oUì°(É~5


K§1˜g‰1 mflo -¬žK§Mì $8 ŠÒÚ mflo -l™u)
L˜"Ø3´§mult -dž®²m© § Q,¦{üØÉ~
Ò¬UY$1"3É~ˆ£ƒc§OŽéŒU®²(å §mflo y3£Œ
U´ Y mult -(J"
ÏLS–ü^ š¦{-u mflo/mfhi Ú mult £½öÙ§?یU
4

é hi/lo \#Š-¤ƒm§·‚Œ±;ù‡¯K£Œõê MIPS32 ƒc


 CPU Ñkù‡¯K¤"
5.2 É~u)žÅ
ϏQ,É~´°(§l§S Ýw5É~u)žmÒ´vkÜ
µÉ~ƒc‰1 ˜^-Ò´É~ɳ-c˜^"XJTÉ~
Ø´¥ä§É³-=´ÚuÉ~-"
3;. MIPS CPU þ¥äu) §3¥ä?nm©ƒc¤ ˜^
-Ò´uÿ¥äžÐ(å MEM ã-"É~ɳ-Ò´@^
ff(å ALU ã-"´§‡%5¿µMIPS NX(¿Ø«ì°(
¥äòž§¥ä&Ò3ˆ CPU ؃cŒU‡s˜‡½öA‡ž¨ã­#
ÓÚ"
5.3 É~•þµÉ~?nm©/
Œõê CISC ?nìdM‡£½‡“è¤5©ÛÉ~§Šâu)É~a.
r CPU uxØÓ\:"$–ë¥äъâ=‡¥äÑ\&Ò-¹ 3
4 Ÿo´ü^º3 MIPS32 ƒc CPU þü^fÐ ; mult -m©"
95
5.3. É~•þµÉ~?nm©/ 1 5 Ù É~!¥ä9Щz
ØÓ\:?nž§Ò‰•þz¥ä£vectored interrupts¤"{¤þ§MIPS
CPU éd‰é"XJúù–´˜‡î­Õ§žÄe¡σ"
Äk§3¢‚¥•þz¥ä¿Ø–Ž–@k^"3ŒõêöŠXÚ¥§
¥ä?n§S“裏 !ŽMìϤ§CISC ‡“è""££s¤
žmuxØÓ\:é~„§, öŠXÚ^‡˜‡“Òqsõ
žma=ú?n§S"
Ùg§éJŽ–XJØ^‡“è dM‡U‰õÉ~©Û¶3 RISC
CPU þ§À^Ï~“èÒ®²v ¯"
3d?ÚO?§\ATé RISC ù“ CPU ƒéÙ Œkõ¯%pk
ê"˜‡k^¥ä?n~§‡Ö˜ Mì§3 21 ­VÐÏ CPU§
˜‡ Üo‚±ÏŒU‡s¤ 50–200 ‡Sܞ¨±Ï"éN´3 MIPS CPU
þÑ'ü‡ –¯¯¥ä?n“觤±ù،ŒU¤˜‡5U´
¶"2003 c‡ MIPS32 IO¥\\•þz¥äÀ‘Av<^¯¢§?
˜Úy² ù˜:"
, §=¦3 MIPS ¥§Ø´¤kÉ~Ñ´²"3NX(uÐL§
¥Ñy O"¤±·‚Œ±‰ «©"
• ^r/Œ TLB ­W¿µ3ÉoöŠXÚ¥k‡AOª„É~§
†/Œ=†Xڃ'£ë1 6 Ù¤"TLB M‡U·Ý5êþ
/Œ=†§3˜‡ª„¦^XÚ$1X˜‡J[;ìöŠXÚ§
A^§S$1˜‡ TLB ™P¹Ù/Œ=†/Œé~„——˜‡¡
TLB ™·¥¯‡£Ï TLB Š˜‡d^‡+np„ ¤"
 RISC CPU ffíÑžÿ§^^‡5?nù«œ¹Úu éõ
ƧMIPS CPU ˜‡À¥ TLB ­WYJø ­‡|±"M‡J
ø v Ï¦À¥­WYOÉ~?n§SU 3 13 ‡
ž¨±Ï¤"
ŠÙ¥˜Ü©§~„˜a TLB ­WDƒ ˜‡ØÓuÙ§É~
\:§ù°%`zL­W“èØ^2s¤žmä.u)´
=«É~"
• 64 /Œ˜m TLB ­WµŽ‡|^ 64 CPU þãŒ/Œ˜m
?Ö§Ù/Œ=†gæ^ÑkØÓMìÙÛÚ,  TLB ­W~
§¶MIPS ¡Ù XTLB£·ß/X0“L*Ф"†þ¡˜§ 4y
pÇ^ ˜‡Õá\:"
• زLp„ O“\:µ ¼É~?nžûÐ5U§¥ä\
:7L u²Lp„ ;«"´3XÚéÄžÿØF"ù
"E ½öþ> §p„ 3ЩzƒcØU¦^"XJ\I‡˜‡
èFÚU g·äéēè§éuÚ@ÏuÿÉ~§\
96
5.3. É~•þµÉ~?nm©/ 1 5 Ù É~!¥ä9Щz
^زLp„ Ö;ì\:"3 MIPS CPU p§vkØ^p
„ /ª0——kزLp„ §S/Œ«——¤±k˜
‡ª SR(BEV) ^5rÉ~\:,1©زp„ !é
ÄS kseg1 «"
• Ûó/ECC цµMIPS32 CPU Œ±uÿ˜‡êâ†Ø£Ï~35gÌ
ê⥧´†3p„ ¥^â¬uy¤, g€"3p„ 
«5?np„ †Øw,éY§¤±Ø+ SR(BEV) G´Ÿo§p
„ цÉ~\:o´ uزLp„ /Œ˜m"
• E µééõ85`§rE wŠ, ˜«É~´kn§cÙ´
Nõ CPU éueE £dž CPU ”.­#˜¶Ú­#þ>،«©¤
Ú 9éÄ£dž^‡”.­#Щz¤¦^ƒÓ\:žÿ"Ù¢§
،¶-¥ä NMI (Jƒu9E f‡§«O=3u§‡
–c-Úÿ™¤öŠ(åâ)"
• ¥äµŠ MIPS32 £„k IDT PMC-Sierra @Ϙ CPU¤˜‡
ŒÀ‘§Œ±˜ CPU r¥äÉ~uxüÕ\:"ùéBé
<^µŒU^‡ŠöØU4gC˜‡¿šÊHÏ^A5 4öŠŠ
A~?1?n"
?˜Ú§3Ù¥, CPU þ§\Œ±¦U•þz¥äöŠ——ØÓ
¥ä¦^õ‡ØÓ\:"ù´ä¢Ÿ5Cz¶3ÙO/ù
L§MIPS DÚ´¥ä3^‡?nžâk`k?"\kü‡¹
Ä¥ä ØØÀJÀJ˜‡¥ä\:ž§M‡7Lû½.=‡`
k?p"Ï ù‡Czé^‡K‡Œõ§Ï^‡Ô” é¥ä
`k?››¶öŠXڑo< ÚM‡ó§“ØØ;—ÜŠ"
¤kÉ~\:Ñ u MIPS ;ìN”¥ØŠ/Œ=†«§Ø‡
p„ \: u kseg1 §I‡p„  u kseg0"؇p„ 
\: SR(BEV) ˜ ž´½§´ SR(BEV) ˜"ž§ÒŒ±é
EBase Mì?1?§5²£¤k\:——˜å——OS¬"\
CPU ´ kseg0 ;ìõ?nìXژܩ§´Ž‡ÚXÚ¥Ù§
CPU ©müÕÉ~\:žÿ§Œ±£Ä¥äČUåÒAOk^" 5

3ù /Œ«§L 5.1 ‰Ñ 32 /ŒÏLÎÒ*Ð 64 SN”"3


32 ¥§S/Œ 0x8000 0000 Ú 64 ¥ 0xFFFF FFFF 8000 0000 ƒÓ"
L 5.1 £ã =k 32 /Œž\:——L¥ BASE “L?§
EBase Mì¥É~Č"
ÐÉ~•þmål"Ž 128 i!£0x80¤˜m§ŒU´ÏÐ
MIPS NX(“ú 32 ^-v ?èÄÉ~?n~§ §ØL¤õ
5 EBase Mì´3 MIPS32/64 5‰1‡¥Ú\"
97
5.3. É~•þµÉ~?nm©/ 1 5 Ù É~!¥ä9Щz
S Že ˜^©|-œy“§S ékùo!Ž"
L 5.1: É~\:
S« \: É~?n§3d
¡þNÁ 0xFF20 0200 EJTAG NÁ§N/probe0;«
ž"ë„1 12.1 !'u EJTAG ¡þN
ÁXÚ5)"
0xBFC0 0480 EJTAG NÁ§¦^~ ROM ž"
E £=k ROM¤ 0xBFC0 0000 E 9،¶-¥ä\:"
ROM \: 0xBFC0 0000 ¥ä;^——= Cause(IV) ˜ ž¦
^§¿š¤k CPU Ñk"
0xBFC0 0380 ¤kÙ§É~"
0xBFC0 0300 p„ †Ø"
0xBFC0 0200 {ü TLB ­W£SR(EXL)"¤"
RAM \ BASE+0x200+... õ ‡ ¥ ä \  :—— VI  ª õ Ô
‡§EIC ª 62 ‡"
BASE+0x200+... ¥äAÏ/;^£(Cause(IV)¤˜¤"
BASE+0x180 ¤kÙ§É~"
BASE+0x100 p„ †Ø——3 RAM ¥´[
²Lزp„  kseg1 I"
BASE+0x000 {ü TLB ­W£SR(EXL)"¤"
e¡´ MIPS CPU û½?n˜‡É~ž¤‡‰µ
1. ˜ EPC •­#m©/Œ"

2. ˜ SR(EXL) §r› CPU ?\SØ£pA?¤¿ BŽ¥ä"

3. ˜ Cause Mìù^‡Œ±wu)É~Ï"3/ŒÉ~
ž§BadVAddr ‡˜";ì+nXÚÉ~І˜, MMU M
ì¶18Ù¬[ù)"
4. , CPU m©lÉ~\:§d ˜ƒ‰^‡?n"

éáÉ~?n~§Œ±§$13 SR(EXL) ˜ G£=·‚¤`


É~ª¤§l5جI‡- SR Ù{Ü©"éu\DÚÉ~?n§
S§G ò››‰E,^‡§É~A?Jø˜‡oÐ4XÚ
^‡Œ±3ÙeS/' ­‡G——)P SR Š"
\þA‡E|§ù‡Å›Œ±3Ä TLB ™¥?n§Sp#Nêþ
i@É~§´ù‡¯K·‚-žÿ2c[ù"
98
5.4. É~?nµÄL§ 1 5 Ù É~!¥ä9Щz
5.4 É~?nµÄL§
¤k MIPS É~?n~§Ñ‡²L±eƒÓãµ
• Úµ3É~?n§S\§¥ä‹ä§SkéG&E
e5§¤±1˜‡‡‰¯Ò´‰\gCCÑv ˜mU ‰\Ž‡‰
§ ؇CX¥ä§S­‡êâ"
ùA7,´ÏL^ k0 Ú k1 Mì£S.þ½™$?. É~?n
“è¤3¤Ú^˜ãŒ±Ù§MìS˜m5¢y"
• ?nØÓÉ~µÎ Cause(ExcCode)§ÙŒUŠÑ3L 3.2
¥"§wŠ\Ÿou) É~§#NöŠXڏØÓÉ~½ÂØÓ
¼ê"
• EÉ~?n‚¸µE,É~?n§SŒU¬^p?ŠóÖ§\ŒU
F"U¦^IO¥¼ê"\òØØJø˜¬æÒ;«Ù§^‡Ñvk
^§?Û CPU MìŒUé¥ä§SÚN^~§#N
UCMì"
k öŠXڌU3ux/© ?nØÓÉ~ƒc‰ù‡óŠ"
• ?nÉ~µy3\Ž‰Ÿo҉Ÿo"

• Oˆ£µp ¼êÏ~Šf§S5N^§Ï ‡ˆ£. ?n“è"


3ùp§Mì¡E§ÏLr SR U£fu)É~ Š
CPU ±ˆ£ÙS£Sت§É~'4¤G"

• lÉ~ˆ£µÉ~(å?n´,˜‡ CPU Gu)Cz«§éùÜ


©£ã3e51 5.5 !p"
5.5 lÉ~ˆ£
››ˆ£É~ɳ-¿lSØUC£XJI‡¤$A?7L
Ӟ¤£^OŽÅ‰Æ1{5`§Ò´“f”¤"=¦\3A^§S¥±
SÚA?$1˜^-¤˜‡S¦É¶,˜¡§±^rA?Áã$
1˜^S؍-¬——·É~"
MIPS CPU k˜^- eret ¤‡óŠ¶T-Ӟ˜Ø SR(EXL)
¿ò››ˆ£ EPC ¥/Œ" 6

é@Ï MIPS CPU PkE,ś§6uü?æÒ5Ú¡EÉ~c SR(IE, KU)


6

Š"ƒ†£É~cªd˜^- rfe 5¤§7L˜3ˆ£¥ä§S jr -ò


´ø¥$1"

99
5.6. i@É~ 1 5 Ù É~!¥ä9Щz
5.6 i@É~
3Nõœ¹e§\ŒUŽ‡3\É~?n~§¥#N£½öÃ{;¤?
˜ÚÉ~¶ù¡i@É~"
XJ?nØ&§ùŒU—·b¶¥ä§S‡³G3 EPC Ú
SR ¥§\7LýOÙ§É~ŒU¬ÀKي"ØÑ ˜‡š~AÏi@
É~ƒ §¦UÙ§É~ƒcÑ7Lù MìSN"d §˜ ­#¦
UÉ~§\ÒØU26É~?n3Ï^Mì k1 Ú k2 "
˜‡É~?n§S‡ŽU ¹L˜‡i@É~§7L¦^, S«
5MìŠ"¤^êâ(~~‰ É~v¶i@õ‡É~vÏ~S
ü3˜‡æÒþ"
zgÉ~/‡žÑæÒ] §¤±ØÓN=?¿Ýi@É~"ŒõêX
ډz«É~˜‡`k?§¿ Sü¤3?n,‡É~ž§#Np`k
?É~"ùXڐI‡k‹`k?Ó‡ê˜õÉ~vҌ± "
\Œ±;˜ƒÉ~¶¥äu) Œ±^^‡ü‡¶-K±÷v`k?5
K§^ SR(IE) Œ±˜g5¶-ܥ䧽öÏL£ 5 CPU âk¤É~
? Ûª¶-ü‡¥ä"Ù§a.É~Œ±ÏL·^‡å5;"~
X§3Ø%£ŒõêÉ~?n^‡¤^¤ØŒUu)A?Š‡É~§§S
Œ±;ÏŒ†ØÚ TLB ™·¥É~"?np`k?É~žù‰´ýé7
‡"
5.7 É~?n~§
e MIPS32 “è¡ä´{üØU2{üÉ~?n~§ "zgÉ
~žØ 4O˜‡Oêì ŸoÑ؉µ
.set noreorder
.set noat
xcptgen:
la k0, xcptcount # get address of counter
lw k1, 0(k0) # load counter
addu k1, 1 # increment counter
sw k1, 0(k0) # store counter
eret # return to program
.set at
.set reorder

ù‡~fwþvkŒ^?µØ+Ÿo^‡—É~§ˆ£ T^‡
,3§¤±Ò¬7f5£$1"Oêì xcptcount Ð3 kseg0 ¥§ù\
3ÖžÿÒج TLB ™·¥É~"
100
5.8. ¥ä 1 5 Ù É~!¥ä9Щz
5.8 ¥ä
É~ś´Ï^§´¬Ì/`kü‡É~a.u)gê'Ù¦
MIPS
¤kÉ~\å5чõõ"˜‡´3– Unix ù‰1;ìNöŠ
ŒXÚþA^§SrÑ ¡þ/Œ=†L½>.¶·‚±c¡JLù
˜:§318Ù£LÞ52wù‡¯K",˜‡61É~Ò´¥ä§ CPU
ÜI‡5¿žÿ)"Ϗ·‚‡?n Ü­.ج–·‚§¤
±¥äÑ֞m ´é' "
i\ªXÚ MIPS ^rAT'%¥ä §ùÒ´Ÿo‡üÕ^˜!
;€5ù"·‚ùeA‡¯Kµ
• MIPS CPU ¥¥ä] µùÜ©£ã\‡^ÀÜ"

• ¢y¥ä`k?µ¤k¥ä3 MIPS CPU ¥Ñ´²§´3\XÚ


¥§\ŒUF"é˜ 'Ù¦¥ä‰†õ'ì"
• .«!BŽ¥ä!&Òþµ~~k7‡3, ' 5öŠ¥m“Ž¥
䧴3 MIPS CPU þù‰käN(J"·‚‡wwNo)û"
5.8.1 MIPS CPU ¥ä]
3§ Cause Mì¥k˜|l‡Õá ¥ä "3Œõê
MIPS CPU 7

CPU þ§\¬uyÙ¥Ê8‡&Ò5g ÜÜ6§ , ü‡´X{^‡Ö


"¡þOêì/½žì£„1 3.3.5 !§d Count Ú Compare Mì
¤¤ë‚Ù¥˜‡¶kžŒUOêì/½žì¥äۘ‡ ܐ˜
‡¥ä§´ù‰õŒ´‡ Ì¿"
?ÛÑ\&Ò>²3z‡±Ïæ˜g§XJ´UÒ¬—É~"
CPU ´Ä¿ƒA,‡¥äÉ SR ¥ K"kn‡ƒ'µ

• Û¥ä¦U SR(IE) 7L˜ 1§ÄKجÑÖ?Û¥ä"

• SR(EXL) £É~?¤ Ú SR(ERL)£†Ø?¤ §XJ˜ ¬BŽ¥


ä£Ï;É~ƒ Ù¥ƒ˜7,˜ ¤"
• GMìk„kl‡ü‡¥ä¶- SR(IM)§Cause Mì¥
z‡¥äˆ˜ "z‡ SR(IM) ‡˜¤ 1 ±#NƒA¥ä§ù§S
Œ±(ƒ=‡¥äŒ±u)§=‡Ø1"
7 XJ3 EIC ª¥ÒØ@oÕá§ë1 5.8.5 !"

101
5.8. ¥ä 1 5 Ù É~!¥ä9Щz
^‡¥ä ´ZŸo^º
. CPU Ÿo‡3 Cause M å§^‡ò‹m¥ä¶-§3–
ì¥Jøü‡AÏ §Øš¶- ^¥äÒ¬u)"
ÄK˜ ˜ Òá=Úu˜‡¥äQº vkýéÏ`ŸoÓ
‰Y' 3u/ؚ¶-0" J،±ÏLXÚ^‡[£'X|
ù‡;.^{´p`k?¥ä~§ ^S¥áI“¤ˆ§´^¥
L«òk$`k?¥ä~§‰1 ä 'B§ÏÙ±4$M‡¤
¹Ä§˜ XÚ®²?n¤kp`k i\3®k¥ä?nś¥"
?óŠś"p`k??n(
‡uy/«/éÑc@‡¥ä3¹Ä§\‡ w Cause MìS
Ü"5¿ù Tд——c?O——ؘ½éAuÄkÚu¥äÉ~
ª"Cause Mì¹ÄÑ\>²Ú SR(IM) ¶-éà Ó ˜§±“
\˜‡é¦‚?1“†”öŠ"^‡¥ä ?3$ §M‡¥äg4O"
^NX(âŠ5ù§¤k¥äÑ´²" ?n¥äÉ~ž§P 8

ª CPU æ^/Ï^0É~\:——MIPS32/64 CPU CPU Jø ŒÀ


ØÓÉ~\:3‰¥ä¦^§ùŒ±!ŽA‡±Ï"^ Cause(IV) M
ì Œ±ÀJù˜A5"
¥ä?nªm©u\É ˜‡É~¿l Cause(ExcCode) uyT
É~´˜‡M‡¥ä"ÏLÎ Cause(IM)§·‚Œ±éÑ=‡¥ä3¹Ä
Ò´=‡ž¦ÑÖ/uÑ&Ò"Ï~SXeµ
• Î Cause Mì IP §¿Úc¥ä¶- SR(IM) ‰Ü6“†”ö
Š§±¼¹Ä!#N!¦U¥äž¦ ã"ŒU؎˜‡§Ù¥?
ۘ‡ÑkŒU´—¥äÏ"
• ÀJ˜‡¹Ä!#N¥äƒ±'5"ŒõêöŠXډØÓÑ\©
½`k?§¿‡¦k?np`k?§ùÑ´^‡û½"
• \I‡3 SR(IM) ¥P¥ä¶- §´\ŒU®²3ÌÉ~~
§¥®² ‡ SR Mì"
• ?U SR(IM) ±(c¥äÚ\^‡@äkƒÓ½ö$`k?
¤k¥äBŽ"
• XJ\vk3ÌÉ~~§¥Š{§i@É~?n7‡G
£^rMì¤"
• y3?U CPU G±·A¥ä?n§Sp Ü©§3d?k i@
¥ä½öÉ~´#N"
8 3•þz¥äÚ“EIC ª” ¥®²Ø2Xd §ë„1 5.8.5 !§´é^"
102
5.8. ¥ä 1 5 Ù É~!¥ä9Щz
3¤kœ¹e§˜ Û¥ä¦U SR(IE) ±#N?np`k?¥ä"
\˜ØÉ~?žÿ§„I‡?U CPU A? SR(KSU) ±±
CPU E,?uØ%§,„‡é SR(EXL) ˜"±lmÉ~ª§4
éGM줊?U3O?Œ±w"
• N^¥ä~§"

• 3ˆ£ž§\I‡2gBŽ¥ä±BU ¡E¥äcM슿X‰
1¥ä?Ö"‡ù‰§ÒI‡˜ SR(EXL)"¢S¥§3?\É
~—ڽƒcr‡ SR Mì¡Efu)É~žŠL§¥§Œ
U®²Û¹/˜ SR(EXL)"
é SR ‰CЧ\I‡c[Ä@ J¬Ï6Y‚öŠ ò´
CÄ——“CP0 ‘x"”k'[!±9N?§ŽÑ‘x§ë„1 3.4 !"
5.8.2 3^‡¥¢y¥ä`k?
£†#•þz¥äõU±c¤MIPS CPU éu¥ä`k?k˜‡
{ü{¶˜ƒ¥äÑ´²"
XJ\XÚ¢y¥ä`k?üѧ@oµ
• 3?۞ÿ^‡Ñ‡‘o˜‡²(½Â¥ä`k?£IPL¤§CPU ±T
`k?$1"z‡¥ä ©Ù¥˜‡`k?"
• XJ CPU ?u$¥ä`k? IPL§K#N?Û¥ä"ù´~§S
$1G"
• XJ CPU ?up`k? IPL§KBŽ¤k¥ä"

¥ä?n§SØ=Œ±U쩉äN¥ä `k? IPL $1§§S


„Œ±,pÚü$ IPL"°Ä§SA^à†M‡½¥ä?n§SÏ&Ü
©~~I‡3.«“Ž¥ä§¤±§S ¬ž,p IPL ±š
¥äÑ\ "
3ù˜‡XÚ¥§3ØK$`k?“ècJeUY#Np IPL ¥
䧤±·‚ÒkŬé, ¥äJøÐ¥äAžm§Ï~^±†¥ä
?n§S«ì3ážmS$1."
Œõê UNIX XÚko8‡ IPL"
,kO‰{§{üYÑk±e5Ÿµ
• ½`k?µ3?Û IPL§c¥ä±9$`k? IPL ¥äBŽ§
´#Np`k?¥ä"éӘ IPL ØÓ¥ä§;.Nݐ{´
k5kÑÖ"
103
5.8. ¥ä 1 5 Ù É~!¥ä9Щz
†$1“èƒéXµ?¿‰½“è¡äo´3Ó IPL e$
• IPL
1"
• {üi@NÝ£3 IPL 0 ±þ¤µØ 3$`k?ƒ §˜vk¹Ä
p`k?¥ä҈£¥ä“è"3$`k?§ékŒUk‡NÝ
ì3ØÓ?փm CPU"3˜ãžm¥ä¹Äƒ |^ù‡Å¬
?1­#NÝé~„" 9

3 MIPS CPU þØÓ¥ä?Oƒm=†–Š‘XGMì SR U


C§Ï@‡M읹¤k¥ä›› "k˜ XÚþ§¥ä?O=†
I‡9é ܥ䛛M‡?1öŠ§ŒõêöŠXÚk˜ ÛCþ‡U
C§d?·‚¿Ø'%ù ¶y3·‚‡^ SR ¥ä˜‡äN˜5x
IPL"
3 MIPS NX(¥ SR£–¤k?nìM오ØU†éü‡
˜"½˜ "Ï IPL ?ÛUCÑI‡˜ã“è^üÕöŠÖ!?U!
¿£ SRµ
mfc0 t0, SR
1:
or t0, things_to_set
and t0, ˜(things_to_clear)
2:
mtc0 t0, SR
ehb

£ ˜^- ehb ´˜^‘x“o-§ë„1 3.4 !"¤


˜„5`§Tã“菌U¥ä§ùÒÑ ˜‡#¯Kµb·‚
3IÒ 1 Ú 2 ƒmu)˜‡¥ä¿ @‡¥ä~§gÚå SR Czº@o
3IÒ 2 ?\·‚gC?UL SR Šž§·‚Ò¿” T¥ä~§¤–\
Cz"
¯¢(JL²§k3Œ±y?ۘãäN“è IPL Ñ´~ꣿ
$1ž SR جkÙ§UC¤XÚ¥§·‚U^þ¡“è¡ä——و«
‡3 MIPS öŠXÚ¢y¥ƒÊH—— ØU¬Ñ¯K"XJù ^‡
¤á§=¦·‚3Ö-?U-\S¥m‹ä§vkŸoˆ³"¥ä
ˆ£ž§ò¬±Ú±cÓ IPL ,Ò´Ó SR Š‰1"
3ù‡b½Ø¤á/§·‚I‡e¡?Ø"
5.8.3 f5±9é SR f?U
3kõ‡››‚§XÚ¥——)‘k¥ä?n§Sü‡A^——\
XÚ3¥äƒ ­#NÝ£=¦¥ä?Ö?uØ%¤¡sÓª§3 2004 c
9 Linux

v2.6 ‡¥§sÓªNÝ®²¤ Linux IO‰{"


104
5.8. ¥ä 1 5 Ù É~!¥ä9Щz
²~¬uygC3‰,‡¥m؎Œ´‹ä¯œ"^ªŠó5`
ò§Ò´\I‡˜|?UöŠU f5¤§±yXÚ¥˜ ܊?Ö
Ú¥ä~§‡owT|öŠÜ¤§‡oŠ˜‡Ñvk‰1§´ýج
w‰1¥mG" ¢yf5?U“èkž‰.«"
10

3^‡$1õ‡‚§ü?nìXÚþ§˜‡4c‚§¿ŽØ‚§
ƒ†U´¥ä J"¤±3ü?nìXÚ¥§ÏL{üæ^BŽÜ¥
ä{Œ±o?Û.«¶ù,©%ék"
´X·‚þ¡¤„§ù‰k‡¯KµØUyBŽ¥äÚ½£‡¦
é SR ‰1˜‡Ö-?U-\^SöŠ¤´f"·o«)û
{ژ«;{"
XJ\$1\^‡¤k CPU Ñ¢y MIPS32 1‡§ÒŒ±
)ûù‡¯Kµ3ù«œ¹e§\Œ±^ di -“ mfc0"di f5/˜"
SR(IE) §¿rk SR ˆ£˜‡Ï^Mì¥" ´3 MIPS32 1
11

‡oN5¤IO˜ š~ ˜ƒc§\ŒUI‡?˜ÚwwO{"
˜‡Ï^‰{´j±Ø#N¥ä?UŒ¥ä“è SR Š¶ù҇
¦¥ä~§[‡3ˆ£c¡E SR§Ò–‡¦¡E¤k^r?Mì˜"X
Jù{§þ¡šf5 RMW SÒvk'X¶=¦¥ä\¥m§\^
P SR Š,´("ù«{ÊH^3 MIPS þ UNIX ƒa OS S
Ø¥§¿ Úzã“èц½ IPL ƒé¥ä`k?Xڃ?éÐ"
´kžÿù›õ "~X§\3zg˜‡i!ÑÑàþ
ux ˜‡–i!ž§\ŒUŽ3kõê⌱uxƒcBŽ“u
xOД ¥ä£±;ØÊ¥ä¤"„k§k XÚ¬3ØÓ¥ämÓ=
`k?±(¥äÑÖþ!©Ù"
,˜‡)ûY´^˜‡XÚN^5BŽ¥ä£ŒU\‡òTXÚN^½
Âæ^üÕ˜ ژ"ë걃A#Mì¤"Ϗ syscall -ÏL
ÚuÉ~5󊧧U ±fªBŽÉ~"3ù«oe§\˜ ژ"
öŠŒ±¯^|/?1"XÚN^É~?n§Sˆ£ž§Ò¬¡EÛ¥
ä¦UG£E,±fª¤"
XÚN^få5Д´ƒ­þ?‰{§Ù¢Ø˜½sžm¶´\
rTXÚN^ÚXÚÙ§É~© “èn˜Ù"
1n‡)ûY——¤k̇XÚі3, .«¬^——Ò´
¦^e!¤ãë£\1Ú^‡;-ïá.« Ø^BŽ¥ä"†þ¡
ùë{ØÓ§ù‡Å›U (*Ðõ?nìÚM‡õ‚§XÚ¥"
X˜éP{¤`µ/û؇‰äfÚ¯fwŒ¤¬0——·Uùé{n)§OŽÅ9Ù^‡
10

Ñ´ä¯f"
„k˜^¦U¥ä ei -§´Ø‡^§——^ di-ˆ£ SR Š¡E§ùXJ\N^ di
11

ž-|¥ä®²BŽ{§\“BŽ¥ä”“èU~óŠ"

105
5.8. ¥ä 1 5 Ù É~!¥ä9Щz
5.8.4 #N¥ä.«µMIPS ª&Òþ
&Òþ ´¢y.«£,*Ð&ÒþŒ±‰õ¯œ¤˜«?§
12

½"&Òþ´d¿u$1?§S«§^5Sü, ˜gUd˜‡?
§–¯] "
z‡f‰1“è¬Ñke¡(µ 13

wait(sem);
/* do your atomic thing */
signal(sem);

Œ±r&ÒþŽ¤ü‡Šµ1 ¿›X“Ó^” 0 ¿›X“Œ±


^”"signal() {ü§Ò´r&Òþ 0" wait() uTCþŠ´Ä
14

0 §X؏"K˜† 0 âUY", òTCþŠ 1 ˆ£"ù‡AT


ØJ§ATw' /3uu sem Š¿­#˜L§7L´
f"p f5£N^ wait() ‚§¤6uU ï¤. f5§
. f5‡Uy“ÿÁ ˜”öŠ3¥ä¡c£½éuõ?nìXÚ§3
O CPU –¯¡c¤U($1"
Œõê¤Ù CPU [xk, Aύ-^uù‡8µ680x0 ——ÚN
õÙ§——CPU ÑPk˜^f5ÿÁ ˜-¶x86 CPU k˜^“
†MìÚS”öŠ§Œ±ÏL“lock”cMf5‰1"
éuŒ.õ?nìXÚ§ù«ÿÁ ˜öŠC[B¶3^r¼&Ò
þ¤ÿÁ ˜öŠ§„k˜ŠöŠDÂXÚ¥z‡p„ °
L§¥§Äþ¤k;ì–¯Ñ7Lʎ"ù«{3Œ.õ?
nìXÚþ*Ð5ØЧϏ== yUÓ4óâ^ÀÜ {l
NõŒUÃ';얯"
XJ#NØ7¯kyf5Òm©$1“ÿÁ ˜”öŠ§=¯ 
(¢´f5žÿ“˜”öŠâU¤õ{§@oÇÒ¬põ"I‡
wŠ^‡˜öŠ´Ä¤õµù™¤õ“ÿÁ ˜”öŠSŒ±Ûõ3
wait() ¼ê¥§7‡ž­Á" 15

ùÒ´ MIPS k§g^ ll(load-linked) Ú sc(store-conditional) -"sc


=3M‡(@glC ll ±5vk¿–¯žâ\ƒA/Œ ˜§¿
3Mì¥3e˜‡ 1/0 ŠL²öŠ¤õ½ö”}"
{ü&Òþ‰p½§šª/¡“£”"
12

ù´ Dijkstra 3 1970 c“ãJÑVg§a'uc´&-XÚ·¶“&Òþ”"Hoare


13

òÙí22“pƒÜŠ¿1?§”‚¸§rŸþÓõU¡ wait() Ú signal()


——Ò´·‚ùp^"Dijkstra Ð·¶ p() Ú v()"XJ\ùÖ=Š{§ÒéN´n)
Ÿo‰“p”Ú“v”"
éuöŠXÚ¥‚§-‚§m&Òþ§signal() „‡‰ 󊱓ˆ2”3–T&Òþ?˜
14

?§"
,\ÐU yجÑy [­Áeœ/——´XJ^Ù§a.&Òþ§\
15

o‡y–?ց U ‰1"
106
5.8. ¥ä 1 5 Ù É~!¥ä9Щz
3Œõê¢y¥§ù«&E´*µkž=¦ƒA/Œvk-L sc
¬”}¶XJglþg ll kL¥äÑÖ CPU Ò4 sc ”}§„kŒõêõ 16

?nìXÚ3éӘ‡p„ 1ŒS¬þ?ÛöŠÑ¬”}"
˜­‡´vk¿–¯ž sc Ï~A¤õ§kžÿyo´”}"
e¡´éŠ&Òþ wait() öŠµ
wait:
la t0, sem
TryAgain:
ll t1, 0(t0)
bne t1, zero, WaitForSem
li t1, 1
sc t1, 0(t0)
beq t1, zero, TryAgain
/* got the semaphore... */
jr ra

´õ?nìu²"´=¦3ü?nìXÚþ§ù«öŠ´
ll/sc
ékdŠ§Ï§¿Ø9'4¥ä"ù«ª; þ¡JBŽ¥
ä¯K§¿ Œ±3~€œ/e¥äòž¥užŠ^§3i\ªXÚ¥A
OI‡"
5.8.5 MIPS32/64 CPU ¥•þzÚ EIC ¥ä
5‰1‡——Äk3Ñg MIPS úi 4KE Ú 24K x?nì
MIPS32
CPU Ø%——\\ ü‡#A5¦¥ä?nǍp"ùŽe¤Ø
õ§3Œ.öŠXÚ¥ŒU¿Ø­‡§´ MIPS CPU ^3š~Hù«
U?. i\ª‚¸¥"ùü‡A5Ò´•þz¥äژ«¡EIC ª
ŒJøŒþØÓ¥ä‰ CPU {"
XJ\é^•þz¥äA5§˜‡¥äÉ~ò¬Šâ—¥äÑ\&Ò
ll‡/Œ¥ÀJ˜‡m©‰1/Œ"ùpŒU¬k”‡ 5µvkŸ
oÀÜU {Žü‡¥äӞ¹Ä§¤±M‡ÒÀ^vkBŽ¹Ä¥ä&Ò
¥?ҁp"•þz¥äÏLé IntCtl(VS) ?§5˜§éuØÓ¥ä\
:må‰Ñ A«ØÓÀJ£"Š—¤k¥äÑ´^Ó\:§ùÒ£
 Dډ{¤"
i\ªXÚ~~kŒþ¥ä¯‡&Ò§‡LDÚ MIPS CPU 8‡
M‡Ñ\"3 EIC ª§ù8‡±cƒpÕá&ÒC¤˜‡ 6 ?›êµ
"“Lvk¥ä§´3e 63 ˆØÓ¥äè"3 EIC ª§z‡š"“
èkÙgC¥ä\:§#N·O¥ä››ìU †© CPU ?n
õˆ 63 ‡¯‡"
16 (ƒ/`§XJ‰1L eret -"
107
5.9. éÄ 1 5 Ù É~!¥ä9Щz
•þz¥ä£Ø+´DÚ„´ EIC &-¤3\XÚk˜ü‡¥ä
AOª„½öéžm‡¦AOî‚|Üe´k^"3E,p?ö
ŠXÚåe§!Žeþž¨±ÏéŒUϏˆ«å Ԕ§¤±‡´
uy\¨OöŠXÚvk^ù A5§žØ‡aÛ%"
5.8.6 KfMì
=¦^¥ä•þ§¥ä?n~§„kI‡Kú;¥ä“èMì
Š§7L3‰?Ûk^óŠƒcC\gC/Œ"
MIPS32/64 5‰1‡#N CPU Jø˜‡½‡õ‡ØÓÏ^Mì
|µ Mì|‰KfMì"KfM쌱^u?Ûa.É~§
´é¥äk^"
˜‡|^KfMì|¥ä?n§SØI‡¥ä§SM슧
N^L§¥Œ±3gCMìp±gG£XJõu˜‡¥ä?n§
S¦^KfM짧‚ÐÒX^=‡M숤˜—¤"
˜‡^ •þz¥äÚKfMì|¥ä?n§SŒ±l[Ö¹+n
)øÑ5 $1œ¯/wÍ/¯</Œaú"´¯Kq5 §ù‡
`³ŒUöŠXډ-K £AO´§ÏöŠXÚkŒUr¤k¥äBŽ
˜ãžm§ùãžmŒU‡L·‚‡?¯¥ä?n§S$1žm¤"
k Œ±lKfM쥼ÃA^§S¦^˜‡õ‚§ CPU NU˜
Ù/ÂÓJ§´ù‡{KŒÒŒ ——Œ±ëN¹ A"
5.9 éÄ
'u3 CPU þ^‡Œ„J§E AÚÉ~˜§,´˜«Ø
¬ˆ£É~"3Ð MIPS NX(¥§ù‰Ì‡´˜«²Lþ!¢
y¤Ú© "´ 5 CPU ®²Jø leE ˜†،¶-¥äA«
ØÓ?O gE "3 MIPS ¥§E ÚÉ~^‡3ØØú/pƒKX"
·‚‡E^~5É~ś§3E EPC •uÿE ž3‰1
-§ŒõêMìŠÑ3 "´E »€ ~öŠ§E u)ž
3\1Mì½3\½­Wp„  ˜þŠŒU¢ïêâW
¿"
^²LE E,±ØCG5¢y, k^)kÓ£ ™NÁ
´ŒU§´I‡\M‡ó§“a"CPU Ã{«©E u)u3$1
Xڄ´ffþ>"kÅ ™NÁ3‰UâÖöŠŠ’¶·‚­:
˜3XÚlÞm©éÄœ/"
CPU AE žl/Œ 0xBFC0 0000 ?m©"ù´Ø^p„ 
kseg1 «Ôn/Œ 0x1FC0 0000"

108
5.9. éÄ 1 5 Ù É~!¥ä9Щz
E ƒ §CPU ››Mìkv G®²(½§Œ±4 CPU ‰1šp
„ -"“v G”)ºff ¶5¿±eA:µ
• SR ¥UynÀܵCPU ?uØ%¶¥ä´BŽ¶É~Ú
زp„ \:——= SR(BEV)=1"3y“ CPU þ§y
cü‡£±9õ¤^‡;.‰{Ò´òÉ~ª SR(EXL) ˜ §
rE wŠÉ~Ù¢®²Û¹ ù˜ ¿g"
• p„ ?u‘Å!ÿÂG§¤±lp„ \1ŒUØÖ
;ì †ˆ£-Ã"
• TLB ?u‘ÅG§3ЩzƒcýéØU–¯£3k CPU þM‡
é TLB L‘­EŒUºxko§(JŒU´ TLB '4§
UÏL2˜gE âU?E¤"
DÚéÄÚ½Xeµ
1. ©|Ì ROM ¥“è"Ÿoy3Ò©|Qº

• šp„ É~\:l 0xBFC0 0100 ?m©§¿vk‰éē


è3ev ˜mŒˆ/g,Êî0?——ù‡·‚é¯
ÒØØ©|"
• ©|-´˜‡š~{üÿÁ§Œ±4·‚w CPU ´ÄõU
~¿U ¤õ/֍-"XJM‡u) اMIPS CPU
ékŒUUYU^S£e˜‡-4ŒUu)[ÈÉ~¤"
XJ\^ÿÁU Jl CPU Ö/Œ§Ò¬w«Ñ CPU
E šp„ ¶XJ CPU éÄ¿ ©| (
/Œ§\ÒkryâL² CPU l ROM ¥ÖêâÄþ
("
‡ƒ§XJ\ ROM §S†c? áÏ SR§{ü†ØÒ
ŒUÑyˆ«ZÛz%ÚJ±ä(J"
2. rGM오,«®k¿ÂG"y3Ҍ±3šp„ 
«Œ‚/?1\1Ú; "
3. \ŒUØؘ†3Mì¥$1§˜†¤˜Ü© RAM ;ìÐ
©z£éŒU¤„kéÙ5˜‡¯„u"ù‡L§ŒU¬éú£·
‚,3šp„ « ROM ¥$1¤§¤±\ŒU‡r\ЩzÚ
u›˜¬U NBe ROM §SêâS«S"
4. \ŒU„ØØÚ Ü­.£˜‡››à½öäM줊 éX§
±BU wЩzL§¥¯K"
109
5.9. éÄ 1 5 Ù É~!¥ä9Щz
5. y3\Œ±‰gC©˜ Ҙm§¿˜Ðv õM짱BU
N^IO C ~§"
6. \y3Œ±Ð©zp„ , ÓÑ$1"k Xڌ±lp„ $
1 ROM “è k ØU¶3Œõê MIPS CPU þ§•p„ Jøêâ
;ì7LU Jø 4/8 ‡iâuDѧ\ ROM fXÚؘ½U
÷v"
5.9.1 uÿÚ£O\ CPU
\Œ±l PRId(Imp) Ú PRId(Rev) 5£OE@\ CPU ¢y
Òڂû½Â‡?¾Ò"´Ð¦ŒU6ù &E¶XJ\6
PRId§Œ±’½=¦ò5 CPU vk?Û¬‰§S‘5æ†#A5§\
ò؏# CPU ?U\§S"
‡\U†uÿ,‡A5§Ò@‰jœ3ØU†?1Œ‚uÿ/
§éu MIPS32/64 oN CPU§3.3.7 !£ãˆ‡ Config M쥝¹
kŒþk^&E"k3^¦ Ù§¤k{ƒ ÑØ1§ùžâATÄ
PRId"
ØL§Ú ROM Úä^‡’½‡±,«´Ö/ªw« PRId"XJ\
Ø؝¹˜‡¢3-<د^‡?^5ŽÑM‡"€{§Ð‰{´
4“èŠâ PRId ^‡‰1§ù\“è3ò5? M‡¥Òج^
"
Q,·‚í\uÿˆ‡A5§3ùp‰Ñ˜ N‰~fµ
• ·‚k2:M‡íº\ MIPS32/64 CPU AÏL Config1(FP) M
ì wŠ\"éuPª CPU§˜«íE|´˜ SR(CU1) ¦
U?nì 1 öŠ§¿^˜^ cfc1 -l?nì 1 Mì 0 ¼Ù¥
NB‡Ò ID"ProcessorID £ 8–15¤š"ŠL²3 FPU
M‡——²~¬3 PRId(Imp) wÓŠ"˜‡±~¦݄
ؘ%§S ŒU„¬Xu´ÄUl FPU Mì\ÚÖ
17

êâ"ؚ\XÚ|±Ã^‡¦^2:ü§ÄKO#P E
SR(CU1)"

• p„ Œµ3˜‡ÎÜ MIPS32/64  CPU þ§6u˜Mì


Config1-2 ¥?芌U¬Ð˜ "´\Œ±ÏLÖp„
I\wŸožÿu)£75íŽÑp„ Œ"
• ·‚k TLB íºù´S/Œ=†M‡"Config(MT) wŠ\´Äk"
\Œ±Ö Index Š½öÏéëYOê Random Mì3
17 ·bÒ´\§ŠOÖö"

110
5.9. éÄ 1 5 Ù É~!¥ä9Щz
yâ"XJwþkZ§\NŽ‡u´ÄU é TLB L‘êâ?1
"
• CPU ž¨ªÇµ{éў¨ªÇ~~´ék^"\Œ±ÏL$1˜ã
®Ý! up„ S!I‡s¤½êþ CPU ±Ï̂
“è§, Ú CPU Ü®„ÝOêì3‰1c Š?1'"˜
½‡y\ý´3$1p„ ¥§ÄKÒ¬Û%(J——P
4Pk M‡ØU3p„ ¥$1 ROM"
Linux SØ3Úž‰1ù‘óŠ¿w˜‡ê§‰ BogoMIPS§±r
NTêŠÚ CPU 5Uƒm?Û'XÑ´b"
XJ\ CPU ÎÜ MIPS32/64 1‡£2003 c5‰¤§Œ^ rdhwr 
-4\†–¯Ì CPU ž¨Ú Count Mì4O„Ý'~Ïf"'
Oêì„ÝÚ ÜëIO‡N´˜ "
XJ\‰Ñ CPU ID!ž¨ªÇ!p„ 5‚&E§'X`ŠéÄ&E
˜Ü©w«Ñ5§k˜U,‡‘o󧓬a\"
5.9.2 ÚÚ½
éēèÉü‡ƒ‡´ÑŽ‡8IƒmÀâò"˜¡§éu
M‡5AŠb½§Áã3¦^z‡fXڃcчu£Ž–˜e
÷Ffžÿ§3z˜? ­ƒc‡Á˜eâ þ¤",˜¡§¦þ~E
,Jî?“è"Ú§SAl5ÑØ´'%5U§¤±éŽ‡@:ƒ
†p?Šó"´p?Šó“è–•u‡¦®²kõfXÚU $1"
\?n MIPS äNæN£'X˜ SR ±B–U ?1¤ §
̇¯KÒ´LõÈâU ‰§SJøŒÖŒS§ùéuN^ C Šó
¼ê´7،"
kžÿä@‡¹˜ ”5 PC BIOS ¥gÿÁz˜^ 8086 -
“è@Û%ÀÜ"3·w5ùД´r\g1Úfg^óf£
˜å5“Ž"XJ?ÛfXÚÚ CPU 3Ә¬¡¥¢y§éTf
XÚuجkŒ›”"
5.9.3 éÄA^§S
‡ŽU éʇ C ŠóA^§S£ŒUٍ-5 u ROM¤§\I‡
kŒ±\;짴Ϗ±en‡Ï"
Äk§\I‡æҘm"©v Œ˜¬ŒS¿ r sp MìÐ
©zT¬;ì/Œþ.£éàli!>.¤"ŽÑæÒATõŒ´é
(JµOŽžõ3:{/¬èF"

111
5.10. -•ý 1 5 Ù É~!¥ä9Щz
, §\ŒUI‡Ð©z˜ êâ"~œ¹e§C êâ«d§SC1ì
Щz§±˜DƒêŠCþ"ŒõêU ^ui\ªXÚ?ÈXÚ#
NÖêâ38I“è¥d˜‡üÕã+n§¿ ˜\ ROM ;ì"
k3?ÈXÚÚ$1XڃpNSü3N^ main() ƒcrŒêâ
Щz“èl ROM E› RAM ^‡e§âU^Щz Œêâ"
 §C §Sé¤kvk²(Щz static Ú extern êâ‘^˜ãü
ÕS¬——ù¬S«kžÿ¡ BSS§¡ BSS ÏducÈ®²
”D "ù«CþA˜"§ÏL3§Sm©cò‡ê⫘"ÒéN´
‰ù:"
XJ\§S´c[ï§ù Ò "´§¯KŒ±tE,µ‡
5¿\ MIPS §Sïžvkæ^ۍMì gp 5\„éšæÒCþ
§ÄK„I‡‰õЩz"
5.10 -•ý
kžÿÉ~^5N^˜‡“OÉ~ɳ-^‡?n§S§Ò–3Ø
|±2:M‡ CPU þ¦^^‡5¢y2:öŠ@"NÁìÚÙ§XÚó
äkžŒUŽù‰"
‡•ý˜^-§\I‡éэ-!)è!¿éѧöŠê"MIPS -
öŠê3M쥧ù‡žÿù É~cM슮²˜É~v¥
 "k ù ŠŠÉì§\Œ3^‡¥‰1öŠ§r(J±‹Ö¶ª
\ƒA(JMì3É~v¥€", I‡é;É~ˆ£/ŒŠ 
NùÒaL•ý-, ˆ£"·‚ò˜Ú˜Ú/r˜Hù‡L§"
éÑ—É~-N´¶Ï~Ò´ EPC •@^§Øš?u©|ò´
øS§dž Cause(BD) ˜ É~ɳ- u/Œ EPC+4 ?"
‡)è-§\I‡,«‡®?L"Š2¦^ GNU NÁì gdb ¥
^5)‡®?L˜Ü©§k‡¡•)è MIPS -L"‡ GNU 
Ç^‡é\vk¯K§ÒŒ±^§\!ŽžmÚ°å"
‡éÑöŠê§\I‡É~v ˜ÚÙÛ§ù‡ûu\äNöŠ
XÚ£½öÉ~?n^‡§XJØпg‰öŠXÚ{¤"
\ØØgCŽ{5‰1ù‡öŠ§ùp„I‡U É~v§±r
(J(˜£ƒAM쀥"
O\; EPC Š±L•ý-žØ%Ò¬á\€²"XJ
•ý- u©|ò´ø¥§\ØUÒ{üˆ£“e˜^”-——@Ò
uvku)©|§ ¯¢þ\Ø´Äu)©|"
¤±•ý8I- u˜‡©|ò´øž§„‡•ý©|-§ÿÁ
wwu) ©|„´vk"XJu) ©|§I‡OŽ©|8I, †lÉ
~ˆ£@p"
112
5.10. -•ý 1 5 Ù É~!¥ä9Щz
¤3´§¤k MIPS ©|-Ñé{ü§ vkBŠ^"

113
1 6 Ù . S+n† TLB
·‚–•u†l. Ú\Ö¥ŒÜ©ÌK?1&?§éu˜'
5OŽÅ. NX(Ö ó§ùq´g, ,", ——ؚ´\®
²éJ[;XÚÚöŠXÚN¦^J[;Xښ~ÙG——ïÆ\y3
rր1 14.4 !§wwT!ùã Linux ¥J[;+nś"˜ \é
dt˜Ù §2€£ùp5wwM‡[!§wwƒÓM‡3Ù§‚¸eX
ÛóŠ"
·‚gº•egžÿ§M‡~~¡;ì+nü½ö
MMU"·‚g.•þwžÿ§·‚̇8¥u̇M‡ TLB £
¡´“translation lookaside buffer(=† À Àì)”§ØLù‡¡é·‚n)
vkõŒ^?¤"
6.1 TLB/MMU M‡9ي^
TLB ´r\§S^/Œ£§S/Œ½öJ[/Œ¤=†¤–¯;
ìÔn/ŒM‡"öŠXÚéuS=†››´¤k^‡SA5'
"
3 MIPS CPU£±9¤ky“ CPU þ¤þ§/Œ=†± 4KB Œü 1

§¡"S 12 /Œ´lJ[/Œ{ü/D4Ôn/Œ"
=†L¥z˜‘¹k˜‡J[/Œ£VPN =J[Ò¤Ú˜‡Ôn
/Œ£PFN “LvÒ¤"§S‰Ñ˜‡J[/Œž§T/ŒÚ TLB ¥z
‡ VPN ‰'§XJÚ,˜‘š҉уA PFN"TLB ´˜«¡ƒƒ
é;ì½öSNό;ì——Ø´Uì¢Ú5ÀJ ´ŠâSN5ÀJ
,˜‘"ùÜ6´ƒE,§Ù¥z˜‘ÑkSï'ì§E,ÝÚ5U*
Ð5é "¤±;. TLB k 16  64 ‘"
k˜|I“ Úz‡ PFN ˜å;¿˜åˆ£§I“ 4öŠXڌ±
½,˜Ö½ö½,êâ´ÄŒ±p„ "
1MIPS M‡|±Œu 4KB § SùoB¨§¦^ŒÄº€é^‡k|§
´®²/¤ 4KB S.éJ{ø"AÏ/Œ=†ó^Œõ"

114
6.2. TLB/MMU Mì 1 6 Ù . S+n† TLB
Œõêy“ MIPS CPU £±9¤k MIPS32/64 CPU¤æ^V;§
z˜‡ TLB ‘NB˜éƒJ[¡éAü‡üÕÔn/Œ"

ã 6.1: TLB êâ‘


ã 6.1 ‰Ñ ˜‡ TLB ‘"z‡Iþ^‡\1ÚÖ TLB L‘žÿ
^ CP0 Mì¶i§e˜!ùù Mì"
\3$1˜‡ýE,öŠXڞ§^‡é¯Ò¬CX' TLB =
†LUNBõ/Œ"ùŒ±ÏLr TLB Š˜‡^‡+nC^L/
Œ=†p„ 5‘o)û"˜‡I‡/Œ=†Ø3 TLB ¥ž§Ò
¬)˜‡É~§É~?n§SŽÑ¿SC(/Œ=†"éJƒ&ù«‰
{¬kǧ´¯¢(¢Xd"
6.2 TLB/MMU Mì
– MIPS CPU ¥Ù§Àܘ§MMU ››‡ÉéA^ 
-Ú?nì 0 ˜|MìK"L 6.2 Ñ ù ››M짷‚
31 6.3 !¬ùƒ'-"¤k TLB L‘\½öÖчÏLMì
EntryHi!EntryLo0–1 Ú PageMask 5?1"

6.2.1 TLB ' i——EntryHi Ú PageMask


ã 6.2 ‰Ñ ùü‡Mì§Ú EntryLo £Xe¤ã¤˜å´ TLB L‘é
§S ˜Œ„Àã"ã¥Óž‰Ñ MIPS32 Ú MIPS64 ‡ EntryHi
±9eµ
• VPN2£J[Ò¤µùÜ©´§S/ŒpS £$ S/Œ 0–13
Ñ ¤" 0–12 áuS/Œ§´§S/Œ1 13 Øë†éµ
z‘N˜é 4-KB Œ§ 13 gÄ3ü‡ŒUÑъƒm?1À
J"
3­WÉ~u)ƒ §gĘTš™U=†§S/Œ"\Ž‡
\,  TLB L‘½Áãuÿ TLB ž§ÒUÃó˜"
EntryHi  MIPS64 ‡#N¢y'8cŽŒJ[/Œ«
——ˆ 62 §, c;. CPU U¢y 40 "VPN2 ¢y
115
6.2. TLB/MMU Mì 1 6 Ù . S+n† TLB

L 6.1: ^uS+n CPU ››Mì


MìÏPÎ CP0 MìÒ £ã
EntryHi 10 ù Mì˜å¤ ˜‡ TLB L‘¤I˜ƒ"¤
ké TLB Öч²L§‚"EntryHi k VPN Ú
ASID¶MIPS32/64 CPU z˜‘Nü‡ëY
EntryLo0–1 2–3 VPN ØÓÔn§ùü‡ PFN ځ
PageMask 5 I“©Od¶i EntryLo0 Ú EntryLo1 Mìü
Ս½"
EntryHi(ASID) äkV­ I§Ï§‡P4c¹
Ä ASID"
EntryHi 3 64 CPU ¥O 64 §Ӟé؇
/Œ^‡± 32 ÙÛØC"
PageMask Œ±^5MïNŒu 4 KB ‘¶
ë„1 6.2.1 !"k CPU |±§3Öé
J"
Index 0 ù‡Šû½ƒA-‡Ö´=˜‡ TLB L‘"
Random 1 ù‡–‘Åꊣ¢Sþ´˜‡gd$1Oêì¤ tlbwr
-^5ò˜‡# TLB L‘\˜‡‘ÅÀJ ˜
"U‘ÅO†^‡£ŒUvkOO“Y¤?
n TLB ­WžŒ±!Žžm"
Context 4 ù ´JøBMì§^5\„ TLB ­Wg€
?n"p ´ŒÖ§$ gu™U=†/Œ
XContext 20 VPN"
ù MìÙی±y§XJé;ì=†P¹
73SBŠâ\¿?1Sü§@o3˜g
TLB ­Wg€ §Context Ò¬¹˜‡•Nƒ
Aц/Œ¤I‡LP¹"ë„1 6.2.4 !"
XContext é‡L 32 k/Œ˜m?§u)g
€¤ÓóŠ¶{ü†r Context ÙÛ*¿
Œ/Œ˜m´Ø1§Ï(J¬—Œê
â("k 64 ^‡éu 32 J[/Œ˜mv
k¿„¶´XJØ ^§64 CPU Ck“ª ”
SR(UX) Ú SR(KX)§ÏL˜Œ±N^,  TLB
­W?n§S¶‡L5T?n§SqU^ XContext 5
|±˜‡ãŒE,Œ±+nL‚ª"

116
6.2. TLB/MMU Mì 1 6 Ù . S+n† TLB

ã 6.2: EntryHi Ú PageMask Mì


•þOv±éG§¢Sþ§\‡lù‡Mì¥éÑ\kõ
J[˜m"XJ\\ 1 Š EntryHi(Fill/VPN2) , ­#Ö
£§EntryHi(VPN2) k Ò´@ Ö£žŠ 1  "
VPN2 ¥‡L CPU ¢S¦^p /Œ7L\ 0 ½ö 1 §Ú R 
pk ‡š"ùu`§–¯Ø%;^/Œ˜mžp  1§
ÄK 0"
XJ\==¦^ 32 -8§ù˜ƒÒ¬gÄu)§Ï\ùóŠ
ž¤kM읹ŠÑ´˜‡ 32 ê 64 kÎÒ*Ð"ù˜5§
$13 64 M‡ƒþ 32 ^‡Œ±@M‡k 32  EntryHi (
"
„‡5¿§3 VPN2 ±e„kA‡™^" ¶¢Sþù ¿Ø
´[ÑØ^——k CPU ˜Œ±|± 1-KB Œ§ù«œ/
VPN2 9ƒA¶- •eòü "

• ASID£/Œ˜mI£Î¤µ~œ¹e§ùÜ©3e5öŠXÚc
/Œ˜mI£"É~جKT§¤±­WÉ~ƒ §Téc$
1?§5`E,´("
¦^õ‡/Œ˜möŠXÚ¬‘oTc/Œ˜m"´ÏT
˜? EntryHi§^ tlbr 5u TLB L‘žÿØ؛©%¶T
öŠ¬­‡ EntryHi§‰1 7L¡E(c ASID Š"
• Rµ
£64 ‡âk¤ù´˜‡/Œ«ÀJÎ"\Œ±˜—/rTw
Š´ EntryHi(VPN2) õ ¶ØL´ 64 MIPS J[/Œp
"´XJ\„P 64 *Ð;ìN£ë„1 2.8 !ã 2.2¤§
Œ±wù p ÀJäkØӖ¯;«"

117
6.2. TLB/MMU Mì 1 6 Ù . S+n† TLB
Š «¶ {á£ã
R
0 xuseg ^rŒ–¯J[;ì$/Œ«
1 xsseg +nŒ–¯˜m£+n´ŒÀ¤
2 xkphys Ø%;^ŒÔn;ì£^Ø^p„ ѝ)¤

3 xkseg Ø%˜m£) MIPS32 oNã¤
R Ú VPN2 p ¿ØӧϏ§‚(Œ±kØÓŠ——däN
¢y½Â EntryHi(VPN2) põ U"½ö˜"
PageMask Mì#N\˜ TLB 5NŒ"PageMask(Mask)
“L TLB L‘˜Ü©§Š 1  ¦J[/ŒéA 3‰1 TLB L
‘šžÑ£—ƒA µØĆD4(JÔn/Œ¤§uš
˜‡Œº€"
vk MIPS CPU U 3 PageMask(Mask) #N?¿ ª"Œõê
#NŒ3 4 KB Ú 16 MB ƒm±o4O"
24–21 20–17 16–13 Œ
0000 0000 0000 4 KB
0000 0000 0011 16 KB
0000 0000 1111 64 KB
0000 0011 1111 256 KB
0000 1111 1111 1 MB
0011 1111 1111 4 MB
1111 1111 1111 16 MB

–k˜‡Pª MIPS CPU =|± 4-KB Ú 16-MB §E^ ù


º€IO?è¶ïÆ\‰˜ uÿ5ww PageMask ¥= Š´“”"
XJ\ CPU U |± 1-KB Œ§3 PageMask .܄‡kü
‡  §é§˜„ÌÓª§·‚r§3‰ÖöŠöS"
6.2.2 TLB Ñэ——EntryLo0–1

ã 6.3: EntryLo0–1 Mì


ã 6.3 ‰Ñ EntryLo  MIPS32 Ú MIP64 ‡§§‚ˆ‡Xeµ
118
6.2. TLB/MMU Mì 1 6 Ù . S+n† TLB
• PFN: ùÜ©´Ú EntryHi(VPN2) éA/Œ=†‘Ôn/Œ
p Ü©"Tk°Ýûu\ CPU ¤|±Ôn;˜mŒ
"MIPS32 CPU  ܝ²~› 2 i!‰Œ§´ MIPS32
32

‡ EntryLo Œ±d3|±õˆ 2 i!Ôn‰Œ£26  PFN


38

Jø 2 ‡¡§z‡Œ 4 KB ½ö 2 i!¤"
26 12

• C: ˜‡ 3 §5´p„ ˜—5õ?nìXڽ§^
5˜“p„ Ž{”£‰“p„ ˜—5á5(cache coherence
attribute)” ——k ÃþrT‰“CCA”¤";.öŠXÚÑk
¡ØI‡3õ‡p„ ƒmgċlCz——®k˜‡ CPU
¦^¡§½®Ö¡§ù ØI‡õ'%"'4éù
¡p„ fÚpŒ±4Xڍ\kǧù‡dö
ŠXÚ^5P¹ƒA§'X`§Œ±p„ ´ØI‡˜—5+
n£“cacheable noncoherent”¤"
´ù‡3¤Oi\ªA^ CPU ¥¦^§ùž^5ÀJp„ 
󊐪——~X§IP,‡äN“ß”ª+n£Ò´`§¤k3
@p?1öŠÑӞ†xÌÚp„ N”¤"
T=kÊH|±Š)§“Ø^p„ (uncached)”(2) Ú “Œp„
؇˜—5(cacheable noncoherent)”(3)"
• D(dirty): ù‡ Š#N "˜  1 #N\§ 0 —^T/Œ=†
\öŠu)g€"ë1 14.4.7 !é 9(dirty) ù‡âŠ)º"
• V(valid): e 0 Ké†T‘š/Œ?Û¦^Ñ—É~"‡o^
5IP˜‡ØŒ–¯£3ýJ[;XÚþ¤§‡oÒ´IP˜
é/Œ=†ƒ˜ EntryLo Ü©ØŒ–¯"
• G(global):  TLB L‘ G ˜ ž§TLB ‘ò==3 VPN þš§
Ø+ TLB ‘ ASID ´Äš EntryHi ¥Š"ùJø ˜«k
ś5¢y¤k?§/Œ˜mÜ©"5¿¦+kü‡ EntryLo
Mì§3 TLB ê⑥%k˜ G µXJ\ EntryLo0(G) Ú
EntryLo1(G) ØÓ§@Ò¬€¯"

• ‰ 0 Ú™^ PFN : ù o´ˆ£"§´ÚNõ3Ø


Ó§\žÿؘ½‡\"£Ø+\ŸoŠÑv^¤"ù˜:é­
‡¶¿›X3­W TLB žS73^5) EntryLo ê⌱3ù
¹˜ d^‡gC)ºêâ§TLB M‡Ñù § Ø^L¤
B CPU ±Ï¶-§"

119
6.2. TLB/MMU Mì 1 6 Ù . S+n† TLB
6.2.3 ÀJ TLB L‘——Index!Random Ú Wired M
ì
Mì^5]À˜‡äN TLB L‘——Šl"˜†L‘
Index
oê~˜"\k¿Ž‡Ö˜‡äNêâ‘žÿ§I‡˜ Index§\^
tlbp ^^‡|¢˜‡ TLB L‘ž Index ¬gĘ"
Index $  TLB ¢Ú" ùØI‡éõ §Ï„vk MIPS CPU
2

k‡L 128 ‘ TLB"p £ 31¤kAϿ§uÿ™Uéš‘ž


ÿd tlbp ˜ " 31 ÀЗ—Ϗùwå5–KŠ§éN´ÿÁ"
Random  TLB ˜‡¢Ú§ CPU z‰1˜^-ÒOê˜g£•
e4~Oê§XJù:é\­‡{¤"TŠê⑍- tlbwr ¿ TLB
¢Ú§3I‡˜^# TLB ‘žÿ§Ï¢y‘ÅO†üÑ"
~¦^ž§\[Ø7Ö Random Mì"M‡3E žr Random
˜ŒŠ——TLB L‘p?Ò§z‡ž¨±Ï4~Oê§4~
Š q£7ŒŠ§Xd± E©"
TLB ¥l 0 m©•þ§ ´¢ÚueŠL‘ØɑÅO†K§
öŠXڌ±òù ø^u[È=†/Œ‘——3 MIPS OS © ¥¡ B
#(wired)"Wired Mì#N\½eŠÏ Œ±û½B#=†‘‡
ê"\\ Wired M잧Random MìE  TLB ºÜ"
6.2.4 L9ÏMì—— Context Ú XContext
Ϗ TLB ¥Ø3/Œ=† — CPU u)É~ž§™U=†J[
/Œ®²3 BadVAddr "?/Œ‡N3 EntryHi(VPN2) ¥§3@p
ý˜‡Š§TŠTÐÒ´=†Ñ¯/ŒMï#ê⑤I‡Š"
´ ?˜Ú\„éù‡É~?n§Context ½ö XContext Mì
^Œ†Š•ÄuSL‚ªé?/Œ­#‹"
MIPS32 CPU k˜‡ Context Mì§U Ï 32 J[/Œ˜m
TLB ­WL§¶MIPS64 CPU O\ XContext M짦^Œ/Œ˜
m£Œˆ 40 ¤ž‡^"
ù M죝) MIP32 Ú MIP64 ‡¤Xã 6.4 ¤«"
5¿ XContext ´˜˜‡ MIPS64 ½Â¥vk(ƒ½ÂS܈
>.MìµXContext(BadVPN2) 3|±‡L 40 J[/Œ˜m
CPU þgÄO§¿ ò R Ú PTEBase •†í££‡yU˜e§Ò‡
gÄ  ö¤"
1 6.2.1 !£ã ã 6.2§¿)º NéÑ\ CPU ^ õ "ˆ‡
Xeµ
P R2000 oN CPU MìÙۆdØÓ§´l1 8 m©"\،ŒU2-‘
2

ù«PÂ"

120
6.2. TLB/MMU Mì 1 6 Ù . S+n† TLB

ã 6.4: MIPS32 Ú MIPS64  Context Mì


• Context(PTEBase): T´\˜?Š" U ¿©UìO
ö¿ã|^Mì§\˜‡73SLå©/Œ£·éà¤
p "Tå©/Œ7LÀ31 22 9±e"——= 8-MB >."
,3Ôn;ì½ö؉N;ì¥Jøéà¬4oNÇü$§Ù
8´ù‡LATU˜3 kseg2 N/Œ«"äNNóŠ„e"
• Context(BadVPN2)/XContext(BadVPN2): 3 TLB ƒ'É~ƒ §T
?/Œ§ÐÒ´ BadVAddr p "
Ÿo¶i¥k‡ 2 Qº„P§3 MIPS32/64 TLB ¥§z‘N˜é
ƒJ[/Œ¡ü‡ÕáÔn¡"
BadVPN2 Šl 4 m©§ùŒ±ýkOŽ˜‡§˜‡ÄŒ
3 PTEBase ¥§z‘Ó 16 i!LpÞ"XJöŠXÚéù‡L?1
‘o§¦˜‡äNJ[/ŒÛ¹–¯L‘¹êâTÐÒ´M
ïT/Œ=† TLB L‘¤‡( EntryLo0–1 êâ§@o TLB
™·¥É~?n§S‡‰óŠÒŒ±ü¶3 6.5 !Ҍ±wù
˜:"XJ\´=† 32 /Œ ØI‡3L¥õ^‡
;^G §@oŒ±^l‡i!L‘"ù ¤ Linux Ÿo
رþ㐪¦^ Context Mìσ˜"XJ\ CPU Œ±?n
‡L 40 ^rJ[/Œ˜m§XContext(BadVPN2) ŒU'ã 6.4
¥¤«‡Œ"ùž§R Ú PTEBase Ø ±BCјm"
• XContext(PTEBase): 64 /Œ«LČéà‡¦¤k$u
XContext(PTBase)  я"§Ò´`‡éà 8GB >."ù
‡‡¦få5éL©§´Ä MIPS64 ;ìN5Òk˜‡¿©
Œ!N!SØ;^«£“xkseg”¤"
• XContext(R): TLB ™·¥Œ±5g CPU ;ìN?Û«§Ø=
u^r˜m"¤k« u˜‡ 64- ˜mƒe§´u‡Ce
Ü/ŒI¦£\ŒUŽ‡ë 2.8 !ã 2.2 ¤"Œ^ 64 J[/Œ˜
m©o‡“xk...”ã§3z˜ã¥Œ±¦^ 62 ãS/Œ"
Xùp¤«§™·¥/Œ˜‡üÕ 40 «S/Œ£BadVPN2¤
121
6.3. TLB/MMU ››- 1 6 Ù . S+n† TLB
ژ‡ 2 N«ÀJÎ XContext(R)§ù==´ !Ž
XContext ˜m"ÀJνÂXeµ
R Š «¶ {á£ã
0 xuseg J[;˜m.Ü^rŒ–¯˜m
1 xsseg +nŒ–¯˜m£+nŒÀ¤
2 xkphys éAu؉/Œ˜N£/Œ=†¤㧙^
3 xkseg Ø%N˜m£)P kseg2¤
5¿¿š¤köŠXÚіÐŽ@¦^ Context/XContext
——AOŠ˜J´§Linux vkù‰"·‚± ?ØÙÏ"

6.3 TLB/MMU ››-


-µ
tlbr # read TLB entry at index
tlbwi # write TLB entry at index

3 Index MìÀJ TLB L‘Ú EntryHi Ú EntryLo0–1 MìƒmD


x MMU êâ"
\ج²~/Ö TLB L‘¶(¢ù‰žÿ§P4\®²­
EntryHi(ASID) § TAdöŠXڑo^5ÀJc?§/Œ˜
m"¤±„r5Š˜£"
-µ
tlbwr # write TLB entry selected by Random

r EntryHi £,)Ù ASID ¤!EnbtryLo ±9 PageMask SN€


d Random Mì¢Ú TLB L‘¥——XJ\æ^‘ÅO†üÑ@o
ù¬!Žžm"¢‚¥§3 TLB ­WÉ~?n§Sp¦^ tlbwr 5\#
TLB L‘§´3Ù§/Ñ¦^ tlbwi"
-µ
tlbp # TLB lookup

|¢J[Ò9 ASID ‹c EntryHi ¥Šƒš TLB ‘§¿rT‘


¢Ú Index Mì"evkéšK Index Mì1 31 ˜
——ùwþ”‡KŠ§Ï ´uuÿ"
XJõu˜‘Šu)š§KŒUÑ?Û(J"ù´˜‡ØTu)î
­†Øµ^‡A4c[/OL§yýéجé?Û/ŒSC1g/Œ
=†"
5¿ tlbp ¿Ø TLB êâ¶XJI‡{§‘ 2$1˜^ tlbr 
-"

122
6.4. TLB ?§ 1 6 Ù . S+n† TLB
3Œõê CPU þ§TLB SÜ´6Y‚ù/Œ=†Œ±p?1"–þ
¡ù+n/äöŠŒUÃ{·AIO6Y‚6§§¤±XJ3 TLB ‘
o-ƒ ¯Ò$1¦^=†/Œ-ҌU¬Ñy‘x"ë„1 3.4 !'
u CP0 ‘xSN§´ ;J±?neœœ/§Ï~^3 kseg0 ƒa
š=†«‰1^‡?1 TLB ‘o"
6.4 TLB ?§
é TLB L‘˜´ùµ\ EntryHi Ú EntryLo ¥7‡§,
^˜^ tlbwr ½ö tlbwi -Dx· TLB L‘"
?n TLB ­WÉ~ž§\¬uy EntryHi M쮲dÉ~˜Ð "
‡AO%؇)¤ÚӘ§S/Œ/ASID 郚ü‡ TLB L‘"X
J TLB ¹­Eê⑧ù˜‡/Œ?1=†½uÿž§k›€ CPU
¡d3ŒU"k CPU 3ù«œ¹eÏL'4 TLB 5‰1g·o§d
ž SR(TS) ˜ "d TLB òʎš§†˜gM‡E âU¡E"
XÚ^‡~~ŠØI‡Ö TLB ‘"´XJ\I‡Ö§\Œ±^
tlbp 5éÚ,‡äN§S/Œƒš TLB ‘5˜ Index Mì"؇
#P EntryHi ¿3¯ ¡E——EnbtryHi(ASID) ŒU魇"
^˜^ tlbr -r TLB êâ‘Ö\ EntryHi Ú EntryLo0–1"
3 CPU © ¥¬wk /JüÕ“ITLB”Ú“DTLB”£kžÚ
¡“uTLB” ——“u”“L“micro”¤("ù‡ micro-TLB é-Úêâ©O?
1/Œ=†¶´˜‡‡M‡+n/Œ=†p„ §ÙöŠé^‡
ß²——3\éÌ TLB \˜‘žÿÒ¬gĊ¢"
6.4.1 ­W´Nu)º
§S–¯˜‡‡?1/Œ=†/Œ«£Ï~´o OS eA^§
S kuseg ÚØ%A?Ne kseg2¤§ uyvk/Œ=†P¹ž§CPU
Ò¬)˜‡ TLB ­WÉ~"
TLB UN“ÑÖì½öóŠÕÔn;쉌˜Ü©"Œ.ö
ŠXÚI‡‘oU NBŒþ/Œ=†73SL§^ TLB ŠC
^L/Œ=†p„ " JpǧÏ~rL|„¤˜ †Œ^
 TLB êâ‘|¤ê|¶ ?˜ÚJpǧ\Œ±rL ˜Ú(
˜^ Context ½ö XContext MìҌ±†Š•LS܍
"
Q, MIPS XÚÏ~3ز/Œ=† kseg0 «$1öŠXړè§~
„™·¥œ/Ñ´^rA?§S" \Éù«~„œ¹e~?n§
Jø eZM‡A5"Äk§ù ­WÉ~Ú˜‡ØU^uOÉ~  3

3 3Ð MIPS NX(þ§ù´˜ŠPkgC\:¯‡"


123
6.4. TLB ?§ 1 6 Ù . S+n† TLB
S$/Œ«"Ùg§^ ˜XE|#N73SL½ 3Ø%J
[;«£ kseg2 «½Ù 64 éA¤ùéuL¥N?§/Œ˜m
¥“˜É” @ Ü©ÒØI‡Ôn;˜m "
 §Context Ú XContext M쌱†l73SL–¯(
/Œ=†êâ‘"
·‚ò31 6.5 !˜ÚÚc[5wù‡L§"´3·‚?˜Ú0 ƒc§
A5¿¦^ù A5¿Ø´r›"3.XÚþ§TLB Œ±^Š˜‡l
§S£J[¤/ŒÔn/Œ½½éCz=†¶3ù«œ¹§TLB $
–ÑØI‡Šp„ "
$–,  MIPS ¢yŒ.J[;öŠXڏvk^“IO”
L——AOŠ˜J´ Linux"ù«‰{kŠ Linux Sئ^;ì° §
Ϗ Linux SØ/ŒN”é¤k?§Ñ´˜"ë„1 14.4.8 ww´No‰
"
6.4.2 ¦^ ASID
ÏLé TLB Lê⑘˜‡äN ASID§¿ò EntryLo0–1(G) ˜
"§ÒŒ±4ù ‘3 CPU EntryHi(ASID) M썚 TLB Šžÿ
â^"EntryHi(ASID) ´‡ 8 §#NӞNõˆ 256 ‡ØÓ/Œ
˜m Ø^3?§ƒ†ž˜Ø TLB"XJ\(¢^1 ASID§\7L]À˜‡
Œ±”.òÙDÑ TLB ?§"˜ \¿ï §¤kN§\Ҍ±Â£Ù
ASID Š¿­#^uÙ§?§"

6.4.3 Random MìÚ Wired Mì


M‡¿vk‰\JøéÑ=‡ TLB ‘C^õ{"r TLB Š
p„ ¦^§3I‡SC˜‡#Nžÿ§˜y¢{Ò´‘ÅÀJ
˜‘?1O†"CPU ÏL‘o˜‡‘Xz‡?nì±Ï4~Oê Random
Mì5{z¢y"
‘ÅO†få5ЖǬ$Œù¶(JŒUrC^ª„ é
¯q‡^/Œ=†êâO†Ñ"¢Sþ§kÜnêþŒUã+¬
øÀJž§ù«y–¿Ø¬õ¬ýÚå¯K"
´§XJU yk˜ ؚ²(‡¦˜ØÄK~7 TLB L‘§@o
´š~k^"ù3N®¬²~^žŒUk^?§´ý­‡
´3uU4\yN, ¡Ø¬)¤­WÉ~"
­½ TLB ‘¡ B#(wired)µ§‚´¢Ú$u?§? Wired M
ìŠ TLB ‘"TLB g¿Øéù ‘ŠAÏ?n§c©3u Random M
쥧§Šl5جá\ 0  wired-1 ‰Œ¶§4~O꧴ wired
Šžÿ҆£ŒŠ"¤±~5‘ÅO†3 TLB  0  wired-1 ‘
124
6.5. éM‡lАLÚ­Wś 1 6 Ù . S+n† TLB
ØC§•@p\ê⑘†²(í؏Ž"
6.5 éM‡lАLÚ­Wś
k˜‡AÏ/Œ=†Å›§Î毴 MIPS NX(Oö%¥
Unix ƒaöŠXÚ¥^r/Œ3"ù«{6uz‡/Œ˜m3
SL"LÒ´^ VPN ‰¢Ú‚5ê|§Ùz‡êâ‘‚ª
Ú EntryLo Mì š"TLB =† zé/ŒI‡ 2 × 64 êâ
‘§z‘ 16 i!"
ù~ 3' ­WÉ~?n§SþKú%‘5 O¯K"Ϗ
z 8 KB ^r/Œ˜mÓ^ 16 i!L˜m§‡ 2G ^r˜mI‡ 4-MB
L§ù´˜¬Œ-<”“êâ¬" , Œõê^r/Œ˜mk.
4

Ü£“èÚêâ¤ÚºÜ£•eOæÒ¤Wkê⧥mk˜‡ãŒ˜
Y"MIPS æ^)ûYÉ DEC  VAX NX(éu§Ò´rLg
\Ø%NJ[;/Œ«£kseg2 ½ö xkseg¤"ùZÀ|á/˜e
f)û ü‡¯Kµ
• !Ž ÔnSµÏl5جÚ^3L¥m™^˜Y§¢SþØI
‡ù ‘©ÔnS"
• Jø ˜«{ü´1ś§Œ±3ƒ†þe©žÿ­#N˜‡#
^rL§ Ø^3öŠXÚ¥˜géÑv N¤kLJ[/Œ"
 “ƒ´§éz˜‡ØÓ/Œ˜mk˜‡ØÓSØ;ìN§
\?U ASID Šž§•L kseg2 y3gÄ­#N(
L"ù{†Ò”´CZ{q"
MIPS NX(|±ù« Context £64 CPU ¥*Ð/Œ XCon-
text¤/ª‚5L"
XJ\4L3 4-MB >./Œm©£Ï3J[;쥧?ۘYÑ
جÓ^Ôn;ì˜m¤§¿ò Context  PTEBase ˜Lå©/
Œp §@o§3^r­WÉ~ƒ § Context MìÒ¬gĝ¹­WI
‡êâ‘/Œ§ØI‡‰?˜ÚOŽ"
y3˜ƒ„е´ù«Yk—˜‡—·5̂ŒUµTLB
­WÉ~?n§SgCŒU—,˜‡ TLB ­WÉ~§ÏL kseg2 N
¿Ø u TLB ¥"´ù‡¯KŒ±?"
XJu) ˜‡i@ TLB É~§u)ž CPU ®²?uÉ~ª "3
MIPS CPU ¥§É~ª¥ TLB ­W½ Ï^É~\:§3@pu
ÿ¿‰AÏ?n"
4 ,ù´éu 32 J[/Œ˜mœ/¶æ^Œ/Œ˜m 64 CPU I‡ŒL"

125
6.5. éM‡lАLÚ­Wś 1 6 Ù . S+n† TLB
d §5gÉ~ªÉ~1'Û%µ§¿ØUC­#m©/Œ
EPC§ù“S ”É~ˆ£ž§Ò†ˆ£šÉ~ TLB ™·¥ ˜"
wå5Д´M‡m©?n˜‡É~§, UC Ì¿ ?n,˜‡µ´1
‡É~Ø2´i@§§tö 1˜‡É~"·‚w˜‡~f5 )ù´N
óŠ"
6.5.1 TLB ™·¥?n
™·¥É~?no´^˜‡;^\:§Øš CPU ®²3?n˜
TLB
‡É~ ——Ò´`§Øš SR(EXL) ˜ "
e¡´3 MIPS32 CPU £½ö?n 32 /Œ˜m=† MIPS64 CPU¤
þ?n TLB ™·¥É~“èµ
.set noreorder
.set noat
TLBmiss32:
mfc0 k1, C0_CONTEXT # (1)
lw k0, 0(k1) # (2)
lw k1, 8(k1) # (3)
mtc0 k0, C0_ENTRYLO0 # (4)
mtc0 k1, C0_ENTRYLO1 # (5)
ehb # (6)
tlbwr # (7)
eret # (8)
.set at
.set reorder

e¡´é“èÅ1©Ûµ
(1) k0–1 Ï^MìUì½´. É~?n§S3§·‚†¦^Ò
Ð "
(2–5) 3z˜‡ TLB ê④\NŽ‡£Þw˜úã 6.1 ¥ TLB êâ‘
«¿ã¤¥k˜éÔn£EntryLo¤£ã"ã 6.4 ¥¤« MIPS32/64
Context MìÙۏz˜éê④z‡Ônl‡i!˜m¤ý
3 16 i!§¦+ MIPS32  EntryLo0–1 ´ 32 Mì"ù´
† 64 LoN§Óž3L¥=d^‡¦^&EJø˜ D
Ս"
3ùpO¦^ lw/mtc0 SU !ŽžmµXJ\Ò3;e˜^
-¦^\1êâ§é MIPS CPU U ØÊ•er"
XJ kseg2 /Œ=†Ø3L¥§ù \1ÒN´;Éi@ TLB ™
·¥É~"·‚ ¡2!ù‡¯K"
126
6.5. éM‡lАLÚ­Wś 1 6 Ù . S+n† TLB
(6) 3l EntryLo1 (êâƒc^ tlbwr \êâ‘Ø´ŸoЯ"
MIPS32 NX(¿ØUy;T- ÒUOÐê⧴XJ
-ƒm^˜^ ehb (execuation hazard barrier) - m{§Ò(U
y-SS5——ë„1 3.4 !'u‘x“oõ&E"
(7) T1‘ÅO†˜‡=†é§Xþ?Ø"

(8) MIP32 £„k MIPS I ƒ ¤k MIPS CPU¤Ñk˜^ eret -§lÉ


~ˆ£ EPC ¥/Œ¿ ˜Ø SR(EXL)"
@o\,˜‡ TLB ™·¥ž¬u)Ÿoº5glÉ~?™·¥Ø
N^p„?n§S ´?\Ï^É~\:"·‚®²?uÉ~ª §¤
±·‚ØI‡?UÉ~ˆ£Mì EPC"
Cause MìÚ/ŒÉ~Mì£BadVAddr!EntryHi $–„)
Context Ú XContext¤ò† kseg2 ¥L/Œþ TLB ™·¥k'"´
EPC ,•ÚåÐ TLB ™·¥-"
É~?n§Sò¬?nÐ kseg2 L™·¥£‡´˜‡Ü{/Œ¤§Ï
^É~?n§Sòˆ£^r§S", §éuk—^r˜m TLB ™¥
^r/Œ=†§·‚„ŸoÑvk‰§¤±áq¬u) TLB ™·¥"
´1gu)ž§L=†Œ^ §^r™·¥?n§SÒ¬^|¤"¤
œ
6.5.2 XTLB ™·¥?n§S
kü‡AÏ\:"˜‡——† MIPS32 ——æ
MIPS64 CPU
^ 32 /Œ˜m?§?1/Œ=†¶„k˜‡\:Jø‰IPI‡ 64
âU^Œ/Œ˜m§S"
GMìkn‡§SR(UX)!SR(SX)!SR(KX)§Šâ/Œ=†”}
ž CPU A?ÀJ¦^=‡É~?n§S" 5

ƒ'G £^rª SR(UX) ¤˜ ž§TLB ™·¥É~æ^


˜‡ØÓ•þ§@pATk˜‡­#\1ãŒ/Œ˜m=†L~§"?n§
S“è£Pk 64 /Œ˜m CPU þ XTLB ™·¥?n§S¤wþé–
32 ‡§Ø Mì 64 °Ú^ XContext Mì“ Contextµ

.set noreorder
.set noat
TLBmissR4K:
dmfc0 k1, C0_XCONTEXT
ld k0, 0(k1)
éu^r§SÝ\4Ù¤,«“64 ª”¶"žÿ§^r§SØU¦
5 SR(UX)

^ 64 ê-"´ SR(SX,KX) ==^5ÀJ TLB ­W~§"

127
6.6. MIPS TLB F~¦^ 1 6 Ù . S+n† TLB
ld k1, 8(k1)
dmtc0 k0, C0_ENTRYLO0
dmtc0 k1, C0_ENTRYLO1
ehb
tlbwr
eret
.set at
.set reorder

5¿§(JSØJ[;쥐L(‡'ùŒ§Îæ¯ò?uã
Œ xkseg «"
·A2gJ2\§ù‡XÚØ´r›§¯¢þ¿vk Linux  MIPS
‡£ù´ MIPS A^§SO?1/Œ=†öŠXÚ¥61¤¤
æ^"ù´ Linux SØO¥˜‡ƒŠ0OÀJÒ´SØgC“
èÚêâØÏ?§ƒ† ­#N§ ù˜:TÐq´ùpù kseg2/xkseg E
|¤7I"ë„1 14.4.8 !0 ‰{"
6.6 MIPS TLB F~¦^
XJ\^´– Linux @õUöŠXڧϏXÚ3\ ¦^
TLB§\gCé¬5¿"XJ´˜‡{üöŠXÚ½ö$1žXÚ§
\N¬Ž„¬Ø¬^ TLB"Ϗ MIPS TLB Jø ˜‡Ï^/Œ=†
ÑÖ§¤±Œ±kõ«ª4\|^§"
TLB ś#N\l?¿N/Œ?¿Ôn/Œ£±ü ¤?1/Œ
=†§Ï Œ±r§S˜m/Œ­#½ \Åì/ŒN¥?¿
˜"XJ\/ŒNI¦ØŒ§TLB U NB\I‡¤k/Œ=†§@
Òvk7‡|± TLB ­WÉ~½üÕ73SL"
TLB #N\½Â, /Œž½ö[È،^§ùéù ˜–¯
Ò¬—˜‡É~5$1öŠXÚ, ÑÖ~§"ÏL^ÊÏ^rA?
§S§\Œ±›, ^‡U–¯\‰§½/Œ§ÏL3=†ê⑥¦
^/Œ˜m ASID§\Œ±k+nõ‡pƒØŒ–¯^r§S"\Œ±é
S˜Ü©?1o"
ù˜aA^´Ã¡§ùp‰Ñ˜‡L5L²ˆ«A^‰Œµ
• –¯ØBuÔn/Œ«µMIPS M‡Mì uÔn/Œ‰Œ
0–512 MB B§@p\Œ±^˜‡ kseg1 «ƒA"´3M‡
Ã{ uù‡«/§\Œ±rp Ôn;«?¿¡N˜
‡BN«§'X kseg2"éT TLB =†I“A˜Ø^p„
?1–¯§d §Sžÿҋ–¯B ˜˜"

128
6.7. {üöŠXÚ¥S+n 1 6 Ù . S+n† TLB
É~~§S] µb½\Ž3Ø^3Mì k0/k1 þe©

œ¹e$1˜‡É~?n§S"XJŽù‰§Ò¬‘憧Ϗ~
œ¹e§XJØCX–˜‡Mì{§MIPS CPU Òvk/Œ±
?ÛMì"
\Œ±^ zero M슏ȧXJ^ £þ§ù /ŒÒ u
kuseg «c 32 KB§XJ´K £þÒ u kseg2  32 KB"v
k TLB ù /Œ=ÑØ "k TLB Ҍ±rT«˜‡½õ‡
NŒÖ;ì§, |^ zero ŠÄŒ;-5þe
©¿é\É~?n§SJø;:Ï"
• š-VM XÚ¥Œ*ÐæÚÒµ=¦\vk^½ö؎|±ž¦
I§U 3k››œ¹eUìI‡ÄOA^§SæÚÒ"3
ù«œ¹e§\I‡ TLB 5Næ/Ò/Œ§\‡^ TLB ™·¥¯‡5
û½´Ä©õS½ö(½T§S´Ä” ››"
• •ýM‡µXLkM‡kž3§kžqØ3§@oÏLN«–¯
M쌱3(SC M‡XÚ¥†ëM‡§3Ù§œ¹eN^
^‡?n§S"
ogŽÒ3u§TLB Ϗه·ÜŒ.öŠXÚ5‰ äk˜
°|O§ù Oéu§S óÒ¤ ˜‡Œ±†¦^Ï^] "
6.7 {üöŠXÚ¥S+n
˜‡S¡± XÚOöŠXÚÏ~‰¢žöŠXÚ£RTOS¤§
/^ ˜‡5†¢žk'ÀÜâŠ" Ù1˜Ü©Ñaq Unix
6

XÚPköŠXڌU䘃Àܧ´Nõ RTOS K‡{ü


õ"
\ŒU-˜ öŠXÚ¬)ºàúi VxWorks!Express Logic
 Thread/X ±9 Mentor£3 Accelerated Technology ƒ ¤ Nucleus"
ùA‡ÑJø3ü‡/Œ˜m$1õ‚§Uå"vk?փmo——b
½$13þ¡^‡´ü‡;—8¤A^§S"3Nõœ/¥§OS $1
žmýé§øAû̇°å˜3 ‰muöJøï!NÁÚ¿Ûóä
þ"
éNõØÓ«ai\ªXÚ§¦^˜‡– Linux ùE,öŠX
ڴĊ§8cÿ™/¤˜—w{"Ð?´\ò˜‡´L?§‚
¸!38¤Xڞ4kdŠ?Ö?Ömo§±9ŒU\˜ß"
Šs¤ ;ìÚ CPU OŽUå§Óž›”˜ éžm››§±†
6 ý“¢ž”9†žmρk'?§§š~k¿gékJݧ´¿šÌ6J¦"

129
6.7. {üöŠXÚ¥S+n 1 6 Ù . S+n† TLB
˜‡\œUXÚíº>ÀźÝ!DVD ˜Å![Ìä´dì›Eûú
¦^ Linux Šµ,˜ XÚ£E,Ý؄kõŒ O¤,S.u¦^
{üöŠXÚ"
, Linux ´m˜ è"kžÿvkǤҴ`³¶N­‡
´§XJduöŠXÚ"€ 4\XÚÃ{$Š§m˜ 进X\Œ±
gC?"€§½ösaž;[Ï\)û——êþҌ±‰"e¡ùé{
få5Жk gƒgñµ˜‡û’öŠXÚ¤õ§‡3ÜnρSé<?
E"€‡ (J"
´Ò8c5ù§Š˜‡muö§A?ۜ¹ÑkŒU‡¡é"\Á
ãt؇#;ì+nXڞ§Äk‡‰´§t²x;ìN§)¥
y‰A^^‡J[NÚ¥y‰XÚÔnN"´æ^ üXJ[/
ŒN⦠Unix ;ì+n£ãå5ƒé{ü"´½ ui\ªA^
öŠXÚÏ~å uvk;ì+nõUM‡§Ù?§;ìN~~Y
,k˜ vkN/ŒÛõ3Ù¥"^Y)!’Ü„kF%ÒØJt²x"

130
1 7 Ù 2:|±
1987 c§MIPS FPU ïåóŠÕþ‡?nìêÆ5Uá #
p§ "† CPU Äþ´{ü†¢ẏ6uÄNX(5¼
5UØÓ§FPU ´˜‡¿÷ M#ڜ¦DÛª7ŒNO"
5§MIPS FPU É SGI é˜Ýáu‡?OŽÅ3/êÆ5U
I‡ ˜´J,"2:OŽ3i\ªXÚ¥¦^Oƒ ú¶´é
u2:I¦oª³´3M‡E,5†^‡{ü5Ú´‘o5ƒm?1ï§
ù‡²;ï(J£‘Xžm¤¬Š˜‡•uÐ"k˜U§¤k“Ì6A
^”?nìѬlØm2:õU"
7.1 k'2:êÄVg
2:êƑkNõ “5"\Né§Vgš~˜Ù§é[!ŒUÒ
 "!0 ˜e2:ê∇|¤Ü©±9ˆg“L¿Â"ù‰
·‚ŒUù éõ\®²£¶žaL!´‡3¿‘©"
?nš~Œ½öš~ê<S.uæ^ê/‰ÆPê{¶~X§l/
¥ål
93 × 10 =p
6

ù‡ä½Â˜‡—ê(mantissa) 93 ژ‡ê(exponent) 6"


ÓålŒ±µ
9.3 × 10 =p
7

ꊩÛ< U^1«/ª¶˜‡›?›êژ‡0u 1.0 Ú


9.999. . . ƒm—ꧡ5‚z" 5‚z/ªéuOŽÅL«k^§Ï
1

·‚ØI‡ &EP¹ê: ˜"


OŽÅ2:괍ê/ª§´± 2 . Ø´± 10 ."—ê
ڍêÑ´?›"==rêÜ©†¤ 2 ˜§þ¡Ú^ålŒ±µ
1.38580799102783203125 × 2 =p
26

1 3ù«/ª¥§—ꏉ“êÜ©”½ö“ê” ——,ùN´PÁ"
131
7.2. IEEE 754 IO9Ù{¤µ 1 7 Ù 2:|±
—ꌱLˆ˜‡?›ê§Ò‹›?›˜¶'Xµ
1 1 1
1.38580799102783203125 = 1 + 3 × +8× +5× + ...
10 100 1000
Òu?›Šµ
1 1 1
1.0110001010001000101 = 1 + 0 × + 1 × + 1 × + ...
2 4 8
´—êڍêÑØ´–ù±IO/ª;——‡n)Ÿoù§k7
‡k£˜e{¤"
7.2 IEEE 754 IO9Ù{¤µ
Ϗ2:?n´êCqL«£Ò”꘤§LOŽÅ¢yéu
?nš~½éŒê1ž3[!þˆØƒÓ"ùÒ¿›X§êŠOŽ~
§§=¦“蘧Ù13ØÓOŽÅþŒUk O"3,«¿Âe§ù
OØATkŸo¯Kµ3vk=‡¢yU )˜‡ý“(”‰Y
œ/e§UØÓ‰Y"
¦^OŽìwÑdd —ù«N<y–µXJOŽ˜‡ê²
Š§, 2²§éU 5ê§ ´‘kéõ 9 (J"
êŠOŽ~§ŸþJ±?§ J±y²Ù(5"éõŒþ¦^
¼ê£'X~„n¼ê¤Ò´ÏL­E%COŽ"ù~§ŒU3˜
« CPU þŒ‚/Âñ((J§´†˜‡ CPU é,‡JŽŠŒUÒ
¬€\k̂"
ANSI/IEEE 754 IO——1985 IEEE Standard for Binary Floating Point
Arithmetic £Ï~{¡ IEEE 754¤——ÑÒ´ )ûù«·ÏG¹"
TIO°(½Â ˜aÄöŠA)(J§)34à^‡e(J§
y§S Ø+^ŸoÅ짐‡´ÓÑ\ÒU Ó(J"¤^
{Ò´lz˜«|±ê₪¥¼¦ŒUp°Ý"
N IEEE 754 À‘õ §ƒéudc·bG´˜‡ãŒ?
Ú¶gl 1985 c¤ýISIO±5§IEEE 754 ®²¤ ¤k#¢yÄ
:"
IEEE 754 5½öŠ) MIPS CPU M‡Œ±‰1Ü2:öŠ§„
‡\þ˜ 7Ld^‡•ýöŠ"IEEE 754 5½ eöŠµ
• (J\ڰݵ=¦{ü$Ž(JkŒUÃ{^kêL«¶
~X›?›êµ 1
= 0.33333 . . .
3
=Á̂§Ã{°(Ñ" #N^rko«À‘µ•þ\!
IEEE 754
•e\!•"\½öC\"\(JÒ´ƒu±Ã°ÝO
132
7.3. IEEE 2:ê;ª 1 7 Ù 2:|±
Žƒ 2\"Á°Ý(JTÐ0uü‡ŒL«/ª¥mž§
C\¬—Â5¶Uì5½ù«œ¹ATÀJ$k "Š"
• Ÿožÿ˜‡(JwŠ´É~ºIEEE 754 gC½Â É~ù‡c"Œ
±)É~OŽ(J)µ
- ÿ§'X¦ -1 ²Š£“Ã(invalid)”¤
- “Á”§†½mر"—(J
- Œ Ã{L«£“þÄ”¤
-  —L«¬Ô”°Ý£“eÄ”¤
- Ã{°(L«§'X £“Ø°(”¤——Ø7`§éuŒõê85
1

`§ÑŒ±ɁCCqŠ
3

¤kù Ü3˜å§Ú¡É~(J"
• ˜‡öŠ)É~(Jž¤æĊµéuþ¡Ñz‡É~(J
a§^rŒ±3±eA«ª¥ÀJµ
- ^rŒ±4OŽ¥ä§4§S±,«6uöŠXÚ½ö?§Šó
ªuÑ&Ò"Ü©´duTIO¿vké^rÉ~½Â˜«äN
Šó”½§ù«ªAl5vk^L"˜ FORTRAN ?ÈX
Úéù«œ¹)—·†½Ã¡Œ(J"
- ~„´§^r§S¿ØŽ IEEE 754 É~"3ù«œ¹e§
TIO5½AT)=‡Š"þÄÚر")ጣ©KÃ
¡Œ¤¶ÃöŠ)ü«º‚šê NaN (not a number)§©O
¡“%N£quiet¤”ªÚ“²-£signaling¤”ª"Šéê)˜
‡“š5‚z”L«§°ÝÅìü$†–ž”""
TIOӞ½Â éÉ~Š?1öŠ(J"áŒÚ NaN ˜½
)?˜ÚáŒÚ NaN§´˜‡%Nª NaN ŠöŠêج>
uÉ~wś§˜‡²-ª NaN ^ŠOŽž¬—#É~"
Œõê§SØ^ IEEE 754 É~w§ ´6uXÚ)(É~
Š"
7.3 IEEE 2:ê;ª
í 3A‡Øӌþ?è2:êØÓ?›‚ª"Ñk˜
IEEE
Ó°|A5§ù A5´Äudc·bc“p¢y< ²ƒþ
" 2

754 ´›½ûÐIOL§˜‡;‰¶ƒžm˜ã·b¢ό±4<‚é
2 IEEE

ÑЉ{?˜ÚuЧ, d˜ éuEâkn)¿ ¿“j½^r£d?=êŠOŽ


133
7.3. IEEE 2:ê;ª 1 7 Ù 2:|±
1˜‡¯´ê¿vk±kÎÒ?›ê/ª§ ´æ^
˜(biased) ª§ù˜5ê[µêŠ 1 “L£Kê¤Ü
{êŠ¶éu 64 IEEE ‚ª§ê 11 ݧŒ±NBl 0 
2047 Š"êŠ 0 Ú 2047 £ 1 Š¤3^uAÏ8£·‚¬¬ù
¤§¤±·‚Œ±L«ê‰ŒÒ´l -1022  1023"
éuêµ
—ê × 2ê
·‚3ê¢S;Š´
ê + 1023
˜ê£„kc[Süˆ‡gS¤¬)k^J§y2:'
£ƒ!Œu!u¤Úü‡dÓ ¤‘ÎÒê'(
JƒÓ"‘ƒ2:'Ҍ±ÏLíd!¯„ÚÙGÜ6Jø"
7.3.1 IEEE —êÚ5‚z
IEEE ‚ª¦^˜‡Ú—ê©mÎÒ £0 “LÒ§1 “LKÒ¤"¤±
;—ꐇL«êÒ1 "¤k IEEE ‚ª·L«êÑ´5‚z§

1 ≤ —ê < 2

ù¿›X—êpk £3ê:c@˜ ¤[ 1§¤±·‚¢Sþ


ØI‡;§"IEEE IO¡ƒ Ûõ "
¤±y3ê 93 000 000 5‚zL«?›—ê1.01100010110001000101§
?›ê 26§^ IEEE 64 ‚ªL«˜ù µ
—ê = 01100010110001000101000 . . .
ê = 1049 = 10000011001
l, ˜‡Ýw5§‘kêÚ E Ú—ê m  64 IEEE êL«
Š f , Ù¥µ
f = 1.m × 2E−1023

£‡É 1.m “L?›ê§ê:c¡ 1 § ¡´—êSN¤"


?§< ¤¤.” ¬\±IOz", §IO” ¬‡)‚¸§NïÄå5ék¿
g§% l ù˜;‰"

134
7.3. IEEE 2:ê;ª 1 7 Ù 2:|±
7.3.2 Aϊ¦^ 3êŠ
êځŒŠ^5L«š{êþ"
E == 0 ^5“L"£—ꏏ"¤Údu ØU^IO/ªL« æ
^š5‚z/ªL«ê"E "!—ê m š5‚zêL« f §Ù¥µ
f = 0.m × 2−1022

‘Xš5‚zêC§°Ý¬ÅìԔ"8cŽ) MIPS CPU Ø


U ?nš5‚z$Ž(J½öŠê§(J½öŠêš5‚z$ŽÒ¬
†Ý^‡É~?n§S"y“ MIPS FPU Œ±˜¤^"“Oš5
‚z(JUY$Ž"
E == 111 . . . 1£= 2047 3 IEEE V°Ý2:êæ^ 11 ¥?›
L«¤^5“Leµ
• —ê"ž§“Lš{ŠKጣ^Ï~ÎÒ «©¤"

• —ê؏"ž§“L²-šê NaN"éu MIPS§—êpk (½


NaN ´Ä%N(quiet)šê (0) ½ö²-(signaling)šê (1)"ù‡ÀJØ
áu IEEE IO˜Ü©§ ڌõêÙ§oN IEEE IONX(
¤^½ƒ‡" 3

7.3.3 MIPS FP ê₪


NX(æ^ IEEE 754 íü«2:‚ªµ
MIPS

• ü°ÝµŒ±˜? 32 ;˜m"MIPS ?Èì^ü°ÝL« float


a."
• V°Ýµ‡^ 64 ;˜m"C Šó?Èì^V°ÝL« C  double a
."
;ìÚMìÙÛXã 7.1 ¤«§„k˜ ~fü«êâNü"
5¿ float a.L«Ã{°(/NB– 93 000 000 ùê"
¤˜‡V°Ýêü‡i3S¥^S£pk 3k§½ö$k
 3k¤ûu CPU —à——31 10.2 !"—k?Ø"ù‡^So´Ú
êü—ౘ—"
e¡ C (N½Â MIPS CPU £Œõê MIPS óäó´ù§‡
5¿§˜„5`§C (NÙÛûuäN?Èì Ø=´8I CPU¤þ
ü«2:a.µ
3·ƒ&k HP Precision Š Ú MIPS ÓÀJ§ù:V«öƒmk,«D«'X"?¿
 1/0 ÀJ´OŽÅE⥂âN DNA"

135
7.4. MIPS é IEEE 754 ¢y 1 7 Ù 2:|±
#if BYTE_ORDER == BIG_ENDIAN

struct ieee754dp_konst {
unsigned sign:1
unsigned bexp:11;
unsigned manthi:20; /* cannot get 52 bits into ... */
unsigned mantlo:32; /* ... a regular C bitfield */
};

struct ieee754sp_konst {
unsigned sign:1
unsigned bexp:8;
unsigned mant:23;
};

#else /* little-endian */

struct ieee754dp_konst {
unsigned mantlo:32;
unsigned manthi:20;
unsigned bexp:11;
unsigned sign:1
};

struct ieee754sp_konst {
unsigned mant:23;
unsigned bexp:8;
unsigned sign:1
};

#endif

7.4 MIPS é IEEE 754 ¢y


‡¦éù— ü‡¯K"Äk´SïÉ~(JuÿU
IEEE 754
処¦6Y‚éJ¢y"\NŽ^ù«‰{5¢y IEEE É~&-Å
›§´ gÏ´U uÿ, M‡Ã{)((J I‡Ï
136
7.4. MIPS é IEEE 754 ¢y 1 7 Ù 2:|±

ã 7.1: 2:ê₪
œ¹"
XJ^rÀJ IEEE É~(J)žw§@o‡Žù:k^{§É
~u)ÒAT´ÓÚ¶ g€u) §^ròw¤kc¡-щ1
4

.§ ¤k2:MìE,?u-‰1cG§„‡y Y-„v
k)?ÛJ"
3 MIPS NX(¥§M‡g€£X 5.1 !¤«¤DÚþÒ´ù"ù˜
:(› 2:öŠ6YzŬ§Ï\‡†M‡(2:öŠØ¬
)g€žÿâUJ ¡-" ;O\‰1žm§2:öŠ7L3Ö
öŠê 1˜‡ž¨±Ïãû½´Äg€"éuŒõêÉ~(J§FPU
Œ±Œ‚ßÿ¿ ?یUg€OŽ ʎ6Y‚¶, XJ\ò FPU5

˜æ^M‡&Òw IEEE š°(É~(J§@o¤k2:6Y‚öŠ


ÑBŽ§˜ƒÑ¬úe5"\ŒU؎@‰"
'u IEEE 754 1‡Œ¯KÒ´éÉ~(J¦^§AO´éuš5
‚zêâ——áuÜ{öŠê"– MIPS FPU ù¡OÜ6ü´pÝ
(z§É~(JØN´˜e"3((J‡ÑM‡L«Uå/§
Ò¬u)g€¿3 Cause(ExcCode) ˜\˜‡™¢yöŠè"ù†
 JÒ´É~?n~§é2:A^C7،"y“ MIPS CPU ~~3
FCSR ››/GM쥝¹˜‡½õ‡†¢yƒ'À‘ §\O±ã
3ÖÙ§Ü©Ú MIPS © ¥§\ò¬wù‡^‡¡Š“°(É~”"´u3
4

IO¥“°(”Ú“É~”Ñ®²^Š , ¿Â§·‚3ùpÒ¡ƒ“ÓÚg€”"k
IEEE
ùp· "
k CPU édæ^éuª{§kžÿ¬Ï˜‡ ¿™g€öŠ ʎ6Y‚¶ù
5

´˜‡5U¯K§XJØ´²~u)¯KÒ،"
137
7.5. 2:Mì 1 7 Ù 2:|±
+î‚ IEEE 754 oN5“d†5UžŒ±˜ù ——ŒU5Œ
´—— ;‡Oœ/e“™¢yöŠ”g€ ˜ù "
7.4.1 ¤k MIPS CPU ÑI‡2:g€?n§Sڕý§S
MIPS NX(¿vk(ƒ£ã= OŽ‰1ÃI^‡Zý"éu?Ûý
¢^2:“è§^‡2:•ý§SÑ´7‡"
3¢‚¥§FPU 3§SŒU)OŽé˜Ü©þâ¬g€"{ü
¦^2:4kŒUl5Ñج)M‡?nØ œ/"
˜‡wþ¹ ·œ/éв{KXeµ
• MIPS FPU ˜‡öŠA)Ø š°(ÚÄу ?Û IEEE É~
ÚÉ~(JžÑu)™¢yg€"éuÄѧM‡¬)˜‡Ã¡Œ½
ŒŒUŠ£ûuc\ª¤"FPU M‡Ø¬ɽö)š
5‚zê±9 NaN"
• MIPS FPU £Ø @ϱ ¤‰\Jø˜‡^ueÄš IEEE Œ
Àª§é˜‡š5‚z£‡¤(JŒ±gĤ""
™¢yg€´ MIPS NX(¢y˜‡E|§Ú IEEE É~IO
^‡kéŒØÓ"\Œ±$1˜‡§S¿Ñ IEEE É~§ ÉK-ò¬
)˜‡²(½ÂÉ~Š¶´\ØUљ¢yg€§ Ø)ÿÂ
(J"
7.5 2:Mì
Pk 32 ‡2:Mì§Ï~P $f0–$f31"Ø ˜ ýé
MIPS CPU
P£MIPS I¤CPU ƒ §z‡2:MìÑ´ 64 §U NB˜‡V°Ý
Š"
@ MIPS CPU k 16 ‡2:Mì"3,«¿ÂþŒ±`´k 32
‡ 32 M짴z‡Û/ó?Òé|¤˜‡êÆü£,)V°Ý
2:êÆ ¤"Ûê?ÒMì=3‰1\1!;Ú3ê2:Mìƒm
Dxêâžÿâ^" XJ\wŠ®?ì\3P CPU )¤“è§Ò¬
6

ÏL˜é load/store Åì-5ܤV°ÝDx¶ MIPS I oN“è


žÿ§\l5ØI‡wÛê?ÒMì"
MIPS I ž”®²éÈ §´ 5 CPU 3 SR(FR) ¥\? ˜‡“o
N ” ——± 0 Ò¬ MIPS I oNöŠ"E,kØ^‡±ù«ªó
Š"wå5¦^õ2:MìД´vkÞM——´ùØ´‡<Œ±À
6 ŠrN˜:´µÛê?ÒMì¦^ØÉ CPU —àK"

138
7.6. 2:É~/¥ä 1 7 Ù 2:|±
J¶\I‡u\?Èì|±Ÿo§‡XÚ£)¤k¥ÚÙ§Ú\
“è¤I‡Ú?ÈìMì^{±˜—"
„ŠÑ˜:Ò´ MIPS FP Mìkž^5;ÚöŠkÎÒ
.ê⣠32 ½ö 64 ¤"AO´§§S?1êÚ2:êâ=†ž§ù =
†öŠ3 FPU ¥?1——32:Mì¥rêêâ=†¤2:êâ"
7.5.1 2:MìDÚS.·¶Ú^{
L 7.1: 2:Mì¦^½
ABI
o32 n32 n64
¼êˆ£Š $f0!$f2
ëêMì $f12!$f14 $f12–$f19
¼êN^m‡ óê$f20–$f30 $f24–$f31
£·^uMìC
þ¤
žCþ£¼êN^ óê$f4–$f10! óê $f4–$f10! $f1!$f3–$f11!
ƒmؽ“dN $f16!$f18 $f16!$f18!¤kÛ $f20–$f23
^ö”¤ ê $f1–$f31
‹Ï^M옧MIPS N^½\þ ˜@†M‡Ã'Mì
¦^5K¶wŠ\= 2:Mì^5D4ëê§= MìŠ3¼êN
^ƒm‡"L 7.1 ‰Ñ n«~„ ABI"A^§S?›
ABI(Application Binary Interface) ´k'½nܝã§ù ½#N
¬——ŒU´^ØÓóä?ÈЗ—U ¤õÊܘ夏˜‡§S§
¿U3Î܇¦öŠXÚþ$1"3 11.2 !·‚?˜Ú?Ø API ¶Ò8c
󧐇` o32 ½^uPª MIPS I CPU  16 ‡MìSü§n32 Ú n64
½£Ø‡+c˜‡¶i¥ 32¤U^u 64 CPU"
õU©ÄþÚêM옧vkAϜ/"´du{¤þØ
3Ûê?ÒMìϧ2:MìõU©‡ÏØ"
7.6 2:É~/¥ä
˜‡2:öŠØU)((Jž§½ö‡¦3, ½öÜ IEEE
É~(Jþu)g€ž§Ò¬u)˜‡ MIPS É~§X1 5 Ù¤ã§Cause M
ì£ãX1 3.3.2 !?Ø"
2:É~o´°(µ3\ˆÉ~?n§S@˜:§—É~-
Ú?¿ Y-wþҖl™u)L"EPC ò¬•­#m©-(/
139
7.7. 2:››µ››/GMì 1 7 Ù 2:|±
L 7.2: 2:››MìVã
½¶¡ CP1 ››Mì?Ò £ã
FCSR 31 ¦››Mì——{¤þ MIPS CPU ¥˜
FPU ››M짝¹ ¤k›› "3¢S¥§
k ÏL FCCR!FEXR Ú FENR B"ë
„e©"
FIR 0 FP ¢yMìµ'u FPU UåÖ&E§3e˜
!ùã"
FCCR 25 FCSR Ü©&E­#|„§#N3ØKÃ' 
FEXR 26 œ¹e#"´3ØoN MIPS32/64  CPU
FENR 28 þéŒUvk"FCCR k˜‡2:^‡è§FEXR ¹
k\Ö IEEE É~^‡&E£ÏÚI“
¤§FEXR k£Œ¤IEEE É~^‡¦U"
"X1ÊÙ¤ã§EPC ‡o•u)É~-§‡o•;EXc˜^
©|-"XJ´©|-§GMì SR(BD) Ò¬˜ "
7.7 2:››µ››/GMì
'u FPU M‡&EÚUCŒÀ1››&E±?n웛Mì
/ªJø§ÏL ctc1 Ú cfc1 -5–¯§ùü^-©OòêâDx½ö
Dxћ›Mì£,´ÚÏ^MìƒmDx ¤"
Ù¥~„Ò´2:››/GMì FCSR§ r^r'u2:öŠ
7

À‘&Eڛ›Ü3 ˜å"'uM‡‚ûÚUå&E˜3˜!ù
¢y/‡Mì FCR0 ¥"
¦^ FCSR Q²¤˜|‰§ÏÙr֍·Ü3˜å µ¤±3
MIPS32/64 CPU ¥kn‡9ÏMì FCCR!FEXR Ú FENR ±N´
?nªJøÓõU"
ùÒ/¤ ÐA‡M짞ë„L 7.2"
e¡´éã 7.2 ˜ `²"IP 0 Öя 0§\žA 0"
• FCC7–1, FCC0: ù ´^‡ §d2:'-˜!^‡©|-ÿ
Á"kk FCC0§±cQ²¡ FCSR(C) ——´¤ky“ MIPS
CPU ÑJø 8 "FCCR Mì——XJ\ CPU Jø{——‰\J
ø r¤k^‡ 8¥˜åÑÖ"
5¿3ùp§„kÙ§/§2:¢yŠ ·‚31 1 ÙùL RISC
K"ùkÐA‡¡ϵ
7 ±c FCSR Q¡ FCR31§´·¿^N´PÁÎÒ"
140
7.7. 2:››µ››/GMì 1 7 Ù 2:|±

ã 7.2: FPU ››/GMì


– Ð FPU ´˜‡üÕ¡"ÿÁ2:^‡^‡©|ØØ3
êü£êü‡KIéÑ©|8I¤S܉1§ùÒl2
:Mìé"ü‡^‡ éAuü‡M‡&Ò"
– 2:$ŽE,§Ã{3˜‡ž¨±ÏS‰1.§¤±éêék
{ü6Y‚é2:ØUJøZ5U"
©|ÚÿÁ-Ñk˜‡ n Œ±ÀJ½l‡ŒU^‡
¥˜‡5˜½öÿÁ"3 MIPS III ½ö@Ï CPU þ§k˜
‡^‡ §ù« Ñ"" ^‡ éu^‡6Y‚^‡2:“
èäk­‡dŠ¶ë„1 8.5.7 !"
• FS/FO/FN: ù ˜K CPU 3¡ Ã{^IO2:L«ê
žÿ1"XJ\˜ ?ۘ‡§\XÚÒØ2ÎÜ IEEE 754 I
O§Œ±;˜ “™¢y”g€"
XJ\ CPU ´ÎÜ MIPS32/64 §ù ÒÑk"XJØ´§@o¬
¢y FS §–uÙ§§Òé CPU Ãþ "
FS (flush to zero) —˜‡ Ã{æ^IOL«(J£š5‚z
(J¤ww^"“O"Ϗ® MIPS CPU M‡3ù«œ¹eÑØU
)¤((J§ù«‰{Ҍ±;£ ú¤2:•ý^‡g€"
FO (flush override) Ú FS éÜå5uÿš5‚zöŠ¿3SÜ^"“
O"XJÑ\´š5‚z§üÕ˜ FS ج;g€"
FN (flush to nearest) Ú FS éܦ^§ÏLr›š5‚zꏁC
5‚zŠ£kž´Œ±L«ê§ ؘ½´"¤ Uõ°Ý"
• E: 3 FPU g€ƒ §T ˜ ±I“™¢y-É~" 8

z FPU ØU‰1-£´-(´?nì 1 ?褧½ö


FPU Ã{(½3ù öŠþ^ù öŠê´ÄU)ÎÜ IEEE 754 IO
8 MIPS © wþÑkØӧϏrù Š Cause ˜Ü©"
141
7.7. 2:››µ››/GMì 1 7 Ù 2:|±
((J½É~&-ž§T Ò˜ Ӟu)¥ä"
Ø+Ÿoϧ E ˜ ž§\ASüƒA-d^‡•ý§S­
#‰1"
?Û FPU öŠu)“™¢y”É~ž§8IMìSNѱØC§
2: Cause Ø(½"
• Cause/Enables/Flags: z‡Ñ´ 5 §z‡ IEEE É~a.éAu˜
µ
V 4 ÃöŠ£'X -1 ¦²Š¤
Z 3 ر"
O 2 þħ(JŒ Ã{L«
U 1 eħ(J Ã{L«
I 0 š°(£é^——=¦ 1 ر 3 ^?›ØU°(L«¤
n‡ØӍóŠXeµ
- Cause: £dM‡½ö•ý^‡¤ŠâC¤2:-(J
˜"l FEXR ¥ÖN´"
- Enables: öŠ)˜‡É~(JŒU¬˜ƒA Cause ž§
XJÙ¥˜ ˜ §@o CPU Ò¬u)g€§ù^‡Œ±æ7
‡„–wÉ~(J"\QŒ±ÏL FSCR Œ±ÏL FENR
5˜ù "
- Flags: ù ´ Cause “”‡§´glþgMì˜"
±5u)É~(JÜ6“½”"Flags UÏL\ FCSR ½
FEXR 52g˜""

• RM (rounding mode): ù´ IEEE 754 5½7L¢y"#NŠXL 7.3


¤«"
NõXڽC\ RN %@1"\ŒUl5ج^O\
ª"
NX(yXJ˜‡öŠØ˜ FCSR(E) ´%˜ ˜‡ Cause
§@o Cause ˜Ú)(J£XJƒA Enable '4¤ÒÑÎ
Ü IEEE 754 IO"
MIPS FPU 6^‡•ý£=æ^™¢yg€¤5ˆA‡8µ

• ?Û¹kš5‚zöŠê½ö(JeÄ£)š5‚z(J¤öŠ
ò¬g€•ý§S"•ý§SgC7LÿÁeĦU ´Ä˜ §‡o
>u IEEE É~§‡o)¤((J"

142
7.8. 2:¢yMì 1 7 Ù 2:|±
L 7.3: 2:››Mì¥\ª?è
RM Š £ã
0 RN (Rounding to nearest C\)µò(J\CŒL
«Š¶XJ(JTÐ uü‡ŒL«Š¥m§\""
1 RZ (Rounding to zero •"\)µò(J\ÙýéŠu½
uÁ°(ŠCŒL«Š"
2 RP (Rounding up, or toward+infinity •þ\§½•á\)µ
ò(J•þ\e˜‡ŒL«Š"
3 RN (Rounding down, or toward-infinity •e\§½•Ká
\)µò(J•e\e˜‡ŒL«Š"
• AU (£O)Ãg€öŠ§ùXJ¦U IEEE É~§•ý
§SҟoÑØ^‰"´XJBŽ IEEE ÃÉ~§Ò¬N^^‡•ý
§S§ÏM‡ØU)¤·(J£Ï~´%N NaN¤"
éuöŠê²- NaN œ¹?nƒÓ"
• Œõê2:M‡éu~5Žâ$ŽŒ±?nþÄ£ûu\ª§‡o
)¤k4ŒŠ§‡o´Kጤ"´I‡^‡•ý§S¢y˜
‡u)ÄÑ2:ê=†öŠ"
Cause 3™¢yöŠg€•ý§S ™½Â"
Ï~‰{´Jø˜‡õU•ý§S£U 3vk2: CPU þJø
IEEE oNŽâ$Ž¤Š FPU M‡ "XJ\XÚJø'ù„§
ÒéJéÑ=p⌱SŽÑõU"
7.8 2:¢yMì
u Config1(FP) ƒ wÖ FIR Mì±éÑ\´Äýk2:
üµFIR wŠ\§U‰Ÿo§±9£ó¤§´Ÿo‡——ëwã 7.3"

ã 7.3: FPU ¢y/‡Mì


ù Xeµ
µM‡¬¤?Û=†öŠ£2:a.ƒm±92
• FC(full convert range)
:Úêa.ƒm¤ جÏ^¤k —“™¢y”É~"
143
7.9. 2:-H 1 7 Ù 2:|±
• F64: ùL²k 32 ‡V°Ý2:Mì——Ò´`§Ø´Pª
MIPS I º‚2:ü"

• L/W/D/S: ü‡ I“T CPU ´Ä¢y 64 ê£L¤§32 


ê£W¤§64 2:V°Ý£D¤§32 2:ü°Ý£S¤öŠ"XJØ
UÜ|±ù §@\I‡˜ šÓÏ~^‡|±"
• 3D/PS: L²´Ä|±ü‡ŒÀ-8"PS ¿›XPk¤kŽâöŠü
°Ýé SIMD ‡§± .ps MI“µz‡-3C\Ә‡Mì
˜éü°ÝŠþӞ?1ü‡öŠ"ë„1 7.10 !"
3D L«|± MIPS-3D -8*Ð"ù´˜‡é*Чk3|±ü
°Ýéƒ âk^§¤±˜31 7.10 !ù"
• ProcessorIDµ;.œ¹e§ˆ£†êü3?nì 0  PRId Mì
¥?nì ID ƒÓŠ"Nk^´§XJýk FPU M‡Œ^
{§ÖžATš"Š"3\ÖTƒc½ö¤õ$1?Û2:$Ž
ƒc§\½\öŠXÚI‡ò CP0 “G”M쥓?nì 1”¦
U SR(CU1) Ġ#NG"
• Revision: Tûu¢yö¶±TéÿÁJ󧓌„ŒUk^§
I‡^^‡¢yŽÑ, M‡†ØžÿŒUF"ÿÁT"Ødƒ
§^‡AjûÑù‡Š"
7.9 2:-H
!UìõU©aù)¤kIO2:-"e˜!ù“ü°Ýé”Ú
MIPS-3D *ÐJøŒÀ-"
2:-UìÏPÎi1gS3L 8.4 ¥§?›?èÚÙ§ MIPS -
˜å3L 8.6 ¥"
·‚rù -©¤eAaµ
• Load/store: 32:MìÚ;ìƒm†Dxêâ"

• MìmDx: 32:MìÚÏ^MìƒmDxêâ"

• nöŠêŽâ-µ˜„\~¦Ø"

• ¦\öŠµ#Û£²wš RISC¤p5U-§MIPS III 9ƒcvk"

• UCÎÒµ{üöŠ§©m5ù´ÏÙ{ü¢y[ج— IEEE
É~"
• =†öŠµü°Ý!V°ÝÚꊃm=†"

• ^‡©|ÚÿÁ-µ2:ü†ê6Y‚2g-¡/"

144
7.9. 2:-H 1 7 Ù 2:|±
7.9.1 Load/Store
ù öŠò 32 ½ 64 êâl;ì\12:M짽öl2:M
ì;;ì"3\1Ú;ž§‡5¿±eA:µ
• Ø=†Ø wêâ§=¦L«´‡Ã2:ꊏجÚuÉ~"

• MIPS I º‚ 32 FPU U3óê?ÒMìþ?1êÆ$Ž"é


uÛê?ÒMì\1Ú;Œ±4\–¯ 64 Š,˜Œ"
• MIPS I Ú MIPS II CPU #N32:\1êâ)ƒcs¤˜‡ ±
϶Ø#Né@‡êâ¦^‰1p££Ó5K·^uéÏ^M
ì\1¤"?Èì/®?ìÏ~¬\?nù §´3Pª CPU þ
2:\1‘ ;‹˜^¦^\1Š-´Ã"
• 3®?§Sž§“ܤ”/ª-£'X l.d ¤AT'/Åì
-£ldc1¤`k¦^¶“ܤ”/ª´Ö Œ^u¤k CPU"®?Œ±
^õ^-5¢y CPU ™¢yÅì-"˜‡Ü¤ load/store öŠ
Œ±^®?ì|±?Ûόª£X1 9.4 !¤ã¤"
• 2:\1/;öŠ/Œ7Léà‡\18IŒ>.——ü°Ý
½öiéàoi!>.§V°ÝÚ 64 êa.éàli!>."
3Åì-£ã¥§£disp kÎÒ 16 þ§“*” C ŠóSN
öŠÎ¤µ
lwc1 fd, disp(s) fd = *(s + disp);
swc1 fs, disp(s) *(s + disp) = fs;

·¤ MIPS64/MIPS32 oN FPU Ñ|±‘64 load/store:

lwc1 fd, disp(s) fd = (double) *(s + disp);


swc1 fs, disp(s) *(s + disp) = (double) fs;

MIPS32/64 O\ VMì¢Úόµ
lwxc1 fd, i(s) fd = *(s + i);
swxc1 fs, i(s) *(s + i) = fs;
ldxc1 fd, i(s) fd = (double)*(s + i);
sdxc1 fs, i(s) *(s + i) = (double)fs;

´¯¢þ§\®?žÿ§ù ÑØI‡P4"“addr”Œ±´®?ì
|±?¿ÏŒªµ

145
7.9. 2:-H 1 7 Ù 2:|±
l.d fd, addr fd = (double) *addr;
l.s fd, addr fd = (float) *addr;
s.d fs, addr (double) *addr = fs;
s.s fs, addr (float) *addr = fs;

®?ìò)¤·-§#NlA‡kόª¥?1ÀJ"3 32
CPU þV°Ýê\1ò¬®?¤ü^Åì\1-"

7.9.2 MìmDx
êâ3êÚ2:MìƒmDxž§Ø‰?Ûêâ=†§Ø¬u)?
ÛÉ~"´êâ32:MìƒmDxž§\I‡½äN2:êâa
.§èãDx˜‡3½a.¥Ã¿ÂŠ——`ج)É~——ؘ½
¬(€¤k "ù¦ FPU é2:êâ¦^, £ŒUp°Ý¤
SÜL«5¢yDx- Ø^Kú5£=†m"
=¦3 MIPS I FPU 2:?nìþ§ù -Œ±½ÛêÒ2:M
ìµ
3êÚ2:Mìƒmµ
mtc1 s, fd fd = s; /* 32b uninterpreted */
mfc1 d, fs d = fs;
dmtc1 s, fd fd = (long long) fs; /* 64 bits */
dmfc1 d, fs d = (long long) fs;

32:Mìƒmµ
mov.d fd, fs fd = fs;
/* move 64b between register pairs */
mov.s fd, fs fd = fs; /* 32b between registers */

^‡Dx£MIPS III 9±cÑvk¤——ŽÑ .s ‡±!Ž˜mµ


movt.d fd,fs,cc if (fpcondition(cc)) fd = fs;
movf.d fd,fs,cc if (!fpcondition(cc)) fd = fs;
movz.d fd,fs,t if (t == 0) fd = fs;
/* t is an integer register */
movn.d fd,fs,t if (t != 0) fd = fs;

‰ fpcondition(cc) 2:^‡èJ‡•cÚ^¶õSNë„1
7.9.7 !"XJ\Ž )^‡Dx-kŸo^§ë„1 8.5.3 !"

146
7.9. 2:-H 1 7 Ù 2:|±
7.9.3 nöŠêŽâ$Ž
‡5¿±eA:µ
• ¤kŽâ$ŽÑŒ±Úu?˜« IEEE É~a.§XJM‡éöŠêØ
÷¿Œ±—˜‡™¢yg€"
• ¤k-Ñkü°Ý£32 §C float¤ÚV°Ý£64 §C double¤ü‡
‡¶ØӍ-ÏL3öŠèþ\þ“.s”½“.d”5«©"·‚‰ÑV°Ý
‡"5¿ØŒ±·Üü«‚ªµ Ú8I7Lяü°Ý½öяV
°Ý"‡·Üü°Ý½öV°Ý§\I‡?1²(=†öŠ"
3¤k ISA ‡¥µ
add.d fd, fs1, fs2 fd = fs1 + fs2;
div.d fd, fs1, fs2 fd = fs1 / fs2;
mul.d fd, fs1, fs2 fd = fs1 x fs2;
sub.d fd, fs1, fs2 fd = fs1 - fs2;

e¡-3 MIPS III 9±c CPU ¥vk§$Ž„ݯØÎ


Ü IEEE °(݇¦——Ø õŒˆ—ê$ü ¤“LŒ£2
ULP¤:

recip.d fd, fs fd = 1 / fs;


rsqrt.d fd, fs fd = 1 / (squarerootof(fs));

7.9.4 ¦\öŠ
ù´ A SGI 3épàã/XÚ¥ˆaq‡?OŽÅ5UÒ
𣆠1995 c SGI  Cray Research Inc k'¤ 3 MIPS III ƒ \þ"
IBM  POWERPC qlÙ¦\öŠ¼ p„`û2:5U"¦+d
ü‡-¤ü‡óŠkŠ RISC K§Ü¤¦\öŠ3~„­E2
:$Ž¥ 2¦^£;.^uÝ ½ö•þ$Ž¤"d §ÏL;é
¥m(J\Ú­#5‚zÚ½£IEEE 5½ò(J£Mìž7LXd¤
!Ž wÍžm"
¦\öŠkõ«/ª§ÑI‡n‡MìöŠêژ‡üÕ(JM
ìµ
madd.d fd, fs1, fs2, fs3 fd = fs2 x fs3 + fs1;
msub.d fd, fs1, fs2, fs3 fd = fs2 x fs3 - fs1;
nmadd.d fd, fs1, fs2, fs3 fd = - (fs2 x fs3 + fs1);
nmsub.d fd, fs1, fs2, fs3 fd = - (fs2 x fs3 - fs1);

147
7.9. 2:-H 1 7 Ù 2:|±
¿vkäN5½¦\$Ž§¤± ÎÜIO)(JAڃ
IEE 754
¦, ƒ\ü^-OŽ(JƒÓ——ùp‡AO%œÏz‡2:
öŠÑ¬k˜ \Ø §ù¿›X IEEE 754 5½°Ýéu¦\$Ž'¢S
Œ±ˆ‡ "
7.9.5 ü8£CÒ¤öŠ
¦+¶ÂŽŠŽâ$Ž§ù öŠÙ¢´UCÎÒ §¤±Ø¬)Œõ
ê IEEE É~"XJ‰öŠê´‡²- NaN Š§¬)Ãg€"Xe¤

abs.d fd, fs fs = abs(fs)
neg.d fd, fs fs = - fs

7.9.6 êâ=†öŠ
5¿“lü°Ý=†V°Ý”Š“cvt.d.s” ——†Ï~˜§k8IM
ì"=†32:Mì¥êâƒm?1µ=†5g CPU êMìê
➧l2: CPU MìƒmDx7LÚêâ=†©O?è"=†öŠŒ
U—3ƒAþe©¥k¿Â?Û IEEE É~"
˜m©§¤kù ÑkӘx-¤µ
cvt.x.y fd, fs

Ù¥ x Ú y ©O½8IÚ5 M삪§±eƒ˜µ
s C float§MIPS/IEEE ü°Ý, 32 2:ê

d C double§MIPS/IEEE V°Ý, 64 2:ê

w C int§MIPS/IEEE i, 32 ê

l C long long§MIPS/IEEE Vi, 64 ê

-Xeµ
cvt.s.d fd, fs /* double fs -> float, leave in fd */
cvt.w.s fd, fs /* float fs -> int, leave in fd */
cvt.d.l fd, fs /* long long fs -> double, leave in fd */

l2:=†ꂪk؎˜«Ün{§äN(Jûuc
\ª£ùd31 7.7 !ù FSCR M오"´2:OŽ²~Ž‡²(
±,«ª\ê£'Xþ.$ŽÎ•þ\¤§)¤?UÚ¡E FCSR 
“èLæ†"¤±Ø @ MIPS I CPU ƒ §Ñk±²(½ª?
1\=†-§ ^õ"
²(½\ªê=†µ
148
7.9. 2:-H 1 7 Ù 2:|±
round.x.y fd, fs /* round to the nearest */
trunc.x.y fd, fs /* round toward zero */
ceil.x.y fd, fs /* round up */
floor.x.y fd, fs /* round down */

ù -k x “L˜«ꂪžÿâUk"
7.9.7 ^‡©|ÚÿÁ-
2:©|ÚÿÁ-´©m"·‚3e¡?ØÿÁ-——-¶i´ c.le.s
ù«/ª§'ü‡2:Š¿˜ƒA FPU ^‡ "
©|-ÏdIÿÁ^‡ ý£˜ ¤½öb£"¤"Œ±ÀJ½
^=‡^‡ µ
bc1t label if (fpcondition(0)) branch-to-label;
bc1t cc, label if (fpcondition(cc)) branch-to-label;
bc1f label if (!fpcondition(0)) branch-to-label;
bc1f cc, label if (!fpcondition(cc)) branch-to-label;

ÚÙ§ MIPS ©|-˜§z˜‡Ñk˜‡“ŒU©|”CN" 9

bc1tl label /* branch-likely forms of bc1t ... */


bc1fl label

ÚÙ§¡©| CPU -˜§©|8I label ?菘‡ 16 k


ÎÒ꧓L±iü le˜^-\˜£6Y‚󊐪éÛA¤m©
£þ"XJ label u 128KB ± §\Ò¬k憧ØئÏu jr -"
MIPS III ƒc)Ù3S MIPS CPU 32:››/GMì FCSR
¥k˜‡2:G §‰“C”"Ì6 CPU „k 7 ‡ §‰ FCC7–1"
XJ\3©|½ö'-¥Ø½ cc§ÒÛ¹/ÀJ Pk FCC0 J™¡
ÒP C "ù†LP-8‡˜—"£XJ\鏟oÚ\ù‡*Ða
,{§ë„1 8.5.7 !¤3¤k-8¥§cc Ñ´ŒÀ"
´3©|ƒc§\7L·˜^‡ "'$ŽXeµ
c.cond.d fs1,fs2 /* compare fs1 and fs2 and set FCC(0) */
c.cond.d cc,fs1,fs2 /* compare fs1 and fs2 and set FCC(0) */

3ù -¥§cond Œ±´?¿ 16 ‡^‡ÏP΃˜"ÏPÎkžÿ´k


²w¿Â£eq¤kžÿwé “£ult¤"ŸokùoõQº¢Sþ'2:
Šžÿko«pØ­Ü(Jµ
9 ë„1 8.5.4 !± )õ“ŒU”©|"

149
7.10. ü°Ýé2:-±9 MIPS-3D ASE 1 7 Ù 2:|±
fs1 < fs2
fs1 == fs2
fs1 > fs2
unordered (fs1, fs2) ll

Ù¥˜‡öŠê IEEE NaN Šž§IEEE IO½Â“ÃS(unordered)”


ý"
ÏLN†öŠêgS½?1‡•ÿÁ§·‚oŒ±l“u½u”Ü
¤“Œu"” ù·‚Œ±kn‡(J"MIPS Jø -5ÿÁùn‡^‡
?¿“½”|Ü"3dÄ:ƒþ§z˜‡ÿÁkü«/ª§˜«3öŠêÃSžu
)“Ã(invalid)” g€§,˜«l5Øu)ù«g€"
·‚ØI‡–“Øu”ù^‡JøÿÁ¶·‚ÿÁu§, ^
bc1f Ø´ bc1t ©|^‡"L 7.4 Ñ ¤kŒ^-¶¡"
3Nõ CPU ¢y¥§'-(J)§©|-Ã{3ØÚå
U-ò´œ¹e‰1"3 MIPS III 9±c CPU ¥§©|-XJ†
3ÿÁ- $1ŒU—ØĊ"|±Pª CPU ?ÈìÚ®?ìAU
)·ò´§7‡ž\˜^ nop"
L 7.4: FP ÿÁ-
ÏPÎ
“C”˜ ^‡ Ãg€ g€
always false f sf
unordered(fs1, fs2) un ngle
fs1 == fs2 eq seq
fs1 == fs2 || unordered(fs1, fs2) ueq ngl
fs1 < fs2 olt lt
fs1 < fs2 || unordered(fs1, fs2) ult nge
fs1 < fs2 || fs1 == fs2 ole le
fs1 < fs2 || fs1 == fs2 || unordered(fs1,fs2) ule ngt

7.10 ü°Ýé2:-±9 MIPS-3D ASE


ÎÜ MIPS32/64 5‰2:üŒ±ÀJ¢yü°Ýé2:-"ù‡*
ÐÄ:´˜|鋝?˜‡ 64 Mì˜é IEEE ü°ÝŠz˜Œ‰
1ü‡öŠŽâ$Ž"
få5Д‡E˜‡# FPU"´Ù¢N˜eV°Ý2: FPU 5
Jøü°Ýé$Ž¤¿Øp——–éu–\{!¦{!¦\!ÿÁ!Dx
“˜g5” öŠ´Xd"
150
7.10. ü°Ýé2:-±9 MIPS-3D ASE 1 7 Ù 2:|±
·‚ò¦^ fs Ú ft Š Mì§fd Š8Mì"B/`§XJ fs
´˜‡¹ü°ÝéŠ2:Mì§@o fs.upper Ú fs.lower ©O“Lp Ú
$ ü°ÝŠ"
‡éÑ\ CPU ´Ä¢y ü°Ýé-§w˜e FIR(PS) ´Ä˜ Ò
 "
7.10.1 É~Úü°Ýé2:-
Ï~3\I‡^ü°Ýé2:-/§\ŒUI‡Ø`"£/“ŽÉ
~"‡?ۘ^2:-—É~§@o‡-Ñ;ÉÉ~µXJÙ¥˜^
-I‡ MIPS g€§@o\?n˜‡ MIPS “É~”§-üŒÑ‡£E§
Җl™m©‰1˜"É~GžvkL².´pŒÜ©„´$ŒÜ©O
Ž¯K§„´üÜ©Ñk¯K"
7.10.2 ü°ÝénöŠêŽâ$Ž!¦\!CÒÚÃ^‡êâD
xöŠ
ù öŠ¤óŠÚƒAü°Ý£.s¤‡ƒÓ§ØӃ?´‰
1üg"Ò´`§˜^ add.ps fd,fs,ft -duµ
fd.upper = fs.upper + ft.upper;
fl.lower = fs.lower + ft.lower;

ù Ñáu SIMD £ü-!õê⤍-§éu•þa.öŠ4k^µ


3˜‡žmp¤ü‡öŠ"
´§¿š¤k-Ñk .ps /ªµ
• ƒAöŠ¢y §´öŠÏPÎÚü°Ý$ŽƒÓµadd!sub!mul!abs!mov!neg"

• vkü°Ýé.öŠµUìäN‡¦?1\¤köŠ round!trunc!ceil!floor"
ù öŠwþ3•þzA^^‡¥¿Ø@o­‡"
Ø{!êÚ²Š——éAu div.s!recip.s!sqrt.s Ú rsqrt ——vk
ü°Ýé/ª£ù ¼ê;.¢y‡^S“Ž{§Ã{‰˜gO
Žü‡Š¤"
‡´k MIPS-3D *Ð{§KO\ Œ±3üڃSOŽê!½²
Šê-"ù -Œ^uü°Ý2:é PS Š"ë„1 7.10.5
!"
vkê=†- round!trunc!ceil!floor Jøü°Ýé/ª"ù
«öŠ(J¬´Vê邪§du²˜‡#êâa.ДØ
Š"
151
7.10. ü°Ýé2:-±9 MIPS-3D ASE 1 7 Ù 2:|±
7.10.3 ü°Ýéa.=†öŠ
‡lü‡ü°ÝŠ¤˜‡ü°Ý銧^ cvt.ps.s fd, fs, ft -µ
fd.upper = fs;
fd.lower = ft;

‡l˜‡ü°ÝépŒÜ½$ŒÜJ˜‡ü°ÝŠæ^ cvt.s.pl
fd,fs (fd = fs.lower;) ½ö cvt.s.pu fd,fs (fd = fs.upper;)"
‡r˜‡ü°Ý銭#N|„¤˜‡#ü°Ýé§ko‡-Œ
±ÀJ"z^-lü‡ü°ÝéM쥈˜‡Š§n¤#˜éµ
pll.ps fd, fs fd.upper = fs.lower;
fd.lower = ft.lower;
plu.ps fd, fs fd.upper = fs.lower;
fd.lower = ft.upper;
pul.ps fd, fs fd.upper = fs.upper;
fd.lower = ft.lower;
puu.ps fd, fs fd.upper = fs.upper;
fd.lower = ft.upper;

rü‡ü°ÝŠ‹¤˜‡ü°Ýé"Ù̇Š^——†
alnv.ps fd,fs,ft,s
šéà\1-(ܦ^——´9Ï^‡lü°Ýê|¥˜g\1ڋü
‡ü°ÝŠ§=¦Tê|3;ì¥éàª¦z˜égS†m "
 Bun)T-8§rü°Ý銎–¤r“a”Ú“b”ü°Ý
Š‹ ˜å§ùp“a”3;ì¥Óâ$/Œ£M쥆 a Ú b 'é
 ґX—àCz¤"
Ï^Mì s $n ŠŒ± 0 ½ö 4 £s Ï~´^5l;ì\1
˜éŠ¤——4 ± ?ۊѬ—É~"¤±Ò–e¡ùµ
if ((s & 7) == 0) {
fd.a = fs.a; fd.b = fs.b;
} else {
/* s & 7 == 4 */
fd.a = fs.b; fd.b = ft.a;
}

7.10.4 ü°ÝéÿÁÚ^‡Dx-
Ϗz‡ü°ÝéMì¥kü‡Š§¤±'-˜ü‡^‡ "\
Œ±½óêÒ^‡ §-ò¬^T Úe˜‡Ûê^‡ "¤±XJ\
‡´¤ c.eq.ps 2 fs ft§Òu`µ
152
7.10. ü°Ýé2:-±9 MIPS-3D ASE 1 7 Ù 2:|±
fcc2 = (fs.upper == ft.upper) ? 1 : 0;
fcc3 = (fs.lower == ft.lower) ? 1 : 0;

XJ\ØPù “ÿÁ^‡Ÿo§žëL 7.4"


MIPS-3D £„e©¤)˜ ŒU¬^˜gÿÁõ‡^‡è©|
-"
^‡Dx- movf.ps Ú movt.ps§˜gÿÁü‡2:^‡è¿38I/
ŒþŒÜ©ÚeŒÜ©þӞ‰1ü‡Õá^‡ý=DxöŠ§=µ
movt.ps fd,fs,2 if (fcc2) fd.upper = fs.upper;
if (fcc3) fd.lower = fs.lower;

†dƒéì´§movn.ps Ú movz.ps ŠâêMìŠ?1^‡D


x§éüŒ?1Ó?n"
7.10.5 MIPS-3D -
MIPS-3D ASE £-8*ФO\ ˜ @3pŸþ 3-D ã/‹IO
Ž¥U Jpü°Ýé*ÐǍ-"
• 2:“8¿\/¦”£\/¦é¤µ
r˜‡MìS˜é2:êƒ\½öƒ¦"ý SIMD º‚§A´
rü‡ØÓMìSü°ÝéӞƒ\½ƒ¦µ
addr.ps fd,fs,ft -‰1öŠµ

fd.upper = fs.upper + fs. lower;


fd.lower = ft.upper + ft. lower;

mulr.ps fd,fs,ft ‰1µ


fd.upper = fs.upper * fs. lower;
fd.lower = ft.upper * ft. lower;

• éý銣=ÑÎÒ ¤'öŠµ
k˜| cabs.xx.x öŠµ
cabs.eq.d cabs.nge.d cabs.ole.s cabs.ueq.s
cabs.eq.ps cabs.nge.ps cabs.olt.d cabs.ule.d
cabs.eq.s cabs.nge.s cabs.olt.ps cabs.ule.ps
cabs.f.d cabs.ngl.d cabs.olt.s cabs.ule.s
cabs.f.ps cabs.ngl.ps cabs.seq.d cabs.ult.d
cabs.f.s cabs.ngl.s cabs.seq.ps cabs.ult.ps
cabs.le.d cabs.ngle.ps cabs.seq.s cabs.ult.s

153
7.10. ü°Ýé2:-±9 MIPS-3D ASE 1 7 Ù 2:|±
cabs.le.ps cabs.ngt.d cabs.sf.d cabs.un.d
cabs.le.s cabs.ngt.ps cabs.sf.ps cabs.un.ps
cabs.lt.d cabs.ngt.s cabs.sf.s cabs.un.s
cabs.lt.ps cabs.ole.d cabs.ueq.d
cabs.lt.s cabs.ole.ps cabs.ueq.ps

• ÿÁõ‡^‡è©|-µ
bc1any2f!bc1any2t!bc1any4f!bc1any4t 3©|ƒcÿÁA‡^‡
蓽 (OR)"”\Œ±˜^- bc1any2f N,offset§Ù¥ N  0  6
ƒm^‡è"‰1ÿÁ)µ
- ©|žÿÁ^‡
bc1any2f 2, target if (!fcc2 || !fcc3) goto target
bc1any2t 2, target if (fcc2 || fcc3) goto target
bc1any4f 4, target if (!fcc4 || !fcc5 || !fcc6 || !fcc7) goto target
bc1any4t 4, target if (fcc4 || fcc5 || fcc6 || fcc7) goto target

• êÚ²ŠOŽµù̇´Ï"yü°ÝéØ{!ê!²Š
$Ž£,ù -ü°ÝÚV°Ý‡o´k¤"
recip1 fd,fs ´éꘫ¯„oÑCqOŽ"ù´3Ø^“/e”
S“L§U±Ün“dOŽÐŠ——S“L§éü°Ý2:é
SIMD Âñ5ØÐ"'å^IO recip.s Ú recip.d -(J§
ù‡Cq‡ õ§,Œ[Ñvkˆ IEEE °Ý"recip1 öŠØ
Éc\ªK£´‡„Å'u‡“š5‚z”Š)Ú¦
^››I“¤"
recip2 fd,fs,ft ŠÒؖê——Ù¢´˜‡½›¦\$Ž§Ø^•
Mì\1~ê 1 OŽ 1-(fs*ft)"À¥ù‡¼ê´Ï±en-
SU ?˜ÚJp recip1 °Ýµ
recip1.s f1, f0 # f1 =~ 1/f0
recip2.s f2, f1, f0 # f2 = f0 * (error in f1)
madd.s f1, f1, f1, f2 # f1 = f1 - f2*f1, a better guess

éü°Ýêù(J®²v Ð £\،U?˜ÚU? IEEE °


ݧؚüÕ?n, $k §@{OŽòé¤"éuV°Ýê
‡Ð(J§„‡k?˜Ú recip2/madd S"
ù:Ð/3u§ƒAü°ÝéOŽ†U^§§n^-ÒU
)˜ééÐêµ
recip1.ps f1, f0
recip2.ps f2, f1, f0
madd.ps f1, f1, f1, f2

154
7.11. -žS‡¦ 1 7 Ù 2:|±
-^aq{"3ù«œ/e§^ rsqrt2 fd,fs,ft O
rsqrt1/rsqrt2
ŽØ ¼ê (1-fs*ft)/2"
ùg\I‡˜^ ¦{-5)¤Ðü°Ý2:銣EˆØ
 IEEE °Ý¤:
rsqrt1.ps f1,f0
mul.ps f2,f1,f0
rsqrt2.ps f3,f2,f1
madd.ps f1,f1,f1,f3

Ó§‡pŸþV°Ý2:Š§„I‡2$1˜g°zU?Ú
½"
• êéÚü°Ý2:éƒmêâ=†µ
Ϗê/2:ƒm=†o´î‚32:Mì¥?1§Q,kü°Ý
2:é§qg,ÒATk 32 êéµ´©ü°Ýé-8
¥¿vk ö"
‡r˜‡‹ 32 êé=†ü°Ý2:é£ü‡Óž=†¤§^
cvt.ps.pw fd,fs¶_öŠr˜‡ü°Ý2:é=†¤˜é; i§Ò´
cvt.pw.ps fd,fs -"3ü«œ¹e§Ñ´dc\ªû½Cq(
J\{"
7.11 -žS‡¦
~52:Žâ$Ž-´p£§vk7‡ y(5 \
nop -½­#|„“è" Z5U§?ÈìA·Sü2:-
±¿©|^ê-Ú2:6Y‚‰13žmþ­U——´ù‡éäN
CPU ¢y[!š~¯a"
3k Pª£ØoN MIPS32/64¤ CPU þ, OpØ´p£§é
y$Ž(§§S7L;A½-S"3ù«œ¹e§\?Èì!
®?ì!½ö£ „k¤\<§=§S §7Lc[Äeœ¹ežS
¯Kµ
• é2:››ÚGMìöŠµ?U FCSR ž§‡%6Y‚"FSCR
Œ±K?¿U ¿1‰12:$Ž"‡y\3 FCSR ž
ÿ§vk¹Ä£®²m©$Ž´„™Ñ$Ž(J¤2:$Ž"M
죏ŒU¬'§3јü^-5©m ctc1 rs, FCSR ÚÉ
KOŽ-´²œ"
• 2:ÚÏ^MìƒmêâDxµù öŠ¤žm'§XJ
Y-‡^(J§~œ¹e‡›”˜ü‡±Ï"3 MIPS II ڍ@ƒ
155
7.12. -žSÚ„Ý 1 7 Ù 2:|±
c CPU þ\7L;6"
• 2:Mì\1µÚê\1˜§)é" ¡;‹-ØUá=
^f\1Š"
• ÿÁ-Ú©|µ^ bc1t!bc1f -ÿÁ2:^‡ ž?è7Léc[§
Ϗé^‡ ÿÁ'\ýOŒU‡@˜‡±Ï"¤±^‡©|ØU;
‹ÿÁ-ƒ "
7.12 -žSڄÝ
¤k MIPS FPU éŒõêŽâ-чs¤õu˜‡ž¨±Ï§Ï 6
Y‚CŒ„ "6Y‚JŒ±kn«/ªLyÑ5"
• ‘xµ3^‡ U(óŠ 7Ly-©m/Ñy"3
MIPS32/64 CPU þé^r?2:“èvk‘x"
=¦3Pª CPU þ§2:êâ—2:-mvk‘x"
• p£µM‡ o –öŠêOÒXl ò´¦^öŠêœ¹
eu)"·Sü“茱Jp5U"
• Œ„6Y‚µù‡u)3M‡3˜^-¤ƒcÒOm©,˜^
-£cJ´ƒmvkêâ6¤/"?Èì!j½®?§S Œ±
Ñ46Y‚±÷KÖ$=rM‡óŠUåuž4“è"
y“ MIPS FPU ~~´6Y‚z§#N3z‡ž¨å©£éuV
°Ý-ŒU´zü‡ž¨¤éʇ#2:¦{!\{½ö¦\$Ž"
´XJ\‡3e˜^-^,^-(J{§Ò¬4§SÊe5
–µé 2006 c“ CPU§ŒU‡oʇž¨±Ï"†é{`§2:¦{
k˜ü‡ž¨±Ï­EÇ´koʇž¨ò´"XJU;32:
(JOЃc¦^§§SÒ¬¯ "
é2:5`§¦{˜„Ú\~{˜¯"Ø{Úm²-‡úõ¶XJ
\I‡‡EرӘ‡ê§OŽÑê^¦{“OÒk¿Â "
7.13 =IЩzڦU
E ƒ §~œ¹eò CPU  SR MìЩzBŽ¤kŒÀ
?n짝)FPU£=?nì 1¤"SR(CU1) 7L˜ FPU âUóŠ"y“
¤k CPU Ñk 32 ‡ 64 2:Mì§k˜‡ MIPS I oNª§
SR(FR) ˜"žkóêÒM쌱^uêÆ$Ž"

156
7.14. 2:•ý 1 7 Ù 2:|±
\AÖ FPU ¢yMì¶Öя"KL²vk2:M‡§@o$1X
ڞA'4 CU1"
˜ ¦U CU1§A^\À^\ªÚg€¦U˜››/GMì
FCSR"C\ÚBŽÜg€ƒ Ù§ÀJÑé„"„k˜‡À‘‡
˜ SR(FS) 4é(Jˆ£"§Œ±˜‡•ý§Sg€"ù
«‰{† IEEE ¿ØoN§´ MIPS M‡Ã{)¤5½š5‚z(J"
˜ FPU $1å5§\ÒI‡y3¥äÚþe©ƒ†žÚ¡E2:
Mì"Ϗù£ƒé5`¤'s¤žm§Œ±éd?1`z"k öŠX
ÚÒ´ù‰§‰{Ò´e¡“¢ þe©ƒ† (lazy context switch)”:
• $1#?Öžÿ%@BŽ2:"Ϗ?Öy3ØU–¯ FPU ,NÝÚ
6ÊžÿÒØI‡Ú¡E2:Mì"
• u) CU1 ،^g€ž§I£T?֏2:^r§ˆ£ƒc¦U2
:"
• ?uØ%ž½¥ä~§†mN^^‡¥ž§BŽ2:öŠ"
@o\Ҍ±;3¥äž2:M춐k\3Ú¦^2:?
Ö?1ƒ†žâI‡½¡E2:Mì"
7.14 2:•ý
k $¤ MIPS CPU 9Øؑ FPU"ù ?nì2:õUd^‡J
ø§'M‡Œú 50–300 "^‡2:32:4^XÚþék^?"
^‡?n2:kü«Yµ
• ^2:µŒ±ž¦, ?Èì^^‡¢y2:"2:Žâ$ŽŒU^˜‡
Ûõ¥¼ê5¢y§´”êâDx!\1!;,֌±^†ê
˜—ª?n"
• g€Ú•ýµ?È쌱)¤~52:-"CPU 3d2:•ý§SÓ
¼z‡2:-þu)g€"•ý§S?1-È迤^‡ž¦
öŠ"•ý§SóŠ˜Ü©´^;ì[2:Mì8"
Xùp¤ã§$1ž•ý§SééöŠê½)œöŠ7LU •
ý2:M‡1¶ÏNX(k¿é2:M‡ I¹ ؘ§•ý§SÏ
~Ñ´"´§•ý§Sy°(oN IEEE § Äóâ¬N
^§¤±•ý§S“èõÄ´(5 Ø´„Ý"
?È2:LJpõ¶•ý§Séz^-Ñk˜‡5g€?n§S!
-Èè!Mìæ•ýˆ¡Øm"´, §\7L­#?È
ܧSâU|^Ù5U"
157
7.14. 2:•ý 1 7 Ù 2:|±
ŒU„k˜ ?Èì¿ØJø^‡2:$ŽµMIPS NX({¤å u
óŠÕ§ óŠÕÑ7L‘k2:M‡"

158
18Ù MIPS -8ëŒ
1l!ÊüÙ´‰Ž‡wÃÚ)¤®?“è£Ø+´ŠgÖ®?“è
„´Ï‡?½ö?U?Èì mI‡¤§S "1 9 Ùâý?Ø®
?Šó§SO§Ù=='%´®?Šó-¶oÑ`§XJ\I‡
U n)‡®?ÑÑL§ÒŒ±aL1 9 Ù"·‚kl˜ã{ü MIPS “
èژãVãm©"
8.1 ˜‡{ü~f
e¡´ C ¥¼ê strcmp(1) ˜‡¢y§T¼ê'ü‡iÎG§ƒž
ˆ£"§XJ1˜‡iÎG£UiÎG^S¤Œu1‡ˆ£Š§ÄKˆ£K
Š"e¡´˜‡†¢y C Ž{µ
int strcmp (char *str1, char *str2)
{
char c1, c2;

do {
c1 = *str1++;
c2 = *str2++;
} while (c1 != 0 && c2 != 0 && c1 == c2);

return c1 - c2; /* clever: 0, +ve or -ve as required */


}

3®?“襧C ¼êü‡ëêl a0 a1 Mì¥Dx"£‡´\#P


Mì·¶½{§žëL 2.1¶1 11.2.1 ![?Ø MIPS ION^
½"¤”ù{ü~§Œ±‘B¦^žMì t0  ÃIÚ¡E§
¤±w,ÀJžM옞Cþ"T¼êk˜‡ˆ£Š§Uì½3ˆ
£ž‡˜? v0 Mì"@·‚y3Òw˜eµ
strcmp:
1:

159
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
lbu t0, 0(a0)
addu a0, a0, 1
lbu t1, 0(a1)
addu a1, a1, 1

beq t0, zero, .t01 # end of first string?


beq t1, zero, .t01 # end of second string?
beq t0, t1, 1b

.t01:
subu v0, t0, t1
j ra

·‚gº•eÅ1©Û˜eµ
• IÒµstrcmp ´‡ÙG¶iIÒ§3®?Šó¥Œ±½Â¼ê\
:!¥m©|!$–êâ; ˜"
.t01 ´˜‡Ü{IÒ¶“.”3IÒ¥´Ü{§Ø†§SO? C ·
¶Àâ"
as1: ´˜‡êiIÒ§Nõ®?ìr§‰ÛÜIÒ"\3§S¥Œ±k
NõIÒщ 1 ¶“1f” e˜‡IÒ§“1b”þ˜‡"ù:š~k^§
ϏØ^z‡=3Ûܦ^IÒÑu²˜‡#˜¶i"
• M춵ùp‰Ñ/va0 £=ؑ{ÎÒ¤¶i´Ï~^{§
´I‡®?“è3ˆý®?ìƒck‡²L,«÷?n§S¶;
.‰{´^ C ý?n짌õêóäý?nªÑ´w ´„
"
–ù¼ê^®?Šó5¿ØŠ¶?È쉌UÐ"·‚
¡£1 9.1 !¤¬wNŒ±r®?§S'ùprõ"
8.2 ®?-9Ù¿Â
!¹˜‡L§TLdŒõê MIPS ®?ì|±Ü{®?
-¶¡£=ÏPΤN|¤§) † MIPS64£1‡¤3S-
8"²L˜ ¢ÚÛ£g§· û½3ù‡L¥Óž)ýÅì
-Ú®?ìܤ-"ùéz^-§·‚òѱeSNµ
• ®?‚ªµ-N"

• )¤Åì-µéuÅì-O¶½öÐm¤˜Åì-®?
-§·‚^˜‡“⇒”5L«÷Ðm¿ÑÐm -S"
160
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
õUµ£ãT-‰Ÿo§ °õæ^ C –“è£ã"7‡ž^ C

a.=†"
·‚¿Ø´r-ÚöŠêz˜«ŒU|ÜÑÑ5§Ï@
"·‚¿ØÑe¡SNµ
• nöŠê-VöŠê/ªµ~X§MIPS ®?ì#Nùµ

addu $1, $2 # $1 = $1 + $2

ÄK7L¤µ
addu $1, $1, $2

‡k¿Â§ÒA?ь±ù"
• ¤kŒU load/store /Œ‚ª(addr)µMIPS Åì-o´^˜‡M
ìSN\þ˜‡ 16 kÎÒ £þ )¤ load/store öŠ/Œ§
1

'X¤ lw $1,14($2)"MIPS ®?ì„|±ÐA‡Oόª/


Œ‚ª¶²wÒ´ lw $1, thing l®?“èIÒ£½ö Ü C ¶
i¤“thing”?\1êâ"[!Œëw1 9.4 !"5¿¿š¤kù ª
Ñé?ÛI‡‰½S/Œ-Œ^"éu®?-·‚Ґ¤ lw
t, addr§éuÅì-§Ò¤ÄŒ+ £þ‚ª"
®?ìJø la £\1/Œ¤-æ^ÓόªŠ{§¦+¿Ø\
1½;?ۊ——´38IMì¥)¤˜‡/ŒŠ"
ܤ, /Œ‚ªž£AO´3;ž¤§®?ìeI‡˜‡žüú
^Mì҆^ at"3@ Û¹¦^Mì¬kK“è£~X§
3ÿ™¥äc¤kM슥ä?n§S¥¤¥óŠ§S I‡
AO5¿µGNU ®?ìk˜^ .set noat «Œ±“ŽÛ¹¦^ at"
• -á=öŠê‡µŠâPDÚ§-¥i\~ê‰á=
ê"MIPS ®?Šó4\Œ±½ ˜‡ öŠê~ê"MIPS CPU
Jø ˜ ýM‡-é, öŠ|±õˆ 16 á=꧴
ïÆ\„´Ö“Š” ÏPÎ"– addui ƒa¶i®?ì£OÜ{
ÏPζ´ŒUk?Èì)¤¥m“èâI‡ù‰§·‚?
ØÅì-£~XµL 8.6¤±93‡®?L¥\¬wù “á=ê”
/ª"
3®?Šó¥§¿vkrá=ꁛ 16 "\ØI‡P4=«á=ê
/ª‡^kÎÒ½öÃÎÒŠ¶XJ\˜‡?¿~ꧮ?쬐\
gÄܤ§X1 9.3.2 !¤ã"
2gJ2§éuk E,œ/§®?ìŒUI‡¦^žMì at"
o´k<¬»~¶k˜ Mì\Mì/Œ‚ª=^ué2:Mì load/store"ù
1

‰´ Ú2:“è¥õ‘ê||„ƒ˜—"
161
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
8.2.1 ‘ U Úؑ U (Non-U) ÏPÎ
3·‚m©ƒckJ˜e§'u-ÏPÎ{k˜‡/AON´· "
˜‡“u” M3®?ÏPÎþÏ~֊“unsigned£ÃÎÒ¤"”´¿šo´
ù‡¿g£–3vk4Œ/už\Ž–垧ØUn)¤ù‡¿g¤"û
uþe©ØÓ§˜‡“u’’ MkA‡kX‡© O¿Âµ
• Äўg€„´Øg€µ3ŒõêŽâ$Ž¥§ U “L“ÃÄÑuÿ"” –
ؑù‡ MŽâ$Ž add 3(JÄÑ 31£rê¤kÎÒê
žÎÒ ¤ž¬ÚuÉ~"‘ MCN addu éÓöŠê‰ÑÓ
(J´ØÚuÉ~"
C Ú C++ Ø|±êÄÑÉ~§o´¦^‘“u”/ª——†Cþ´k
Î҄´ÃÎÒvk'X"ؚ\ýkAÏnd§ÄKAo´
¦^ addu -"
• ^‡˜µÏ^ÿÁöŠ- slt(set if less than) Ú sltu (set if lessthan,
unsigned) öŠê)ºKŠž7,)ØÓ(J"

• ¦Øµê¦{$Ž)˜‡ƒuöŠêVÝ(J§ù¿›X
éukÎÒêÚÃÎÒêÑ\¬)ØÓ(J¶Ï kü^
-µmult Ú multu"5¿§(J$ Ü©§33 lo Mì§éukÎÒ
ÚÃÎ҇Ñ´ƒÓ¶´?nÄÑ hi Ü©ªØÓ"
êØ{-†ÎÒk'£Ęe 0xFFFF FFFE ر 2¤§¤±
© div Ú divu"éu•m£ -£m£˜ Ҵر¤kÓ
CN¶´rù‡Š U w,L» ¶£ -‰ sra (shift-right
arithmetic§Žâm£§·^ukÎÒê)Ú srl (shift-right logical Ü6m
£)"ù‡­.ý´‡Û©/"
• MìÜ©\1µ\1'Mì°Ýêâ7L(½No?nMì
¥õ{ "éu lbu ƒaÃÎҍ-§Ti!\1?MìÙ{ ˜
"£·‚¡"*Ф"XJi!Š“L˜‡kÎÒ꧁p Ò¬wŠ
·‚´ÄK"3ù«œ¹e§·‚^ lb -rÎÒ E›MìÙ
{ "ù‰ÎÒ*Ð"
8.2.2 Ø{ÏPÎ
3ê¦ØÅì襧düÕ©m-©Ouå$ŽÚJ(J"®
?ìUùXù˜:§nöŠê‚ª)¤÷*Ѝ-§Óž‰1Øê"u
"ù5vk¯K§˜Ø3´§Ø{®?÷-¶i div§ÚÄ
Åìè-¶iƒÓ"ù¿›X3®?¥˜^ÅìØ{-7L‡^˜

162
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
‚€¶æ^ zero ‰8MìnöŠê®?Ø{-A)¤ÅìØ{
-"
k óäóJø Ð{{øù‡·Ï§½Â˜‡#ÏPÎ divd
(divide direct) L«M‡Ø{-§Ú divo(divide with overflow check) L«E
,÷-"ù‡‰{„™61m5§kŒU3, “è¥-"
8.2.3 -˜üL
3®?£ã¥§·‚^L 8.1 ‰Ñ¤^ÎÒ½"L 8.2 UìÏPÎi
1gS‰Ñ ˜‡-£ã˜ü"
L 8.1: -L¥^½
i ^å
s,t ^uöŠê CPU Mì
d ^uÉöŠ(J CPU Mì
j á=ê
label -6¥\:¶¡"
shf éu²£!‚£!J!\-§ù´Û¹£ þ"
sz éuJ/\-§ù“LöŠ°Ý"
offs ƒéu PC  16 kÎÒ £þ§“L±iü £z‡-
˜‡i¤˜‡IÒål§
addr ^®?Šó load/store -žŒ±^A«Ü{êâ/Œ
Lˆªƒ˜£ë„1 9.4 !£ã®?ìN¢yØÓÀ‘"¤
at ®?žMì§Ù¢Ò´ $1"
zero Mì $0§["Š"
ra ˆ£/ŒMì $31"
hi,lo ÏLr hi Ú lo å5/¤V°Ýê¦{(J"hi Ú lo z‡
NBÚêMìÓõ §¤± hilo 3 32 ÅìþŒ±N
B 64 ê§3 64 ÅìþŒ±NB 128 (J"
MAXNEG32BIT ©O^ 2 Ö茱L« 32 Ú 64 Kê"^ 2 Ö
èL«˜‡A5´ê -MAXNEG32BIT Ã{^ 32 L«"
MAXNEG64BIT ^uÉöŠ(J CPU Mì
cd -\?nìMì
cs -Ö?nìMì
exception(CAUSE,code) ^uÚu CPU g€¶CAUSE û½Mì Cause(ExcCode)
˜"“code”Ø´˜‡dM‡)ºŠ§ ´˜‡?è3-
S䢍§XÚ^‡Œ±ÏL֍-éT"¿šz‡
ù-ј“code”Š§¤±kžÒŽÑ "
163
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.1 Y
i ^å
exception(CAUSE) ^uÉöŠ(J CPU Mì
const31..16 “L?›ê“const” 31  16 ¤ê"MIPS ֏
^aq½"

L 8.2: Ui1gSü®?-
®?/Åìè õU£ã
abs d,s ⇒ d = s < 0 ? -s : s
sra $at,s,31
xor d,s,$at
subu d,d,$at
add d,s,j ⇒ Äўg€§é^
addi d,s,j d = s + (signed)j
add d,s,t ⇒ Äўg€§é^
d = s + t
addu d,s,j ⇒ Öž j Œ±‡Ñ −32768 ≤ j < 32768 ‰Œ§
addiu d,s,j ´)¤“謍E,"
d = s + (signed)j
addu d,s,t d = s + t
and d,s,j ⇒ =^u 0 ≤ j < 65535 — éuŒ꧇)¤
andi d,s,j -
d = s & (unsigned)j
and d,s,t d = s & t
b label ⇒ goto label
beq
$zero,$zero,offs
bal label ⇒ ¼êN^£‰Œkƒéu PC όN^¤"5
bgezal $zero,offs ¿ ra ˆ£/Œ´ee˜^-/Œµe˜^
- u©|ò´ø§3N^m©ƒc‰1L "
bc0f label Šâ?nì 0 ^‡©|"3P CPU þÿÁ CPU
bc0f1 label Ñ\Ú &Ò"®²Ø2´ MIPS32 ½ MIPS64
bc0t label ˜Ü© "
bc0t1 label

164
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
bc1f $fccN, label Šâ2:^‡˜ /ý(t)½ö˜"/b(f) ?1
bc1fl $fccN, label ©|¶„1 7.9.7 !"y“ FPU Pkõ‡2:^
bc1t $fccN, label ‡ §ÏL N=0..7 5ÀJ"P“è^^‡ 0§
bc1tl $fccN, label ùž“$fccN”Œ±ŽÑ"
bc1fl  M¥“l”L«ù´˜^ŒU©|-¶
„1 8.5.4 !"5¿ MIPS32/64 Š¢ ŒU©|
-§ïƧS Ú?Èì؇3ŒU‡3õ«
MIPS NX(¢yþŒ£‡“è¥)¤
-"
bc1any2f $fccN,label MIPS-3D -§Šâü‡½o‡^‡“OR”©|"
bc1any2t $fccN,label „1 7.10.4 !"
bc1any4f $fccN,label
bc1any4t $fccN,label
bc2f label Šâ?nì 2 ^‡©|"= CPU ¦^?n
bc2fl label ì 2 -8½Jø ÜÚ žâ^"„þ¡
bc2t label bc1f "
bc2tl label
beq s,t,label if (s == t) goto lable
beql s,t,label þ¡^‡©|-ŒU©|CN§®="=
©|u)žâ‰1ò´ø-¶„ 8.5.4 !"
beqz s,label ⇒ if (s == 0) goto label
beq s,$zero,offs
beqzl beqz ŒU©|CN¶„ 8.5.4 !"
bge s,t,label ⇒ if ((signed) s ≥ (signed) t) goto label
slt at,s,t
beq at,$zero,offs
bgel s,t,label ⇒ “ŒU”/ª§,T-´˜‡÷"®²
bge
slt at,s,t =§,k®?ì„|±"„1 8.5.4 !"
beql at,$zero,offs
bgeu s,t,label ⇒ if ((unsigned) s ≥ (unsigned) t) goto
sltu at,s,t label;
beq at,$zero,offs
bgez s,label if (s ≥ 0) goto label;
bgezal s,label XJ(s ≥ 0) N^“label()"” ´5¿“ˆ£/
Œ”Ã^‡/3Mì ra ($31) ¥"
165
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
bgezall s,label ®²=ŒU©|CN¶„ 8.5.4 !"éJwÑù
^-kŸoÐ?"
bgezl s,label ®=ŒU©|CN¶„ 8.5.4 !"
bgt s,t,label ⇒ if ((signed) s ≥ (signed) t) goto label;
slt at,t,s
bne at,$zero,offs
bgtu s,t,label ⇒ if ((unsigned) s ≥ (unsigned) t) goto
slt at,t,s label;
bne at,$zero,offs
bgt s,t,label ⇒ if ((signed) s ≥ (signed) t) goto label;
slt at,t,s
bne at,$zero,offs
bgtz s,label if (s > 0) goto label;
bgtzl s,label bgtz -ŒU©|‡§®="„ 8.5.4 !"
ble s,t,label ⇒ if ((signed) s ≤ (signed) t) goto label;
sltu at,t,s
beq at,$zero,offs
bleu s,t,label ⇒ if ((signed) s ≥ (signed) t) goto label;
sltu at,t,s
beq at,$zero,offs
blez s,label if (s ≤ 0) goto label;
blezl s,label blez -ŒU©|‡§®="„ 8.5.4 !"
blt s,t,label ⇒ if ((unsigned) s < (unsigned) t) goto
slt at,t,s label;
bne at,$zero,offs
bltl s,label ®=ŒU©|‡"„ 8.5.4 !"
bltu s,t,label ⇒ if ((unsigned) s < (unsigned) t) goto
sltu at,s,t label;
bne at,$zero,offs
bltz s,label if (s < 0) goto label;
bltzal s,label XJ(s <0) N^ label()"´ØØN^´Äu
)§“ˆ£/Œ”˜ÆÃ^‡3Mì ra ($31)
¥"
if (s < 0) label();

166
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
bltzall s,label )œŒU©|CN¶„ 8.5.4 !"
bltzl s,label ®=ŒU©|CN¶„ 8.5.4 !"
bne s,t,label if (s != t) goto label;
bnel s,t,label ®=ŒU©|CN¶„ 8.5.4 !"
bnez s,label if (s != 0) goto label;
bnezl s,label ®=ŒU©|CN¶„ 8.5.4 !"
break code NÁì^ä:-"code ŠéM‡vkJ§
´ä:É~~§Œ±ÏLÖÉ~ύ-u¢
§Š"
cache k,addr ép„ 1?1öŠ§X 4.9 !¤ã"éP
MIPS CPU vk¢yT-§+np„ 6u
éäN CPU E|"
cfc1 t,cs òêâl?n웛Mì cs DxÏ^Mì
cfc2 t,cs t"^uæ^9ϛ›Mì8?nì§~X
2:ü£?nì 1¤"cfc0 -Øáu MIPS32
5‰"
ctc1 t,cs òêâlÏ^Mì t Dx?n웛Mì
ctc2 t,cs cs"
clo d,s é s ¥êŠ 32 OŽc£p ¤˜
‡ê"
clz d,s é s ¥êŠ 32 OŽc£p ¤"
‡ê"
dabs d,s ⇒ 64 ‡
dsra $at,s,31 d = s < 0 ? -s, s
xor d,s,$at
dsubu d,d,$at
dadd d,s,t 64 ‡¶Äўg€§é^
d = s + (signed)j
addi d,s,j 64 ‡§Äўg€§é^
d = s + j
daddiu d,s,j 64 á=ê\{§õžÿ¤ daddu"
d = s + j
daddu d,s,t 64 ‡
d = s + t

167
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
dclo d,s é s lMì1 63 m©OŽc£p ¤
˜ ‡ê"
dclz d,s é s lMì1 63 m©OŽc£p ¤
" ‡ê"
ddiv $zero,s,t ⇒ Ϗ·‚½ $zero Š8öŠê§T- 64
ddiv s,t M‡Ø{-"
lo = (long long) s / (long long)t;
hi = (long long) s % (long long)t;
‰1"ØÚÄÑuÿ 64 kÎÒêØ{-"
ddiv d,s,t ⇒
lo = (long long) s / (long long)t;
teq t,$zero,0x7
hi = (long long) s % (long long)t;
ddiv $zero,s,t
if (t == 0) exception (BREAK, 7);
daddiu $at,$zero,-1
if (t == -1 && s == MAXNEG64BIT)
bne t,$at,1f
/* result overflows */
daddiu $at,$zero,1
exception (BREAK, 6);
dsll32 $at,$at,31
d = lo;
teq $t1,$at,0x6
1:
mflo d
ddivu $zero,s,t ⇒ ÃÎÒ 64 êM‡Ø{-"
ddivu s,t lo = (long long) s / (long long)t;
hi = (long long) s % (long long)t;
ddivu d,s,t ⇒ ‘"ØuÃÎÒ 64 êØ{"
teq t,$zero, 0x7
lo = (long long) s / (long long)t;
ddivu s,t
hi = (long long) s % (long long)t;
mflo d
if (t == 0) exception(BREAK, 7);
d = lo;

deret l EJTAG NÁÉ~ˆ£"››D4 CP0 Mì


DEPC ¤¹/Œ?-§NÁª ˜""
EX deret ƒ -¿Ø$1£vkò´ø
-¤"k' EJTAG õSN„1 12.1 !"
dext d,s,shf,sz l 64 MìJ "shf ´ 3 s ¥£
1 0 ¤I‡ £þ§sz ´ Ý"
s = d(sz+shlf)..shf;

168
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
dext d,s,shf,sz ⇒  shf ½ s ‡L 32 ž®?ìŠâI‡‰Ñ dextm
dextm d,s,shf,sz ½ dextu Åìè"3~œ¹e§‡ dext ,
dext d,s,shf,sz ⇒ 4®?ì?n"
dextu d,s,shf,sz
dextm d,s,shf,sz  sz  32 ½õž dext Åìè"
dextu d,s,shf,sz  shf  32 ½õž dext Åìè"
di d B Ž ¥ ä" é G  M  ì   Û ¥ ä ¦ U
£AE(IE)§„1 3.3.1 !¤˜"§r5 SR Š
 d ¥"TöŠ´f5¶æ^Ö/U/
ªO“YkŒUŒ´¥ä—·Ï"
dins d,s,shf,sz • 64 Mì\ "–\ê⤠s $
"shf ´êâI‡•†£  £þ§sz ´ 
Ý"
d = d63..(shf+sz) | s(sz)..0 |
(shf > 0 ? d(shf-1)..0 : 0);
dins d,s,shf,sz ⇒  shf ½ s ‡L 32 ž®?ìŠâI‡‰Ñ dinsm
dinsm d,s,shf,sz ½ dinsu Åìè"3~œ¹e§‡ dins ,
dins d,s,shf,sz ⇒ 4®?ì?n"
dinsu d,s,shf,sz
dinsm d,s,shf,sz  sz  32 ½õž dins Åìè"
dinsu d,s,shf,sz  shf  32 ½õž dins Åìè"
div $zero,s,t ⇒ 32 kÎÒêM‡Ø{-¶8Mì
div s,t $zero ž®?ì¿Ø\"ؽÄÑuÿ“è"
lo = s / t;
hi = s % t;
div d,s,t ⇒ kÎÒ 32 êØ{-§3"ØÚÄÑ^‡eu
teq t,$zero,0x7 )É~"
div $zero,s,t
if (t == 0)
li $at,-1
exception (BREAK, 7); /* divide by zero */
bne t,$at,1f
lo = s / t; hi = s;
lui $at,0x8000
if (t == -1 && s == MAXNEG32BIT)
teq s,$at,0x6
exception (BREAK, 6); /* result overflows */
1:
d = lo;
mflo d

169
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
divu $zero,s,t ⇒ /* $zero as destination means no checks */
divu s,t lo = s / t;
hi = s % t;
divu d,s,t ⇒ ÃÎÒØ{§´"Ø—É~µ
teq t,$zero, 0x7
if (t == 0) exception(BREAK, 7);
divu s,t
lo = (unsigned) s / (unsigned)t;
mflo d
hi = (unsigned) s % (unsigned)t;
d = lo;

dla t,addr ⇒ \1 64 /Œ¶„1 9.4 !"


# various ...
dla t,const ⇒ \1 64 ~ê"=~êŠ0u 0x8000 0000 Ú
# biggest case 0xFFFF FFFF ƒmžâ‡^ØÓu li ÏPΧd
lui t,const63..48 ž 32 ⇒64 =†5K‡¦ li òp 32 ÜW
ori t,const47..32 ˜"
dsll t,16
ori t,const31..16
dsll t,16
ori t,const15..0
dmadd16 s,t =3 NEC  Vr41xx x CPU þk-"
(long long) lo = (long long)lo + ((short)s
* (short)t);
dmfc1 t,fs ò 64 êâl?nìMì cs DxÏ^M
dmfc2 t,fs ì t",=3‘k 64 Mì?nìþI‡
Ú¢y"dmfc1 ^u2:üMì¶dmfc2 4
¾„"
dmtc1 t,cs ò 64 êâlÏ^Mì t Dx?nìMì
dmtc2 t,cs cs"Ù§Óþ¡ dmfc1"
dmul d,s,t ⇒ 64 kÎÒê¦{-¶s Ú t ¦ÈOŽ(J
dmultu s,t 128 §ØŒUÄÑ"
mflo d vkü^Åì-¢ynMìöŠê 64 ¦
{§,kéu 32 öŠêkù-£mul¤"
hilo = s * t; /* with 128-bit precision */
d = lo;

170
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
dmulo d,s,t ⇒ kÎÒê¦{-§Äўu)É~"
dmult s,t
hilo = s * t; /* with 128-bit precision */
mflo d
if ((lo >= 0 && hi !=0) || (lo < 0 && hi != -1))
dsra d,d,63
exception (BREAK, 6);
mfhi $at
d = lo;
tne d,$at,0x6
mflo d
dmulou d,s,t ⇒ ÃÎÒê¦{-§Äўu)É~"
dmultu s,t
hilo = (long long) s * (long long) t;
mfhi $at
if (hi !=0)
mflo d
exception (BREAK, 6);
tne $at,$zero,0x6
d = lo;

dmult s,t 64 kÎÒê¦{Åì-§(J˜u hilo"


hilo = (long long) s * (long long) t
dmultu s,t 64 Åì¦{-ÃÎÒê‡"
hilo = (unsigned long long) s * (unsigned
long long) t
dneg d,s ⇒ ü8$ŽÎƒ‡ê§Äўg€—\ŒUŽ‡e
dsub d,$zero,s ¡ dnegu"
(long long) d = -(long long) s; /* trap on
overflow */
dnegu d,s ⇒ (long long) d = -(long long) s;
dsubu d,$zero,s
kÎÒ 64 ê{-§‰1ÄÑ^‡u"
drem d,s,t ⇒
if (t == 0) exception (BREAK, 7);
teq t,$zero,0x7
if (s == MAXNEG32BIT && t == -1)
ddiv $zero,s,t
exception (BREAK, 6); /* overflow */
daddiu $at,$zero,-1
d = (long long) s % (long long) t;
bne t,$at,1f
daddiu $at,$zero,1
dsll $at,$at,63
teq s,$at,0x6
1:
mfhi d

171
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
dremu d,s,t ⇒ 64 ÃÎÒê{§‰1ÄÑuµ
teq t,$zero,0x7
if (t == 0) exception(BREAK, 7);
ddivu $zero,s,t
d = (unsigned long long) s % (unsigned long long)t;
mfhi d

dret LžÉ~ˆ£-§^uy3®Lž R6000


CPU Ú, “MIPS II” U¬"
drol d,s,t ⇒ 64 ̂†£§Ù¥‚£þ´‡Cþ"
dnegu $at, t d = (s << t) | ((unsigned long long)s >>
drotrv d,s,$at (64 - t));
drol d,s,j ⇒ 64 ̂†£§Ù¥‚£þ´‡~ê"
drotr d,s,64-j d = (s << j) | ((unsigned long long)s >>
(64 - j));
dror d,s,t ⇒ 64 ̂m£§Ù¥‚£þ´‡Cþ"
drotrv d,s,t d = ((unsigned long long)s >> t) | (s <<
(64-t));
dror d,s,j ⇒ 64 ̂m£§Ù¥‚£þ´‡u 32 ~þ"
drotrv d,s,j d = ((unsigned long long)s >> j) | (s <<
(64-j));
dror d,s,j ⇒ 64̂m£§Ù¥‚£þ´‡‡L½u 32 
drotr32 d,s,j ~þ"
d = ((unsigned long long)s >> j) | (s <<
(64-j));
dsbh d,t †Mì£64 Mìkoé¤zéi!"
dshd d,t †Mì£64 Mìküé¤zéŒi£16
¤"
dsll d,s,t ⇒ 64 †£§£ þ´‡Cþ"
dsllv d,s,t d = (long long) s << (t % 64);
dsllv d,s,t \Œ±ù5M솣-Åì觴
¤ dsll Ð"
dsll d,s,shf 64 †£§£ þ´‡u 32 ~þ"
d = (long long) s << shf;
dsll d,s,shf ⇒ 64 †£§£ þ´Œuu 32 ~þ"
dsll32 d,s,shf-32 d = (long long) s << shf; /* 32 <= shf <
63 */

172
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
dsra d,s,t ⇒ 64 m£µU C ŠÂkÎÒm£§½¡Žâ£
dsrav d,s,t —3z‡ •e£Äž§Mìp ^1 63
ŠW¿§(¢y ± 2 ˜ŠØêkÎÒØ
{"
d = (signed long long) s >> (t % 64);
dsra d,s,shf 64Žâm£§£ þ˜‡~꣎⣠¿
„þ¡ dsra d,s,t¤"~êu 32 ž§Ò´Ó
¶Åì-"
d = (signed long long) s >> (t % 64);
dsra d,s,shf ⇒ Óþ§32 ≤ shf <63"\ŒUجŽ† dsra32"
dsra32 d,s,shf-32
dsrl d,s,t ⇒ Ü6m£—3z‡ •e£Äž§Mìp ^
dsrlv d,s,t 1 0 W¿§Ú C ŠóÃÎÒêŠÂ˜—"ù´£
þCþ‡"
d = (unsigned long long) s >> (t % 64);
dsrl d,s,shf Ü6m£§£ þ˜‡u 32 ~ê"
d = (unsigned long long) s >> (shf % 32);
dsrl d,s,shf ⇒ Óþ§shf Œu½u 32"
dsrl32 d,s,shf-32
dsub d,s,t 64 ~{§Äўu)É~§4„"
d = s - t;
dsubu d,s,t d = s - t; /* 64-bit */
ehb ‰1‘x“o—\I‡yþ¡-?Û?
nì 0 BŠ^3‘ -‰1ƒc®²¤
žÿ¤^-"„1 8.5.10 !"
ei d ¥ä¦U—–Ã^‡/˜GMì¥ä#
N £SR(IE)§„ 3.3.1 !¤"SR 5Š d
¥"TöŠ´föŠ"†þ¡ di -aq£
k^¤"
eret l¥äˆ£µáuAª-"˜Ø SR(EXL)
¿ ©| EPC  ˜"„1 5.5 !"

173
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
ext d,s,shf,sz l 32 MìJ "shf ´ 3 s ¥£
1 0 ¤I‡ £þ§sz ´ ¹ ‡
ê"
mask = (2**sz - 1) << shf;
d = (s & mask) >> shf;
ins d,s,shf,sz • 64 Mì\ "–\ê⤠s $
"shf ´êâI‡•†£  £þ§sz ´ 
°Ý"
mask = (2**sz - 1) << shf;
d = (d & mask) | ((s << shf) & mask);
j label Ä“go-to”-"5¿›Uˆ 2 ‡i 28

!“”S-"
goto label;
j r ⇒ a=dMì r •-"ù´˜U ò›
jr r ›=£?¿/Œ{§Ï¤k-S/Œ
‚ªªÝÑu 32 "
jal label f§SN^§ˆ£/Œ u $ra($31)"5¿ˆ£/
Œ´ee˜^-—‹Ï~ MIPS ©|˜§
;‹©| - ˜©|ò´ø§@p-
o´3ˆf§Sƒc‰1"
jal d,addr ⇒ ‹¼êN^˜§´ˆ£/Œ˜uMì d Ø
la $at,addr ´Ï~ $31"^ jalr -ܤ"3ÅìèÐmª
jalr d,$at ¥^ la ´¢Û§Ï la g´˜‡÷-—ù
‰·‚Œ±;3ùp)ºÏŒª£„ 9.4 !¤"
jalr d,s þ¡ jal d,addr 3/Œ u,˜‡Mì s žC
N"\Œ±¤ jal ½ jalr"
jal s ⇒ XJ½˜‡Mì§Ò´‡N^/Œ§ˆ£
jalr $ra,s /Œ˜uÏ~ $ra"
la d,addr ⇒ \1/Œ—[´Ü¤-§Šâ addr {ØÓ
# many options Œ±)¤ØÓ“èS"õSN„1 9.4 !"
lb d,addr 8 \1§ÎÒ*ЇMì"
éu-ÚÙ§ load/store -§Œ±^õ«
ª addr /Œ—„ 9.4 !—´ load/store -
UOŽ˜‡Mì\þ 16 kÎÒê/Œ"
d = *((signed char *) addr);

174
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
lbu d,addr 8 \1§"*ЇMì"
d = *((signed char *) addr);
ld d,addr 64 \1§e/Œ™éàli!Ku)É~"
d = *((long long *) addr);
ldc1 d,addr 64 \1?nì 1 £2:¤Mì"~¤ l.d§
„1 8.3 !"
ldc2 d,addr 64 \1?nì 2 Mì§XJæ^ ?nì
2 ¿ °Ý 64 {"
ldl d,addr V°Ý“•†/•m”\1—¤é¦^§ù -¢y
ldr d,addr ˜‡ 64 ™éà\1 uld¶„e©±91 2.5.2
!"
ldxc1 fd,s(t) 64 \1?nì 1 £2:¤Mì§æ^VM
쓢ڔό"~ l.d /ª§„1 8.3 !"
fd = *((double *)(t+b));
lh d,addr 16 \1§ÎÒ*ЇMì"
d = *((signed short *)addr);
lhu d,addr 16 \1§"*ЇMì"
d = *((unsigned short *)addr);
li d,j ⇒ ^~ꊣ“á=ꔤ\1Mì"TÐmª·^u
ori d,$zero,j 0 ≤ j ≤65535"
li d,j ⇒ ·^u -32768 ≤ j <0 œ/"
addiu d,$zero,j
li d,j ⇒ ·^uŒ±L« 32 êÙ§ j Šœ/"
lui d,hi16(j)
ori d,d,lo16(j)
ll t,addr ë£\1"©O\1 32 /64 §‘kë£BŠ^¶
lld t,addr ^5Ú sc ½ scd ˜å¢yã&Òþ£„1 8.5.2
!¤"
lui t,u þ \1á=ê£~ê u ÎÒ*Ð 64 Mì¤"
t = u << 16;
lw t,addr 32 \1§64 CPU þ?1ÎÒ*Ð"
t = *((int *)addr);
lwc1 fd,addr \1ü°Ý2:ê2:Mì—~Š l.s"„1
8.3 !"

175
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
lwc2 cd,addr 32 \1?nì 2 Mì§XJ¢y {"
é„"
lwl t,addr •†/•m\1˜‡i"ë„e¡ ulw Ú1 2.5.2
lwr t,addr ! )ù -NÓŠ¤˜‡šéà 32
\1öŠ"
lwu t,addr 32 "*Ð\1§=„u 64 CPU"
t = (unsigned long long) *((unsigned int
*)addr);
lwxc1 fd,t(b) æ^¢Ú£Mì + Mì¤/Œ\1 32 2:"
~ l.s"„1 8.3 !"
fd = *((float *)(t+b));
mad s,t 32ê¦{\\§MIPS32 IO-"ü‡M
챰݃¦¿\\µ
hilo = hilo + ((long long) s * (long long)
t);
madu s,t Óþ§´ÃÎÒ$Ž"
hilo = hilo + ((unsigned long long) s *
(unsigned long long) t);
madd d,s,t 32ê¦{\\§MIPS32 IO-"ü‡M
maddu d,s,t 챰݃¦¿\\µ
hilo = hilo + ((long long) s * (long long)
t);
madd16 s,t 32ê¦{\\§MIPS32 IO-"ü‡M
챰݃¦¿\\µ
hilo = hilo + ((long long) s * (long long)
t);
mfc0 t,cs r32 êâl?nìMì cs DxÏ^M
mfc1 t,fs ì t—XJ cs ´ 64 °Ý§KDx´$ 32 "–
mfc2 t,cs ¯ CPU ››MìlØm mfc0§r2:üêâ
˜£êMìlØm mfc1"mfc2 =¢y
?nì 2 žÿâk^§ù«œ¹é„"
mfhc1 t,cs ò 64 ?nìMì cs ½ fs DxÏ^Mì
mfhc2 t,fs t"
=˜‡ MIPS32 êü˜ ‡ 64 !Ù§
¡oN MIPS64 ?nìžâJø"~X§MIPS
úi 24Kf ØPk˜‡ 64 2:ü"
176
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
mfhi d òê¦{ü$Ž(JDxÏ^Mì d"lo
mflo d ¹Ø{û§±9¦È$ 32 §½ö dmul ¦
È$ 64 "hi ¹Ø{{ê½ö¦Èp "
ù -[´p£¶=¦@Ï MIPS CPU
þ§M‡‡–™¤¦Ø-(å"
move d,s ⇒ d = s;
or d,s,$zero
movf d,s,$fccN ˆ«ˆ^‡Dx-—õSNë„1 8.5.3
!"
if (!fcc(N)) d = s;
movf d,s,t if (t) d = s;
movt d,s,$fccN if (fcc(N)) d = s;
movt.d fd,fs,N V°ÝÚü°Ý‡"
movt.s fd,fs,N if ((fcc(N)) fd = fs;
movz d,s,t if (!t) d = s;
msub s,t ê¦{/\\K‡§©OkÎÒÚÃÎÒê
msubu s,t /ª"
hilo = hilo - ((long long) s * (long long)
t);
mtc0 t,cd r32 êâlÏ^Mì t Dx?nìMì
mtc1 t,fd cd"5¿ù^-¿Ø„Ìk8IMìÏ~
mtc2 t,cd S."
mtc0 ^u–¯ CPU ››Mì§mfc1 ^ur
êüêâ˜2:M죍õžÿêâ†
l;ì\1¤"= CPU æ^?nì 2 -
žÿ£ù«œ¹é„¤â¢y mtc2"
XJ?nìMì´ 64 °Ý§êâ\1?$
$ §´p 32 Gvk½Â"
mthc1 t,cs ò 32 Ï^Mì t Dx 64 ?nìMì
mthc2 t,fs cd ½ fd p §3$ ØC"
=˜‡ MIPS32 êü˜ ‡ 64 !Ù§
¡oN MIPS64 ?nìžâJø"~X§MIPS
úi 24Kf ØPk˜‡ 64 2:ü"

177
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
mthi s òÏ^Mì d SN©ODxê¦{ü
mtlo s (JMì hi Ú lo"ù:wþДvkŸo^§
´lÉ~ˆ£ž¡E CPU G7،"
mul d,s,t ýnMì 32 ê¦{§3 MIPS32 ¥½Â§
3, @Ï CPU þk"°Ý(J,
G‰SÜ hilo Mì"vkÃÎ҇"
hilo = (long long) s * (long long) t;
d = lo;
mul d,s,t ⇒ ®?ì)¤ MIPS32 ƒc-8žŒ±Ü¤n
mult s,t Mì¦{"
mflo d
mul d,s,t ⇒ ‘kÄÑu 32 kÎÒ¦{"éÄÑiÿ´
mult s,t ÏL w hi ´Ä{ü lo ÎÒ*Ð5‰"
mflo d
hilo = (signed) s * (signed) t;
sra d,d,31
if ((lo >= 0 && hi != 0) || (s<0) && hi != 1)
mfhi $at
exception(BREAK, 6);
tne d,$at,0x6
mflo d
mulou d,s,t ⇒ ‘kÄÑu 32 kÎÒ¦{"
multu s,t
hilo = (signed) s * (signed) t;
mfhi $at
if ((lo >= 0 && hi != 0) || (s<0) && hi != 1)
mflo d
exception(BREAK, 6);
tne $at,$zero,0x6

mult s,t hilo = (signed)s * (signed)t;


multu s,t hilo = (unsigned)s * (unsigned)t;
neg d,s ⇒ ù‡‡3Äўg€§4^"
sub d,$zero,s d = - s;
negu d,s ⇒ vkÄѧC Šóo´)¤ù˜«"
subu d,$zero,s d = - s;
˜öŠ§-è""
nop ⇒
sll $zero,$zero,$zero
nor d,s,t †OÅ öŠ˜§v7‡ 64 CPU 5‡ü
Õ‡"
d = ~(s | t);

178
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
not d,s ⇒ d = ~s
nor d,s,$zero
nudge addr ý- pref nudge Ú prefx nudge {/ª"
nudgex s(t) „e©Ú1 8.5.8 !"
or d,s,t d = s | t;
ori d,s,j ‹˜‡~ê‰1“½”öŠ OR"Åì-§~¤
or d,s,jµ
d = s | (unsigned) j;
pref hint,addr é–?1`zý-"¯kŒUI
pref hint,t(b) ‡êâ§SŒ±?1Sü§4¤IêâJc?
\p„  Ø)BŠ^"äN¢yo´Œ±r
pref ¤˜öŠ"
hint ½Âù´=«a.ý¶„1 8.5.8 !"
prefx ^u2:§š2:\1/;-¤^
Mì + Mìόª"
r2u s LSI ATMizer-II Ak-¶=†¤Û%2:‚
ª"(Ju lo"
radd s,t LSI ATMizer-II Ak-¶Û%2:\{"(
Ju lo"
rdhwr d,$cs ÖM‡Mìµ#NšA^r^‡Ö˜
| CPU M샘"„1 8.5.12 !"
rdpgpr d,s lþ˜‡KfMì|ÖM슗„1 5.8.6
!"
rem d,s,t ⇒ kÎÒê{-§‰1"ØÚÄÑ^‡u"
teq t,$zero,0x7
if (t == 0) exception (BREAK, 7);
div $zero,s,t
if (s == MAXNEG32BIT && t == -1)
li $at,-1
exception (BREAK, 6); /* overflow */
bne t,$at,1f
d = s % t;
lui $at,0x8000
teq s,$at,0x6
1:
mfhi d

179
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
remu d,s,t ⇒ ÃÎÒê{§‰1"Øuµ
teq t,$zero,0x7
if (t == 0) exception(BREAK, 7);
divu $zero,s,t
d = (unsigned) s % (unsigned) t;
mfhi d

rfe MIPS32 ƒc£Ù¢k MIPS I¤lÉ~ˆ£ž


^5¡E CPU G-"y3®²Lž§d?Ø
2[0 "
rmul s,t LSI ATMizer-II Ak-¶Û%2:¦{"(
Ju lo"
rol d,s,shf ⇒ ̂†£§Ù¥‚£þ´‡~ê"rotr ´ MIPS32R2
rotr d,s,32-shf #O¶éuP ISA§-dÅì-S
ܤ"
d = s << shf) | ((unsigned)s >> (32 - shf);
rol d,s,t ⇒ ̂†£"3 MIPS32R2 ƒc-8"ŷm
negu $at,t £Åì-¶éuP-8§I‡õÅì
rotrv d,s,$at -5ܤ"
d = (s << t) | ((unsigned)s >> (32-t));
ror d,s,shf ⇒ ̂m£~ê "3 MIPS32R2 ƒc-8þ
rotrv d,s,shf ܤ-"
d = ((unsigned)s >> shf) | (s << (32-shf));
ror d,s,t ⇒ ̂m£§‚£þ´‡Cþ"3 MIPS32R2 ƒc
rotrv d,s,t -8þÜ¤-"
d = ((unsigned)s >> t) | (s << (32-t));
rotr d,s,shf ̂m£§‚£þ´‡á=þµ=3 MIPS32R2 ¥
âkÅì-"
rotrv d,s,t ̂m£§‚£þ´‡Cþµ=3 MIPS32R2 ¥â
kÅì-"
rsub s,t LSI ATMizer-II Ak-¶Û%2:~{"(
Ju lo"
sb t,addr *((char *)addr) = t;
sc t,addr ^‡;i/Vi¶„1 8.5.2 !)º"
scd t,addr
sd t,addr XJ addr vkéàli!Ò¬—É~"
*((long long *)addr) = t;

180
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
sdbbp c NÁä:-—ØÓu break -§Ï§†á
\NÁª šÉ~ª"ŒÀ c ?è-¥
§øNÁìÖ"
5¿éù^-kü«ØÓ?è—®²Lž@
«y3=k Toshiba 3900 Ø9Ù U¬¦^"
„1 12.1 !k' EJTAG NÁü£ã"
sdc1 ft,addr ;2:V°ÝMì;ì"~¤ s.d"
sdc2 cs,addr ; 64 ?nì 2 Mì;ì"
sdl d,addr V°Ý“•†/•m”;¶„1 2.5.2 !)º"
sdr d,addr
sdxc1 fs,s(t) ;V°Ý2:Mì§æ^VM쓢ڔό"
~ s.d /ª"
*((double *)(t+b)) = fs;
seb d,s MìSri!ÎÒ*ЇMì"
d = (long long)(signed char)(s && 0xff);
seh d,s MìSrŒiÎÒ*ЇMì"
d = (long long)(signed short)(s && 0xffff);
seq d,s,t ⇒ “^‡˜”®?ÏPÎ|¥1˜‡§[ý¢Å
xor d,s,t ì- slt E"
sltiu d,d,1 d = (s == t) ? 1 : 0;
sge d,s,t ⇒ d = ((signed)s >= (signed)t) ? 1 : 0;
slt d,s,t
xori d,d,1
sgeu d,s,t ⇒ d = ((unsigned)s >= (unsigned)t) ? 1 : 0;
sltu d,s,t
xori d,d,1
sgt d,s,t ⇒ d = ((signed)s > (signed)t) ? 1 : 0;
slt d,s,t
sgtu d,s,t ⇒ d = ((unsigned)s > (unsigned)t) ? 1 : 0;
sltu d,s,t
sh t,addr ;Œiµ
*((short *)addr) = t
sle d,s,t ⇒ d = ((signed)s <= (signed)t) ? 1 : 0;
slt d,s,t
xori d,d,1

181
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
sleu d,s,t ⇒ d = ((unsigned)s <= (unsigned)t) ? 1 : 0;
sltu d,s,t
ori d,d,1
sll d,s,shf d = s << shf; /* 0 <= shf <32 */
sll d,t,s ⇒ d = t << (s % 32);
sllv d,t,s
sllv d,t,s
slt d,s,t d = ((signed) s < (signed) t) ? 1: 0;
slt d,s,j ⇒ /* j constant */
slti d,s,j d = ((signed)s < (signed)j) ? 1 : 0;
slti d,s,j
sltiu d,s,j /* j constant */
d = ((unsigned)s < (unsigned)j) ? 1 : 0;
sltu d,s,t d = ((unsigned)s < (unsigned)t) ? 1 : 0;
sne d,s,t ⇒ d = (s != t) ? 1 : 0;
xor d,s,t
sltu d,$zero,d

sra d,s,shf 32m£§£ þ˜‡~ê"U C ŠÂkÎ


Òm£§½¡Žâ£ —3z‡ •e£Äž§M
ìp ^1 63 ŠW¿§(¢y ± 2 
˜ŠØêkÎÒØ{"
d = (signed) s >> shf;
sra d,s,t ⇒ 32 Žâm£§£ þ˜‡Cþµ
srav d,s,t d = (signed) s >> (t % 32);
srl d,s,shf 32Ü6m£µÒЖ C ÃÎÒþ£ §M
ìp ^1 0 W¿"
d = (unsigned) s >> shf;
srl d,s,t ⇒ 32 Ü6m£§£ þ˜3Mì¥"
srlv d,s,t d = (unsigned) s >> (t % 32);
ssnop ⇒ “‡Iþ”˜öŠ¶´‡˜öŠ§´3Әž¨±
sll $zero,$zero,1 Ï CPU ØuxÙ§-"^u “žS8"
standby ?\ä>ªƒ˜§=·^u NEC Vr4100 x
CPU¶wait—„e—-^2"

182
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
sub d,s,t Äўg€§é^"
d = s - t;
subu d,s,j ⇒ d = s - j;
addiu d,s,-j
subu d,s,t d = s - t;
suspend ?\ Vr4100 CPU ä>ª"
sw t,addr ;˜‡i"
*((int *)addr) = t;
swc1 ft,addr ;ü°Ý2:êS—~Š s.s"
swc2 cd,addr ;?nì 2 Mì 32 êâ§é„"
swl t,addr •†/•m;˜‡i"ë„1 2.5.2 !"
swr t,addr
swxc1 fs,t(b) æ^£VM줢Ú/Œ; 32 ü°Ý2:¶
~ s.s"
*((float *)(t+b)) = fs;
sync êâ“o-§Ì‡^uõ?n춄1 8.5.9
!"
synci 4 I-cache † D-cache ÓÚ"3-ƒ §3
‰1-éz‡p„ 1ŒS¬$1
-"
syscall B )˜‡“XÚN^”É~"
exception(SYSCALL, B);
teq s,t ^‡g€-µXJƒA^‡÷v§)¤˜‡
TRAP É~¶^Ò´µ
if (s == t) exception(TRAP);
teq s,j ⇒ if (s == j) exception(TRAP);
teqi s,j
tge s,t if ((signed)s >= (signed)t) exception(TRAP);
tge s,j ⇒ if ((signed)s >= (signed)j) exception(TRAP);
tgei s,j
tgeu s,t if ((unsigned)s >= (unsigned)t) exception(TRAP);
tgeu s,j ⇒ if ((unsigned) s >= (unsigned) j) exception(TRAP);
tgeiu s,j

183
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
tlbp TLB ‘o-¶„1 6 Ù"
XJc EntryLo ¥J[ÒŠ† TLB ˜‘
ê⚧˜ Index •T‘êâ"ÄK˜
Index š{Š 0x8000 0000 £p ˜ ¤"
tlbr TLB ‘o-¶„1 6 Ù"
ò Index À¥ TLB ‘&EE›Mì En-
tryLo!EntryHi1!EntryHi0 Ú PageMask ¥"
tlbwi TLB ‘o-¶„1 6 Ù"
tlbwr ^ EntryLo!EntryHi1!EntryHi0 Ú PageMask
¥ê⧩O\d Index £tlbwi -¤½
Random £tlbwr -¤¤À¥ TLB êâ‘"
tlt s,t õ^‡g€"
if ((signed)s < (signed)t) exception(TRAP);
tlt s,j ⇒ if ((signed)s < (signed)j) exception(TRAP);
tlti s,j
tltu s,t if ((unsigned)s < (unsigned)t) exception(TRAP);
tltu s,j ⇒ if ((unsigned) s < (unsigned) j) exception(TRAP);
tltiu s,j
tne s,t if (t != s) exception(TRAP);
tne s,j ⇒ if (s != j) exception(TRAP);
tnei s,j
u2r s Ak-¶òÃÎÒê=†¤
LSI ATMizer-II
Û%2:"(Ju lo"
udi0 d,r,s,uc 3^rg½Â-3-?è˜mSï
– -"ù«-Œ±æ^n‡Ï^Mì-§„Œ
udi15 d,r,s,uc ±k^u^rÜ6 5 9ÏöŠè uc"
uld d,addr ⇒ ™éàV°Ý\1§d1 2.5.2 ![0 •†
ldl d,addr \1ڕm\1-ܤ£=‰ÑŒ—à~f¤"
ldr d,addr+7
ulh d,addr ⇒ ™éàŒi\1ÚÎÒ*Ð"ùp´U쌗à
lb d,addr Ðm£—àœ/3‰ÖöŠ˜‡öS¤"Š
lbu $at,addr+1 âØÓόª§Ðm ŒU'ùpE,"
sll d,d,8
or d,d,$at

184
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ëŒ
L 8.2 Y
®?/Åìè õU£ã
ulhu d,addr ⇒ ™éàŒi\1Ú"*Ð"
lbu d,addr
lbu $at,addr+1
sll d,d,8
or d,d,$at
ulw d,addr ⇒ ™éài\1¶XJ´ 64 K?1ÎÒ*У
ldl d,addr ‰ÑŒ—àœ/¤"„1 2.5.2 !"
ldr d,addr+3
usd d,addr ⇒ ™éàV°Ý;"
sdl d,addr
sdr d,addr+7
ush d,addr ⇒ ™éàŒi;"
sb d,addr+1
srl d,d,8
sb d,addr
usw d,addr ⇒ ™éài;¶„1 2.5.2 !"
swl d,addr
swr d,addr+3
wait MIPS32 -§^5?\,«ä>G"Ï~ÏL
¥Ž‰1†uÿ¥ä¢y"^‡ØAb½¥
Žo¬u)½l wait ˆ2˜½L²´š¶-¥
ä—wait -Al˜=̂¥N^"
wrpgpr cd,t \c˜‡KfMì|˜‡M춍[œ¹
„ 5.8.6 !"
wsbh é 32 Sü‡ŒiSÜ?1i!†"ù´˜^
32 -¶3 64 CPU þMìpŒÜ^1 31
ÎÒ*ÐW¿"
wsbh †Ì‚£ ˜å^ê-¢yNõØÓ/
ªi!­|"
xor d,s,t d = s ^ t;
xor d,s,j ⇒ d = s ^ j;
xori d,s,j

185
8.3. 2:- 1 8 Ù MIPS -8ëŒ
8.3 2:-
k˜|ØõØ2:-£„L 8.3 Ú 8.4¤"´‘XuÐé¯Ò¥yÑ
gCE,5"ž3¿±eA:µ
• z˜^2:-Ñk˜‡ü°Ý‡ژ‡V°Ý‡§3ÏPÎ¥^
.s Ú .d 5«©"
XJ\M‡|±1 7.10 !¤ãü°Ý2:é*Ч„¬k˜‡ .ps ‡
-§1Úü°Ý‡˜§´‰üg"ØáuŒL¥,‡
- .ps ‡ü°Ý2:é-3L¥ Ñ5§´·‚=´4\
ë1 7.10 !`²"
 !Ž˜m¿ ;4\ú«6b§‡Ó`²·^uü‡‡
§L 8.4 ҐÑü°Ý‡"
• Ä2:?èڍ-(JÎÜ IEEE 754 IO"3M‡ØU)¤ IEEE
754 IO5½/§"Ž1´ÚuÉ~§4^‡•ý§S‘Ö†)
¤ÎÜIO(Jƒm å"
• 2:OŽÚa.=†-Œ±—É~"ùé{3 IEEE ¿Âe¤á§
uÿ§S ŒUa,^‡¶3. NX(¿Âe¤áµMIPS
FP 2:M‡§3¡éÃ{(?nöŠêÚ$Ž|ܞ§Ò¬)¤
˜‡2:“™¢y” É~§džd4^‡•ý§S§‰12:$Ž"
êâDx-£;ì!MìmDx¤l5جu)É~"neg.s!neg.d!abs.s
½ abs.d -==UCÎÒ ØuSNµ˜¬—g€^‡´
éù -‰˜‡“&- NaN”öŠê¬)˜‡ IEEE “à (invalid)”É
~"
L 8.4: UìÏPÎüS2:-£ã
®?è õU
abs.s fd,fs fd = (fs < 0) ? -fs : fs;
add.s fd,fs,ft fd = fs + ft;
addr.ps fd,fs,ft /* MIPS 3D "reduction add", see Section 7.10 */
fd.upper = fs.upper + fs.lower;
fd.lower = ft.upper + ft.lower;
alnv.ps fd,fs,ft,rs òü°ÝŠ‹¤˜‡ü°Ý駊â rs Š
½ü«ŒUªƒ˜?1"

186
8.3. 2:- 1 8 Ù MIPS -8ëŒ
L 8.4 Y
®?è õU
bc1f $fccN,label A‡2:^‡©|-§L 8.2 Ñk"
bc1fl $fccN,label
bc1t $fccN,label
bc1tl $fccN,label
bc1any2f $fccN,label -§Šâü‡½o‡^‡“½”öŠ
MIPS-3D
bc1any2t $fccN,label OR (J©|"„ 7.10.4 !"
bc1any4f $fccN,label
bc1any4t $fccN,label
c.eq.s $fccN,fs,ft 2:'-§' fs Ú ft ¿r(J\2:^
c.f.s $fccN,fs,ft ‡ $fccN"1 7.9.7 !édk[0 "
c.le.s $fccN,fs,ft
c.lt.s $fccN,fs,ft
c.nge.s $fccN,fs,ft
c.ngl.s $fccN,fs,ft
c.ngt.s $fccN,fs,ft
c.ole.s $fccN,fs,ft
c.olt.s $fccN,fs,ft
c.seq.s $fccN,fs,ft
c.sf.s $fccN,fs,ft
c.ueq.s $fccN,fs,ft
c.ule.s $fccN,fs,ft
c.ult.s $fccN,fs,ft
c.un.s $fccN,fs,ft
MIPS-3D *Ѝ-§'ü‡2:Šý銿
cabs.xx.s $fccN,fs,ft '(J"“xx”LˆÿÁ†þ¡ c.xx.s
-ƒÓ"
ceil.l.d fd,fs ò2:Š=†ƒ½e˜‡kÎÒ 64 
ceil.l.s fd,fs êŠ"
ceil.w.d fd,fs ò2:Š=†ƒ½e˜‡kÎÒ 32 
ceil.w.s fd,fs êŠ"
cfc1 rt,fs 32:››MìÚÏ^Mìƒm£“f”L«5
g(from) FP§“t”L«x(to) FP¤€êâ"^
ctc1 rs,fd u1 7.7 !0  FCSR Mì"
cvt.d.l fd,fs
2:a.=†§Ù¥a. d,l,s,w £©O“L double,
cvt.d.s fd,fs long, float, int) L«8Ú5 Mìa."
cvt.d.w fd,fs =†¬›”°Ýž§æ^ FCSR(RM) c\
ª5(½‰1NCq"éuê=†§I‡C
q†Ž{k'ž§\Ðr-¤
187
floor.w.s /ª"
8.3. 2:- 1 8 Ù MIPS -8ëŒ
L 8.4 Y
®?è õU
cvt.l.d fd,fs
cvt.l.w fd,fs
cvt.s.d fd,fs
cvt.s.l fd,fs
cvt.s.w fd,fs
cvt.w.d fd,fs
cvt.w.s fd,fs
cvt.ps.s fd,fs,ft òü‡ü°ÝŠ=†¤˜‡ü°Ý駄1 7.10
!"
cvt.ps.pw fd,fs,ft MIPS-3D -§òüŒ©O“L˜‡ 32 ê
Š=†˜‡ü°Ý駄1 7.10.4 !"
cvt.pw.ps fd,fs,ft MIPS-3D -§ò˜‡ü°ÝéüŒÓž=†
ꊧ„1 7.10 !"
cvt.s.pl fd,fs,ft ò˜‡ü°Ý阌=†Ï~ü°ÝŠ§„
cvt.s.pu fd,fs,ft 1 7.10 !"
div.s fd,fs,ft fd = fs / ft;
dmfc1 rd,fs ò 64 Šl2:£?nì 1¤ØŠ=†Dx
êMì"
dmtc1 rd,fs ò 64 ŠØŠ=†ÚulêDx2:£
?nì 1¤Mì"
floor.l.d fd,fs ò2:=†ƒ½öe˜‡$ 64 ê"
floor.l.s fd,fs
floor.w.d fd,fs ò2:=†ƒ½öe˜‡$ 32 ê"
floor.w.s fd,fs
l.d fd,addr ⇒ \12:V°ÝŠ§7Léàli!"
ldc1 fd,addr fd = *((double *)(o + b));
l.s fd,addr ⇒ \12:ü°ÝŠ§7Léàoi!"
lwc1 fd,addr fd = *((double *)(o + b));
ldc1 fd, disp(b) ®²=† l.d d-"
l.d fd,t(b) ⇒ æ^¢Úό\12:Mì"Ð¤ asl.d /
ldxc1 fd,t(b) ª"5¿ü‡Mì/ ¿Øé¡—b ^5
NB˜‡/Œ t  £þ§XJ (b+t) Š
á\‡ MIPS /ŒN¥ØÓu b «£d
64 /Œp 2 û½¤§@oҊ‡ ‡¦"
fd = *((double *)(b + t));

188
8.3. 2:- 1 8 Ù MIPS -8ëŒ
L 8.4 Y
®?è õU
li.s fd,const \12:~ê§Ï~Ü¤-§r~ê˜u,‡
li.d fd,const ;ì ˜, \1"
luxc1 fd,i(b) VMì¢Ú\1V°Ý2:ê§A† ldxc1
˜˜§ØӃ?3uXJ /Œ´šéà
§Ø¬u)É~§\1òlÏLrk/Œ$
3 ˜"/Œ??1"Ú alnv ˜å^5?
n™éàü°Ý2:é—„1 7.10 !é alnv 
£ã"
lwc1 fd, disp(b) ®²=† l.s d-"
lwxc1 fd, i(b) ²(VMì¢Ú\1-¶Ï~'æ^ƒAÏ
Œª l.s ‡Ð"„þ¡'u ldxc1 5º"
madd.s fd,fr,fs,ft fd = fr + fs * ft;
lwxc1 fd, i(b) ²(VMì¢Ú\1-¶Ï~'æ^ƒAÏ
Œª l.s ‡Ð"„þ¡'u ldxc1 5º"
lwxc1 fd, i(b) ²(VMì¢Ú\1-¶Ï~'æ^ƒAÏ
Œª l.s ‡Ð"„þ¡'u ldxc1 5º"
madd.s fd,fr,fs,ft fd = fr + fs * ft;
mfc1 rd,fs ò 32 Šl2:£?nì 1¤ØŠ=†Dx
êMì"
mfhc1 rd,fs òl2:£?nì 1¤Mìp 32 ŠDx
êMì"^u‘k 64 FPU  32 ê
CPU"
mov.s fd,fs fd = fs;
movf.s fd,fs,N if (!fcc(N)) fd = fs;
movn.s fd,fs,N if (t != 0) fd = fs; /* t is a GPR */
movt.s fd,fs,N if (fcc(N)) fd = fs;
movn.s fd,fs,N if (t == 0) fd = fs; /* t is a GPR */
msub.s fd,fr,fs,ft fd = fs * ft - fr;
mtc1 rd,fs ò 32 ŠØŠ=†ÚulêDx2:£
?nì 1¤Mì"
mthc1 rd,fs ò 32 ŠlêMìDx2:£?nì 1¤
Mìp 32 "̇^u‘k 64 FPU  32
ê CPU£MIPS CPU ŒõêÑ´ 64 ¤"

189
8.3. 2:- 1 8 Ù MIPS -8ëŒ
L 8.4 Y
®?è õU
mul.s fd,fs,ft fd = fs * ft;
mulr.ps fd,fs /* MIPS-3D "Reduction Add", see Section 7.10.4 */
fd.upper = fs.upper * fs.lower;
fd.lower = ft.upper * ft.lower;
neg.s fd,fs fd = -fs;
nmadd.s fd,fr,fs,ft fd = -(fr + fs * ft);
nmsub.s fd,fr,fs,ft fd = -(fr - fs * ft);
pll.ps fd,fs,ft ­#‹ü°Ý駄1 7.10 !"
plu.ps fd,fs,ft
pul.ps fd,fs,ft
puu.ps fd,fs,ft
prefx hint, i(b) Mì/Mìόªp„ ý-"
= 3 2 : þ Œ ^ £Ó   Ï Œ  ª  ^ u
ldxc1/sdxc1¤"3ê-L¥Ñ 
-"„1 8.5.8 !0 óŠÅ›"
pul.ps fd,fs,ft Uìi1gS­E—„þ¡ pll"
puu.ps fd,fs,ft
recip.s fd,fs ¯„¦ê"Ø÷v IEEE °Ý§´õ´
$ê þ ˜‡ü "
fd = 1/fs;
recip1.s fd,fs MIPS-3D—recip1´‡¯„o÷Cq{¦
recip2.s fd,fs,ft ê§recip2 ´‡?1ê°zÚ½AϦ\
-"„1 7.10.4 !"
round.l.d fd,fs ò2:=†¤ƒ½C 64 ê"
round.l.s fd,fs
round.w.d fd,fs ò2:=†¤ƒ½C 32 ê"
round.w.s fd,fs
rsqrt.s fd,fs ¯„„'°(£Ø ؇L$ü ¤§
´Ø÷v IEEE °(Ý"
fd = sqrt(1/fs);
rsqrt1.s fd,fs ´‡¯„o÷²ŠCqO
MIPS-3D—rsqrt1
rsqrt2.s fd,fs,ft Ž-§rsqrt2 ´‰1²Š°zÚ½˜‡A
Ϧ\$Ž"„1 7.10.4 !"

190
8.4. † MIPS32/64 1˜‡ O 1 8 Ù MIPS -8ëŒ
L 8.4 Y
®?è õU
s.d ft,addr ⇒ 2:V°Ý;§/Œ7Léàli!"3
sdc1 ft,addr ‘k 32 FPU  CPU þI‡ü^ swc1 -Ü
¤"
*((double *)addr) = ft;
s.s ft,addr ⇒ 2:ü°Ý;§/Œ7Léàoi!"
swc1 ft,addr *((float *)addr) = ft;
sdc1 fd, disp(b) ®²=† s.d d-"
sdxc1 fd, i(b) ²(VMì¢ÚV°Ý;-—„þ¡'
u ldxc1 5º§Ï~'æ^ƒAόª l.s
‡Ð"
sqrt.s fd,fs fd = sqrt(fs); /* IEEE compliant */
sub.s fd,fs,ft fd = fs - ft;
suxc1 fd,i(b) VMì¢Ú;§A† sdxc1 ˜˜§ØÓ
ƒ?3ušéà/ŒØ¬u)É~§;ì‰
1§´rk/Œ•e\li!>."
swc1 fd, disp(b) ®²=† s.s d-"
swxc1 fd, i(b) ²(VMì¢Ú; 32 2:Š-¶Ï
~'æ^ƒAόª s.s ‡Ð"„þ¡'u
ldxc1 5º"
trunc.l.d fd,fs ò2:êÜ©=†¤ 64 ê"
trunc.l.s fd,fs
trunc.w.d fd,fs ò2:êÜ©=†¤ 32 ê"
trunc.w.s fd,fs

8.4 † MIPS32/64 1˜‡ O


5‰u 2003 c,? “1 2 ‡”§ùÒ´·‚ùp?Ø"¤
MIPS32/64
±!‡‰Ò´éÎÜ5‰1˜‡ CPU ¥vkÀ܉˜‡V)"
8.4.1 1‡O\Êύ-
ùpэ-)A‡ 2003 c MIPS32/64 1‡½ÂA^-"
3ùp8´ Ï@ ¦^ÎÜ1˜‡5‰O؝¹ù -
CPU <"

191
8.4. † MIPS32/64 1˜‡ O 1 8 Ù MIPS -8ëŒ
L 8.3: 2:MìÚI£Î½
^i ^å
fs, ft 2:MìöŠê"
fd É$Ž(J2:Mì"
fdhi, fdlo 32 ?nÙ¥˜éƒ2:Mì§Ü3˜å˜˜‡
2:V°ÝŠ"pSÒ£ÛêÒ¤Mì3~Žâ$
Ž¥´Û¹"
$fccN FCSR Mì¥2:^‡ ƒ˜§bclt ƒa-ÿÁ"
ù ®²k˜ uÐCz¶MIPS III ISA k˜‡^‡ §
´y“ FPU k 8 ‡"vk½^=‡^‡ -"
Ž¦^k“1 0 ‡”^‡ "
fcc(N) Óþ§^u C Šó“è"
upper,lower 1 7.10 !?ØNB˜‡ü°Ý2:é2:Mìp
ŒÜÚ$ŒÜŠ"
JÚ\ 
ext † ins -£±9 64 CN dext!dextm!dextu!dins!dinsm Ú
dinsu¤U kÇ/–¯½ £°ÝÚ £þSïuù VM
ì-p¤"
i­#|„——Ó=!i!*ÐÚ†Ï
 A¢yõMìMìmêâ­#|„I¦£3äþA
^§SAO'%ù˜:¤§\ #-µ
• Ó=öŠ£=̂£ ¤µ3 MIPS32/64R2 ƒc§MIPS kÊÏ£
öŠ"y3k rotr £‚£þ3-¥?è¤Ú rotrv £‚£þd M
썽¤§„kƒA 64 ‡ drotr Ú drotrv"
• i!½öŒiÎÒ*еoŒ±ÏL•†£ , •mŽâ£ ¢yÎ
Ò*Ч- seb!seh ©OJø ÎÒ*Ði!/ŒiMìM
ìöŠ"
• ŒiSi!†µwsbh -wþk:%§Ú̂£ ƒ(ܧŒ
±3˜ü^-S¢y 32 iSÜk^Œõêi!­|"
3 32 CPU þJø 64 FPU £9 CP2¤
 32 CPU 2:M‡žÿ§˜‡ 64  FPU ~~k¿
§ù˜:®²Cé²w "MIPS32/64 1˜‡#Nù‰§´Ø²LS
192
8.4. † MIPS32/64 1˜‡ O 1 8 Ù MIPS -8ëŒ
¥=ÒÃ{33Ï^MìÚ2:MìƒmDÑ 64 Š"mfhc1/mthc1
-¤ù‡óŠ§5£€2:MìpŒÜ©——®k mfc1/mtc1
-®²?n $ŒÜ©"
1‡„½Â mfhc2/mthc2 -§é CPU ŒU½Â?Û 64 
?nì 2 ¤ÓöŠ"
ÖM‡Mì
rdhwr •^rJø é, äN CPU &EÖ–¯§ë„1 8.5.12
!"
4#\-Œ„
synci -¤˜ƒ7‡p„ öŠ§¦U Œ‚/y§?Ûff
\;ì-éÏL I-cache -p„ öŠÑŒ„"†Pp„
-ØÓ§ù^-Ø´A-§^r§SŒ±¦^"ë„1 8.5.1
!"
8.4.2 1‡O\A-
A£Ø%;^¤-8kü?Cz"
f5¥äBŽ/#N
31‡ƒc§3 MIPS CPU ¥vk{U f5/BŽ¤k¥äµ3
SR Mìþ‡¦ RMW SŒU¥ä"\Œ±ÏLöŠXÚ
å£ë„1 5.8.3 !¤¢yS§´y3\k ˜^ýf-"
di 3ü‡fÚ½SBŽ¥ä£˜Ø SR(IE) ¤"rP SR Šˆ£
8IMìS§¤±\˜„Œ±^ mtc0 Ú SR Š­##N¥ä"´
±-8é¡5§1‡„½Â ˜^ ei -§f5/˜ SR(IE)"
KfMì|±
KfMì´Ï^Mì8˜|½õ|°§\Œ±ÀJ3,‡É~?
n§S¥¦^§~„´3¥ä?n§S¥^"1‡5‰Jø A«Ø
Ó¦^{§ë„1 5.8.6 !"
9#-k rdpgpr/wrpgpr§©OÖÚ\cMì8ƒ
,‡Mì|¥˜‡Mì"

193
8.5. Aύ-9Ù^å 1 8 Ù MIPS -8ëŒ
8.5 Aύ-9Ù^å
lØ£;M#§§-8p¹˜ š~°|A5§ù A5Ï
MIPS
J±n)½vk)º˜Ù ؏<¤5¿£Ï ҙ¦^¤"!8¥?Øù
A5"
8.5.1 •†\1/•m\1µ™éà\1Ú;
XJ~^êâSüéàÎÜM‡‡¦;ì>.ÇÒ¬Jp"é
uäk 32 o‚Åì5`§Ò´`ò 32 êâ˜3éà 32 >.
/Œk|¶aq/§64 o‚éu˜3éà 64 >.êâk|"
XJ CPU 7LBL;ì°Ý>.šéàêâ§Ò7L‰1ügö
Š"RISC 6Y‚{ü5ج#N3˜^-¥‰1ü‡öŠ§¤±šéà
Dі‡s¤ü‡-"
4à RISC Ý´Q,·‚ki!ŒöŠ§Ž‡šéàöŠŒ
±^i!öŠEÑ5"XJ˜¬ê⣂ª˜‡oi!½öli!ê
Š¤ŒU´šé১S /?ÈìoU r§Ö˜Xi!ŠS§,
^£ !ùèöŠ3M쥭#ïù‡ê"éiŒ\1SwþX
e£ùpb½´Œ—à CPU§vké CPU 6Y‚¥\1ò´?1`z¤µ
lbu rt, o(b)
sll rt, rt, 24
lbu rtmp, o+1(b)
sll rtmp, rtmp, 16
or rt, rt, rtmp
lbu rtmp, o+2(b)
sll rtmp, rtmp, 8
or rt, rt, rtmp
lbu rtmp, o+3(b)
or rt, rt, rtmp

ù´›^-§‰1og\1„‡^˜‡žMì"XJùöŠé
õ{§éŒU¤5UàÃ"
MIPS éd)ûY´˜é-§Ù¥z^-¦ŒUõ/¼šéà
i uéàS¬¥Ü©" MIPS -8u²ù -¶i‰ •
†\1 •m\1µ˜é-v ?1šéà load/store£i½öViŒ¤ö
Š"ù31 2.5.2 !JL"
–¯S£½öp„ ¤M‡DÑo½li!éàêâ"Ü©i
;‡oÏLM‡&ÒwŠS››ì3, i!ØC§‡oÏLÖ-U-
£RMW¤Sé‡i/ViöŠ"MIPS CPU Œõêkép„ 
RMW M‡§´vkéS——S››ì7LgC¢yÜ©"

194
8.5. Aύ-9Ù^å 1 8 Ù MIPS -8ëŒ
·‚`‡kü^-§Ïkü‡o‚±Ï"32 - lwl Ú lwr§©
OL«“load word left”Ú“load word right”¶64 - ldl Ú ldr§©OL
«“load double left”Ú“load double right"” “left” -?n™éàêp §
“right”-$ £“left”^{Ú“shift left (•†£ )”¥^{¿Âƒ
Ó¤"Ϗ-´^p Ú$ ½Â§´7L?ni!/ŒÏŒS§
[^{ûu CPU —à£ë„1 10.2 !¤"˜‡Œ—à CPU krp
3$i!/Œ§—à CPU rp 3pi!/Œ"

ã 8.1: 3Œ—à CPU þ\1šéàVi


ã 8.1 Áã`²3Œ—à CPU þ‰1Xe?èšéà÷öŠ uld d,
0(b) ‡L§µ
ldl d, 0(b)
ldr d, 7(b)

¥/ŒŠ§,Œ±´?¿éࣚéài^DÚ ld -¬
b
—É~¤"@oã 8.1 ľ3` ŸoQº
195
8.5. Aύ-9Ù^å 1 8 Ù MIPS -8ëŒ
• ldl d, 0(b): 0 £þIP™éàVi$i!/Œ§Ï·‚´Œ
—à§ùÒ´p 8 "ldl Ïé‡\1?Mì†> £p ¤§¤±
όi!±9S¥lTi!• i(—ƒmi!"S
/Œ3O§¤±k­•eü¶X㤫§ù i!‡•þ;M
ìp ?Òà"
• ldl d, 7(b): 7 ´k:Û%§•Vipi!/Œ——, b+8 
•e˜‡Vi1˜‡i!"ldr '%´m>$k ¶T-
Ñ©êâei!¿r§‚;Mì$ ˜§ùÒt½
"
XJ\éù«‰{´Äé?¿éàiÑka~¦§@ÒgCÁ˜Á
j"5¿3@«¤^/ŒÙ¢fЮ²(éàœ/e£ùŒ±^˜^~
5-\1ê⤧uld éÓêâ\1üg¶ùvkŸoAO¿Â§Ï~
vkŸo³?"
ù‡œ¹éS.u—àêS<w·Ï§Ï¦‚Öêâ(
žÿ²~r$k 3†>"˜ \ù‰ §-¶¥“†”Ò´
㥓m”£,„´•Xpk •£Ä¤"
3—à CPU þ§ldl/ldr Š^Ðp†§“èSXeµ
ldr d, 0(b)
ldl d, 7(b)

ã 8.2 `² No£¯µpk ؜˜u†>§¤±fÐÚ·


~x㤘麔"
¡ck ù 㧷‚Œ±éù -1¦þ‰Ñ˜‡°(Qãµ
• Load/store left: éÑόi!±9¹Ti!i£64 {Ò´
Vi¤"3?uόi!ÚTi$k࣌—àpi!/Œ
Ú—à$i!/Œ¤ƒm¤ki!þöŠ"
Load: Ñù i!£ Mìpà"3TMì$ ?Ò
i!ØC"
Store: ‡M쥄k˜m§^Mì¥lpki!m©¦ŒU
õi!“ù i!"
• Load/store right: éÑόi!9¹i/Vi"éόi!
±90uTi!ڝ¹ipkàƒm£Œ—à$i!/Œ§—
àpi!/Œ¤i!?1öŠ"
Load: ¤kù i!£ TMì.Ü"3MìSpi!
SNØC"
Store: ^lMì$ki!m©¦ŒUõi!“ù i!"

196
8.5. Aύ-9Ù^å 1 8 Ù MIPS -8ëŒ

ã 8.2: 3—à CPU þ\1™éàVi


-؇¦S››ìJøiS?¿i!|ÀJö
load/store left/right
Š¶¹Äi!Ïo´ëYÑy3i½öVi˜à"
5¿ùA‡-¿Ø‰1¤kŒU­#éà¶éu™éàŒi\1/
;vk;€|±£ØØÏLi!\1!£ !ùèÚÜ¿5¢y¤"
8.5.2 ë£\1/^‡;
- ll (load linked) Ú sc (store conditional) Jø ƒéuŠŒõêDÚ
-8˜Ü©f5ÿÁ ˜öŠSO“Y"ùü^-Jø
˜‡ÿÁ-˜S§3$1žØyf5§´=(JTдf5‰1
žÿâU¤õ£¿3¤õžw¤"@wþE,§´ ll/sc 3FÃOŒ
‘kƒé“€”Sõ?nìþ 5éУ föŠ 5
é ¤"

197
8.5. Aύ-9Ù^å 1 8 Ù MIPS -8ëŒ
ë„1 5.8.4 !ww^uŸo/±9No¦^"ùpù˜eÙóŠÅ›"
- ll d, o(b) l~5Č+ £þ/Œ‰1 32 \1"´§‘k˜‡
BŠ^§Ò´P4u) ˜gë£\1£3 CPU pÞ˜ ˜‡ØŒ„ë£
G ¤"Ӟr\1/Œ3Mì LLAddr pÞ"
‘  sc, t, o(b) Äku´ÄŒ±ylþg‰1 ll m©±5
Ö-U-SU f5/¤"XJU§@o t Š\ƒA ˜§ýŠ
1 ˆ£ t "XJØUyöŠf5§@o؉1;öŠ§t ˜ 0"

5¿œ éuf5ÿÁ،U‰”.â" CPU uÿ, ^


‡L² uƒA;ì ˜ŠŒU®²UCÙ¢¿vk
UCžÿ§-¬”}"
kü‡ό±— sc ”}"1˜‡Ò´ CPU 3 ll Ú sc ƒm‰1žu)
É~"É~?n§S½öÉ~>u?փ†§kŒU‰ , šf5
¯œ"
1«a.”}=3õ?nìžâ¬u)§,˜‡ CPU \ T
;ì ˜½öC ˜ž£~„´ uӘ‡p„ 1 ˜§,
¢yŒUi›‡S=†¤"duÇϧù‡iÿkë†V
CPU ÑÓ¿rTêâNêâ«žÿâ¦U——î‚5`§XJ,˜
‡ CPU é¯a«¤ ˜gë0;öŠ"
4·‚2grN˜eµsc öŠ”}¿ØUy²Ù§?Ö½ CPU ý/U
ÄLù‡Cþ§´`kŒUUÄL§\u˜e¶yäN¢yž3˜½ê
þ†Ú{ü5½5Uƒm?1·ï"
õ?nì CPU 7L‹lþg ll ¦^/Œ§r§3?nì 0 M
ì LLAddr ¥§3@p^‡Œ±Ö§"´˜ÖTMìÏ´?1
ä¶3˜‡vkõ?nìA CPU þ§ù´P{"ïÆ\؇6§"
ùp‰Ñ˜‡{á~fµ˜‡éAu Linux SØN^ atomic_inc(&mycount)
“f”\˜f§S"¿u‚§——ŒU uØÓ CPU þ——Œ±N^ù
‡~f§zgN^rëêŠO\ 1µ
atomic_inc:
ll v0, 0(a0) # a0 has pointer to ‘mycount’
addu v0, 1
sc v0, 0(a0)
beq v0, zero, atomic_inc # retry if sc fails
nop
jr ra
nop

NEC lgC Vr41xx CPU [x¥Ñ ll/sc -§ŒV´™U¿£


ü?nìUlùü^-¥ÉÃ"
198
8.5. Aύ-9Ù^å 1 8 Ù MIPS -8ëŒ
8.5.3 ^‡Dx-
^‡Dx-rêâl˜‡MìE›,˜‡M짴k3,
^‡÷vžâ‰1Dx——ÄK§ŸoØ‰"MIPS ^‡Dx1˜gÑy3
MIPS IV -8£k¢y3 R8000!R10000 Ú 1995–1996 cm R5000 ¥¤§
@3dƒc§ù®²¤Ù§ RISC NX(£ARM ŒU´1˜‡ù‰¤
AÚ "^‡Dx#N?Èì)¤^‡©|“è——ù:éЧϏ
^‡©|éu6Y‚ÇØ|"
äk–1˜Ù£ã{üÊ?6Y‚ CPU§©|¯K،¶©|ò´
ø¥-Ï~Ѭ‰1§CPU , †=©|8I"3ù {ü CPU
¥§£‡ò´ø¥¹˜‡k^-¤Œõê©|´¤§Ù{s¤
˜‡ž¨±Ï"
´é MIPS ISA E,kà¢y3–(½©|^‡ÚÑ8I-
žÿŒU¬›”õ^-‰1Ŭ"± R4400 6Y‚~§zg‰1
©|чs¤ü‡ž¨±Ï“d"3p݇Iþ R10000 £z‡±ÏŒ±u
xo^-¤þ§–©|^‡(½žÿN‡›”Ô^-uŬ"
ü$ù«œ¹K§R10000 k‡AÏ©|ýÿ>´5ßÿ©|(J¿J
c$1§Óž±U lù ßÿ‰1-£ˆUå"ù‰š~E,µX
J?ÈìU ~éE,A56§Ý§§S¬¯"
^‡Dx-´NK©|QºÄOŽü‡Š¥Š“è¡äµ
n = (a < b) ? a : b;

b½?È쮲{r¤kCþÑ\1? Mì§~œ¹e?È
(JXe¡S£ù´3éò´ø?16Y‚NƒcÜ6®?ŠóS
¤µ
slt t0, a, b
move n, a
bne zero, t0, 1f
move n, b
1:

Œ±O†µ
slt t0, a, b
move n, a
movz n, b, t0

¦+^‡Dx- movz wþéÛ%§§36Y‚¥Š^‹OM


ìmOŽ-ƒÓ"K ©|-§·‚pÝ6Y‚z CPU ¬
¯"

199
8.5. Aύ-9Ù^å 1 8 Ù MIPS -8ëŒ
8.5.4 ŒU©|
,˜‡6Y‚`z§Ò´3 MIPS II ¥Ú\ŒU©|"
5¿ù -3AOE,6Y‚þéJk/¢y§¤± MIPS32 5‰
Š¢ Ù3Œ£‡“襦^"
?ÈìÏ~U ¤õW¿©|ò´ø§´3á̂"—žéJ‰"ù
«Ì‚(—?©|‰1ª„§¤±ò´ø¥ nop KéŒ¶´Ì‚
N~~¿÷ ƒp6“è éJ­#|„"
ŒU©|-™u)©|ž’©|ò´ø-J"ÏL{ŽÙ
£㌱’˜^-——3 MIPS ¥(JÒДT-l5vk‰1L"
ÏL=3©|u)žâ‰1ò´ø-§ò´ø-¤ eĝ˜Ü©"
ù?Û̂µ
loop:
first
second
...
blez t0, loop
nop

ь±C†¤µ
loop:
first
loop2:
second
...
blez t0, loop
first

ù¿›X·‚Ao´Œ±W¿Ì‚ò´ø§ŒŒü$ ¢S‰1
nop ê"
\ŒU¬w§, ›Eû© Û¹ ù˜‡¿g§Ò´`§ŒU©
|-ÏLž nop 4§SC ¶ùÙ¢´‡Ø)"lþ¡~fŒ±w
ѧnop ˜„˜^­E-“§¤±§SŒþ¿vk¼Ã"¼Ã´„
Ý"
8.5.5 ê¦\Ú\\-
NõõxNŽ{)Äþ´éõ‡¦È¦ÚOŽ"3 JPEG ã”)è
ì˜a§SS ̂¥§ù«OŽõv±4 CPU Žâü÷KÖ$1"
ù OŽ©)˜X¦È\\öŠ§z‡öŠÒ–e¡ùµ
a = a + b * c;

200
8.5. Aύ-9Ù^å 1 8 Ù MIPS -8ëŒ
¦+Uì1˜Ùù RISC KïƧù‡$ŽÐÏL{ü!©mõU
5¢y§ù‡$Ž »~NŠ"¦{´˜‡õž¨±Ï$Ž§‰{ü
RISC 3e ˜‡NÝ Y£¯„¤\{¯K"XJÁã@҃\§Åì
Ò¬Êe5–¶XJâƒ\§Kvk4' Žâü±„aÚ¿
©|^"32:ü¥§„k˜‡ Ð?´†z^-ƒ', ,֌
±3¦{Ú\{ãƒm"
3 MIPS32/64 ½Âƒc§¦\\$Žáuˆ‡‚ûgC*Ð"MIPS32/64
U y†3 IDT!Toshiba Ú QED  CPU ¥®²¢yöŠpƒoN"$
Ž3kÕឨê¦{ü¥‰1§¤±Ñ´¦\\öŠ§ r(J\\ 2

¦{üÑÑMì lo Ú hi"4<Ø)´§¤k‚ûÑr¦‚-
‰ mad ½ madd Ø´“mac"”
8.5.6 2:¦\-
þ¡`Ñ·^u2:OŽ§ØLùp' A^´ 3D ã/C†ÚŒþ
Ý $Ž"32:ü¥§„k Ð?——†z^~5-ƒéX,
Ö£5‚zÚ\¤Œ±3¦{Ú\{ã"
?uŒõê PowerPC 2:ü¥%¦\$ŽÎ每ÙA w
â/ §w,ùé MIPS æBùA^-kK"
2:$Ž madd!msub!nmadd Ú nmsub ´ýoöŠê¦\-§
?1Xe$Žµ
a = b + c * d;

§‚8I´3 SGI óŠÕþŒ.ã//OŽ—8.A^Ú SGI ‡?


OŽÅþ­þ?êŠ?n"´éuëY¦\$Ž§§‚¿Øo´)¤
Ú IEEE 754 IO‡¦ƒÓ(J£ÏÜ¿¦\-3\{ƒc¿Øé¦È
?1\§¤±Ù(J°(ÝLp ¤"
8.5.7 õ‡2:^‡
3 MIPS IV ƒc§éu2:êöŠ(J¤kÿÁÚ̍-8mÏ&Ñ
´ÏL˜‡ü‡^‡ §T d'-²(˜§dAÏ^‡©|-²
(ÿÁ"NX(ùuЧ´Ï@Ï2:ü´˜‡Õᡧ2:^
‡ ´ÏL˜‡D4Ì CPU &҂5¢y"
ü‡ æ†3u— 6§ü$ ¿1uxõ‡-då"3Mï
^‡'-ÚÿÁ^‡©|-ƒm§k˜‡ØŒ;-֝6¶
 R3900 ÚÙ§˜ CPU k‡nöŠê¦\-§=BXd§\ꁛU
2 Toshiba

5g hi/lo"IDT Ú QED  CPU Jø ˜^VöŠê-§‹ Toshiba -38IöŠê


$0 A~eƒÓ"

201
8.5. Aύ-9Ù^å 1 8 Ù MIPS -8ëŒ
3‘ '-7Lò´©|wc˜‡Š¿U§1Ä/§Kk˜‡
Œ±;Ö-6"
2:ê|OŽÉÃu˜«‰^‡6Y‚?ÈEâ§TEâr̂Ðm§
òƒUAĝOŽk¿ƒp†§±ŒÝ|^2:ü"XJ
̂N,Ü©I‡ÿÁÚ©|§ü‡^‡ ÒØU‰ù:¶ùžÿõ‡^‡
Œ±å錊^"
y“ FPU Jø 8 ‡^‡ § Ø´k 1 ¶'Ú2:^‡©|-
Œ±½^=‡^‡ "Pª?Èìr3˜ 0§¤±^^‡ 0 P
“菬($1"
8.5.8 ý
Jø ˜«{§Œ±4§S«¿p„ /;ìXÚ`§, êâ
pref
鯬^"|^ù˜A5¢yŒ±rêâýp„ ".kõA
^§SU ý„= êâÚ^ŒU—p„ ™·¥§ù˜:„Øý˜
Ù¶, §ýéuŒ.ê|$ŽõUék^§Œ±3˜ĝ¥ýь1
êâe˜ĝŠO"
pref 1˜‡ë괘‡ê§^±?èk'§SŽN¦^êâ“J
«(hint)”"˜ MIPS32/64 CPU ¢y˜ Š‰ŒXL 8.5 ¤«"
XJ MIPS CPU ¿ØUn),‡J«§Œ±Š“load”J«½öÑ"
˜„5`§CPU Œ±‘¿Ñ pref §r§¤ nop"ù,æ^J«
`zéu,‡A½ CPU§3Ù§ CPU þØ¬»€“è"
k MIPS CPU ¢y š{l\1§Ù¥3\1ž-p„ ™·¥
§‡vkÚ^\18IMì§Ò•eUY‰1", §pref -·^
ué;얯§ýÿ£3vk¢y CPU þðz˜‡˜öŠ§'å3
§S¥A¿J@‰1{l\1ù«‰{§²wû5¤"
8.5.9 Sync µ^u load/store ;ì“o
b½·‚k˜‡§Sd˜ pƒŠG1?Ö|¤§z‡Ñ$1uØÓ
“?nì” þ¿ S"·‚ŒU3!Øæ^ E,p„ ˜—5Ž
{õ?n짴y3kØÄp„ +n", “?nì”´‡æ^
^ DMA  I/O ››ìžÿ§¬kÓ¯K"
?Û?ÖèFSŽ{‡6uÙ§?Ö3Ÿožÿ–¯L
êâµÙ§?Ö3·?UƒcÖLêâ躧‚?ULêâíº
Q,z‡?Ö´î‚G1kS§Ÿoù‡¬¤˜‡¯KºÑyù‡¯
K´Ï CPU 5UN`A5²~ÚSöŠÜ6^SƒZ6¶Uì½Â§
TZ6é§Sg7L´ØŒ„§´l ¡wžÒ¬³Ñ5"kNõ
ndŒ±‹»g,^S" ZS5U§ÖöŠ——3 CPU Ϗ
202
8.5. Aύ-9Ù^å 1 8 Ù MIPS -8ëŒ
L 8.5: ýJ«“è
Š/MIPS ¶i ŒU¬u)Ÿo Ÿožÿ¦^
0 - load XJ„vkÒrp„ 1Ö \ Ï " é ¯ ‡ Ö  ê â 
1 - store  D-cache žÿ"XJ\Ž?U§Ò
^“store”J«"
4 - load streamed ;z‡êâ^˜g6ª ^u\Ï"^S?1?n¿
5 - store streamed êâÓ÷‡p„ "N ?nƒ Ꮜ±¿ïê
^,˜´p„ " â"
6 - load retained †6ªƒ‡£¤±N´‡^ ^uÏ"õg¦^¿ŒUÚ6
7 - store retained Ù§´p„ ¤" ªêâ¿p„ êâ"
25 - writeback invalidate/ XJT1 up„ 1S§ \\®²?n êâ§
nudge Ҋ¢£XJUL‡k£ Ž‡yٙ5ép„ ]
¤" ¿7,”}ž"
30 - PrepareForStore eƒA1¿™?\p„ § \\ò‡­‡1
MïƒAp„ 1—— žÿ§lSÖPêâÒ
Ø´l;ìÖê⧠´ vk7‡ "˜‡£Â1‡
òÙ^"W¿¿ IP9" ^"W¿´ÏÙ±c
eT1®² up„ S§ SNŒUáu,‡¯aA
ŸoØ‰——ØU6Tö ^——4#§Sw±c
Šép„ 1˜"" êâŒU¬»€S5"
–êâ Ê—AL3–öŠ"‡ CPU 3˜gžÿ
Ӟ;êâÚ/Œ§ÒŒ±röŠí´˜¬"XJ CPU @‰§Ðu
˜e(@Ö/ŒØ´– ˜¶ù:Œ±‰"
,˜‡~f´¢y š{l\1 CPU  -Ӟkü‡ÖöŠ3
¹Ä¶ ˆZ5U§A#N;ìXÚÀJk‰1=‡"
Ø#N±þ?ۘ«^SUC§î‚Uì§S^S‰1¤kÖöŠ
CPU§¡‰rkS(strongly ordered) "Nõ MIPS CPU ›¤ü?nìž
ÿ§Ñ´rkS"k~ µ=¦k @Ï R3000 Xڏ#NÖöŠL
–£‡kuÖØ´?Û– ˜¤"
˜^ sync -½Â˜‡“o"Œ±•\y¤k3 sync ƒcuå
(J§ u sync ¡?ÛöŠÑŒ„"
5¿3˜‡õ?n쥧·‚ØØj±“Œ„”ù‡c´“XÚ¥?Û
(¢y ;p„ XÚ?Öь„”"Ï~‰{´y sync
 CPU Úp„ /S/o‚fXڃm¯Ö)¤˜‡“Ž­#üS¶
æ"
k˜ ›"éuöŠÚ sync ‰1ƒéžSvky¶==
´rT-ƒcڃ öŠ©m"sync ØUy)û CPU §S‰1
Ú ÜƒmžS'X¯K§ù‡¯K·‚3 10.4 !¬J"
203
8.5. Aύ-9Ù^å 1 8 Ù MIPS -8ëŒ
3˜‡XÚpÞ§sync 3, –¯a.£Ø^p„ –¯±9˜—
p„ –¯¤þåŠ^"éõ“~”²Lp„ ;ìØ´˜—§
?Û®جêâ˜mÑ´S§3?փmÖê⏘
"
3rkS CPU þ§sync ŸoÑØ^‰¶ù«œ/§Œ±Ò´˜^ nop"
, §Ï~ sync Ñk L¶ž\ CPU Ãþ"
8.5.10 ‘x“o-
˜^-¦^;E3c¡-(J2²~ØL "36Y‚z?
n쥧~1^-lMìæÖöŠêžm3c˜^Š£ƒc"
@Ø´¯K§Ï MIPS -==3Mì¥D4êâ§?ÑÏ^MìÚ2:
MìêâŒþ´²L ´——Ò´`§M‡iÿù«6¿ Süòê
â†cí1‡-ÐI‡žÿ"
´éu CP0 M죘„¤Ø´ù‰"XJ\˜‡ CP0 Mì
§ùN¬K‘ -§MIPS 5½¿Øyù‡K‡sõÈ"
kü«a.‘x"²wÒ´6-‡^1˜‡-JøŠµ@
‰‰1‘x"
æ†œ/´öŠUC , CPU G§±–u$–¬K‘
-µ'X`§é CP0 ?U ;ìN=†˜ž§Ò¬
Ñyù«œ¹"ù ‰-‘x"
DÚþ§MIPS CPU rOU y($1SóŠ3‰ SØ/.
^‡ó§“§˜„ÏL3öŠÚ6-ƒm\þv êþ nop ½ö
ssnop -5¢y"
3

g MIPS32 1‡5‰u1±5§ù«‰{®²‘x“o-¤
“"eret!jr.hb Ú jalr U“o)‰1‘x3S¤kBŠ^§ ehb £˜«
Or no-op¤±m?n‰1‘x"
k'‘xړoõ?اë„1 3.4 !"
£‡^‡5¦^#-
XJ\\^‡3 MIPS32 1‡½p‡ CPU þ$1§@o
ÒÐ "´ ‘oØØUY$13P CPU þ^‡§#‡5‰

• ehb u no-op: 3±c¤k CPU þѤá"\Œ±Mïј«^‡§
QUUY$1uPª CPU þ§q3™5¤k MIPS32/64 oN CPU
´˜‡AÏa. no-op§U y3@«˜‡ž¨±ÏŒ±uõ‡- CPU þ
3 ssnop

˜^-gÒÓ^˜‡u±Ï"

204
8.5. Aύ-9Ù^å 1 8 Ù MIPS -8ëŒ
þE,v¯Kµ‡^ ehb 5O†\“v õ no-op”¥ ˜‡Ò
1 "
• jr.hb Ú jalr.hb: 3@Ï CPU þÈè{üMìa=ÚMìN^
-"‡®²3\P CPU þk v õ no-op§y3\XÚ
3 MIPS32/64 1‡ CPU þÒ´S"
8.5.11 synci: U-§S‰p„ +n
r,˜‡§S\1?S§S¢Sþ\´êâp„ "C1
-‡?\-p„  âU‰1"MIPS CPU vkëü‡p„ 
Ü6£ü‡p„ Ñ´5Uƒ'§¤±d O\Ü6vkŒ¿Â§Ï
é^¤"
3-\ §\1§SASü£?۝¹êâp„ 1§¿
Š¢®² u-p„ ƒA ˜SN"\,Œ±^1 4.6 !ù cache
-‰ù˜:——ù -U3Ø%¦^§˜‡øg?§¦^
 -C1§Sؘ½´A^‡"
Ïd§3# MIPS32/64 CPU ¥§MIPS Jø synci -§ff\
1ƒup„ 1ŒS¬¤‡óŠµÒ´`§QSüêâp„
 D-cache £§qSü-p„  I-cache Š¢"
‡3^r?¦^ synci§\I‡p„ 1Œ§ùŒ±ÏL˜^
- rdhwr SYNCI Step le!ù˜‡IO“M‡Mì”"
8.5.12 ÖM‡Mì
†‰šA£^r¤^‡Jø 'uM‡k^&E"
rdhwr
MIPS32/64 5‰8c½Â o‡Mì"öŠXÚÏL3 CP0 Mì
HWREna ˜ ¶-£ 0 ˜ ¦UMì 0§" ¤Œ±ü՛›éz‡
Mì–¯"HWREna 3E žܘ"§¤±7L^^‡²(¦U^r
–¯"A“è[Œ±Ö˜ƒ&E§ÃÀ HWREna ¥""
o‡M쏵
• CPUNum(0): T§Sc3$1 CPU Ò"ùŒ±l?nì 0 
EBase(CPUNum) 5"

• SYNCI Step(1): ˜?p„ 1k°Ý" 4

1°Ýéu^r§S魇§Ï¦‚y3Œ±^ synci -ép„


öŠ¦\-Œ±‰1", SYNCI Step wŠ\“Ú”
——‡CX,‡‰ŒS܍- ‡¦ƒU synci ƒm/ŒOþ"
î‚5`§´-p„  I-cache Úêâp„  D-cache 1¥§´öؘ
4

œ/4¾„"
205
8.6. -?è 1 8 Ù MIPS -8ëŒ
XJ SYNCI Step ˆ£"Š§¿gÒ´`\ŠØI‡^ synci"
• CC(2): ^ré CP0 Count MìÖ–¯§^up©EÇOê"ù‡
vkŒ^?§Øš...
• CCRes(3): wŠ\ Count Oêkõ¯"§´é6Y‚ž¨©ªÏf£X
J\ÖŠ “2”§@o Count ±6Y‚ž¨ªÇ˜Œ§zü‡±Ï
O\˜g¤"
8.6 -?è
MIPS32/64 ISA 1‡½ÂÜ MIPS -£±9²L&­ÀJdˆ
«NX(CN¤½ÂØӍ-¤Uì?è^S3L 8.6 ¥"1 8.6.2 !Ú
1 8.6.3 !Jø 'uL¥]?˜Ú&E"
Œõê MIPS Ãþ`kn«-‚ª¦^L"·c`ùéAu¡
ÐSÜO˜ y¢§é^rw5ýéؖ@§3^rw5Д´ØÓ
-òˆ‡^uØÓ8"#-^ E,?è"
L 8.6 wŠ\?›?èÚ®?“襍-ÏPÎ"
IK“¤á ISA”IÑvk¤k MIPS32 oN CPU ¢y-µ
TSN)“R2§”L«† MIPS32/64 1‡â‡¦-§“MIPS64”L
«k 64 CPU â7L-§“EJTAG”L«†NÁüƒéX
-§“3D”Ú“PS”L«†2:ŒÀ*Ð MIPS-3D Úü°Ý2:éƒ'§“š
MIPS32/64”L«Q²^u MIPS I y3®²LžØ^ "ó ˜¬k
,‡JøAύ-äN CPU ¶i"
8.6.1 -?èL¥ˆ‡
e¡SN)º˜ L 8.6 ¥"
Field 31–26 ÌöŠè“op”§ 6 Ý"J±˜? 32 -£–“§” j Ú jal 
-½‘ 16 ~êŽâ-¤k‡˜“op” "Ù§-±|ü
˜‡“op”Š§ÏLO«©"
Field 5–0 ^unMìöŠêŽâ/Ü6-|f荣ÌöŠè"¤"

Field 25–21 q˜‡*ÐöŠè§ùgd?nìa.-¦^"

s, t, w I£ M썧óØ(½´Ï^Mìžÿ^ rs, rt"

o(b), offset “o”´˜? 16 ˜‡kÎÒ £þ¶Ï^ČMì§ÙSN\


“o”þ)¤˜‡‰ load ½ store -^/Œ"

206
8.6. -?è 1 8 Ù MIPS -8ëŒ
d 8IM짇T-?U"󷂤 rd ±J2\´˜‡Ï^M
ì"
shf £ þõ§^3~ê£ -¥"

broffset ˜‡kÎÒ 16 ƒéu PC i £þ§“L±iü ,‡I


Òål£z‡-˜‡i¤"" £þ“L©| ò´ø-§¤±©
|gC £þ´ -1"
target ‡a 26 i/Œ£éAu 28 i!/Œ¤"§a=- j é
¦^§¤±ù‡‚ªA^u¼êN^£jal¤"
8I/Œp 4 Ã{^-‰Ñ§la=-/Œ"ù¿›X
ù -Œ±ˆ3T-/ŒNC 256 M ‰ŒƒS"‡a
/§^ jr £Mìa=¤-"
constant ^uŽâÜ6öŠ 16 .~ê†þ"ŠâØӍ-Œ±)º
kÎÒ½öÃÎÒê"
cs/cd Š5 ½8I?nìMì"-8z‡?nìÜ©Œ±k
õ 32 ‡êâMìÚ 32 ‡››Mì"
fr/fs/ft 2:ü Mì"

fd 2:8IMì£d-\êâ¤"

N/M 2:^‡èÀJì——Öž“N”§d'-\ž“M”"3
k˜‡2:^‡èPª2:-8¥T"§ÏP®?“èvk
ù‡§\-žŒ±ØT§u1"‡^‡è"
hint 8.5.8 !0 ý-J«"

cachop ù‡Ú cache -˜å¦^§é3-/Œ¥uyp„ ‘öŠ?


1?è"ë„1 4.9 !L 4.2"
L 8.6: Uì?èüSÅì-
31-26 25-21 20-18 17-16 15-11 10-8 7-6 5-0 ®?¶ ¤á ISA
0 0 0 0 0 0 nop
0 0 0 0 1 0 ssnop
0 0 w d shf 0 sll d,w,shf

0 s N 0 d 0 1 movf d,s,N

207
8.6. -?è 1 8 Ù MIPS -8ëŒ
L 8.6: Y
31-26 25-21 20-18 17-16 15-11 10-8 7-6 5-0 ®?¶ ¤á ISA
0 s N 1 d 0 1 movt d,s,N

0 0 w d shf 2 srl d,w,shf


0 0 w d shf 2 rotr d,w,shf R2
0 0 w d shf 3 sra d,w,shf
0 s t d 0 4 sllv d,t,s
0 s t d 0 6 srl d,t,s
0 s t d 1 6 rotrv d,t,s R2
0 s t d 0 7 srav d,t,s

0 s 0 0 0 8 jr s
0 s 0 0 16 8 jr.hb s
0 s 0 31 0 9 jalr s
0 s 0 d 0 9 jalr d,s
0 s 0 d 16 9 jalr.hb d,s

0 s t d 0 10 movz d,s,t
0 s t d 0 11 movn d,s,t
0 code 12 syscall code

0 code x 13 break code


0 code x 14 sdbbp code R3900

0 0 0 0 0 15 sync
0 0 0 d 0 16 mfhi d

0 s 0 0 0 17 mthi s
0 0 0 d 0 18 mflo d
0 s 0 0 0 19 mtlo s
0 s t d 0 20 dsllv d,t,s MIP64
0 s t d 0 22 dsrlv d,t,s MIP64
0 s t d 1 22 drotrv d,t,s MIP64R2
0 s t d 0 23 dsrav d,t,s MIP64
0 s t 0 0 24 mult s,t

208
8.6. -?è 1 8 Ù MIPS -8ëŒ
L 8.6: Y
31-26 25-21 20-18 17-16 15-11 10-8 7-6 5-0 ®?¶ ¤á ISA
0 s t 0 0 25 multu s,t
0 s t 0 0 26 div s,t
0 s t 0 0 27 divu s,t
0 s t 0 0 28 dmult s,t MIPS64
0 s t 0 0 29 dmultu s,t MIPS64
0 s t 0 0 30 ddiv s,t MIPS64
0 s t 0 0 31 ddivu s,t MIPS64
0 s t d 0 32 add d,s,t
0 s t d 0 33 addu d,s,t
0 s t d 0 34 sub d,s,t
0 s t d 0 35 subu d,s,t
0 s t d 0 36 and d,s,t
0 s t d 0 37 or d,s,t
0 s t d 0 38 xor d,s,t
0 s t d 0 39 nor d,s,t
0 s t 0 0 40 madd16 d,s,t Vr4100
0 s t 0 0 41 dmadd16 d,s,t Vr4100
0 s t d 0 42 slt d,s,t
0 s t d 0 43 sltu d,s,t
0 s t d 0 44 dadd d,s,t MIPS64
0 s t d 0 45 daddu d,s,t MIPS64
0 s t d 0 46 dsub d,s,t MIPS64
0 s t d 0 47 dsubu d,s,t MIPS64
0 s t x 48 tge s,t
0 s t x 49 tgeu s,t
0 s t x 50 tlt s,t
0 s t x 51 tltu s,t
0 s t x 52 teq s,t
0 s t x 54 tne s,t

0 0 w d shf 56 dsll d,w,shf MIP64


0 0 w d shf 58 dsrl d,w,shf MIP64
1 0 w d shf 58 drotr d,w,shf MIP64R2
0 0 w d shf 59 dsra d,w,shf MIP64

209
8.6. -?è 1 8 Ù MIPS -8ëŒ
L 8.6: Y
31-26 25-21 20-18 17-16 15-11 10-8 7-6 5-0 ®?¶ ¤á ISA
0 0 w d shf 60 dsll32 d,w,shf MIP64
0 0 w d shf 62 dsrl32 d,w,shf MIP64
0 0 w d shf 63 dsra32 d,w,shf MIP64

1 s 0 broffset bltz s,p


1 s 1 broffset bgez s,p
1 s 2 broffset bltzl s,p
1 s 3 broffset bgezl s,p
1 s 8 constant tgei s,j
1 s 9 constant tgeiu s,j
1 s 10 constant tlti s,j
1 s 11 constant tltiu s,j
1 s 12 constant teqi s,j
1 s 14 constant tnei s,j
1 s 16 broffset bltzal s,p
1 s 17 broffset bgezal s,p
1 s 18 broffset bltzall s,p
1 s 19 broffset bgezall s,p
1 b 31 o synci o(b) R2

2 target j target
3 target jal target

4 s t broffset beq s,t,p


5 s t broffset bne s,t,p
6 s 0 broffset blez s,p
7 s 0 broffset bgtz s,p
8 s d (signed) const addi d,s,const
9 s d (signed) const addiu d,s,const
10 s d (signed) const slti d,s,const
11 s d (signed) const sltiu d,s,const
12 s d (unsigned) const andi d,s,const
13 s d (unsigned) const ori d,s,const
14 s d (unsigned) const xori d,s,const

210
8.6. -?è 1 8 Ù MIPS -8ëŒ
L 8.6: Y
31-26 25-21 20-18 17-16 15-11 10-8 7-6 5-0 ®?¶ ¤á ISA
15 0 d (unsigned) const lui d,s,const

16 0 t cs 0 0 mfc0 t,cs
16 1 t cs 0 0 dmfc0 t,cs MIP64
16 2 t cs 0 0 cfc0 t,cs MIP64

16 4 t cd 0 0 mtc0 t,cd
16 5 t cd 0 0 dmtc0 t,cs MIP64
16 10 xt d 0 0 rdpgpr d,xt R2
16 11 t 12 0 0 di t R2
16 11 t 12 0 32 ei t R2
16 14 t xd 0 0 wrpgpr xd,t R2

16 16 0 0 0 1 tlbr
16 16 0 0 0 2 tlbwi
16 16 0 0 0 6 tlbwr
16 16 0 0 0 8 tlbp

16 16 0 0 0 16 rfe MIPS I
16 16 0 0 0 24 eret
16 16 0 0 0 31 dret MIPS II
16 16 0 0 0 32 deret EJTAG
16 16 0 0 0 33 standby Vr4100
16 16 0 0 0 34 suspend Vr4100

16 8 0 broffset bc0f p š MIPS32/64


16 8 1 broffset bc0t p š MIPS32/64
16 8 2 broffset bc0fl p š MIPS32/64
16 8 3 broffset bc0tl p š MIPS32/64
17 0 t fs 0 0 mfc1 t,fs
17 1 t fs 0 0 dmfc1 t,fs MIPS64
17 2 t cs 0 0 cfc1 t,cs
17 3 t fs 0 0 mfhc1 t,fs R2

211
8.6. -?è 1 8 Ù MIPS -8ëŒ
L 8.6: Y
31-26 25-21 20-18 17-16 15-11 10-8 7-6 5-0 ®?¶ ¤á ISA
17 4 t cs 0 0 mtc1 t,fs
17 5 t cs 0 0 dmtc1 t,fs MIPS64
17 6 t cs 0 0 ctc1 t,fs
17 7 t fs 0 0 mthc1 t,fs R2

17 8 N 0 broffset bc1f N,p


17 8 N 1 broffset bc1t N,p
17 8 N 2 broffset bc1fl N,p
17 8 N 3 broffset bc1tl N,p
17 9 N 0 broffset bc1any2f N,p 3D
17 9 N 1 broffset bc1any2t N,p 3D
17 9 N 2 broffset bc1any4f N,p 3D
17 9 N 3 broffset bc1any4t N,p 3D

17 16 ft fs fd 0 add.s fd,fs,ft
17 17 ft fs fd 0 add.d fd,fs,ft
17 22 ft fs fd 0 add.ps fd,fs,ft PS
17 16 ft fs fd 1 sub.s fd,fs,ft
17 17 ft fs fd 1 sub.d fd,fs,ft
17 22 ft fs fd 1 sub.ps fd,fs,ft PS
17 16 ft fs fd 2 mul.s fd,fs,ft
17 17 ft fs fd 2 mul.d fd,fs,ft
17 22 ft fs fd 2 mul.ps fd,fs,ft PS
17 16 ft fs fd 3 div.s fd,fs,ft
17 17 ft fs fd 3 div.d fd,fs,ft
17 16 0 fs fd 4 sqrt.s fd,fs
17 17 0 fs fd 4 sqrt.d fd,fs
17 16 0 fs fd 5 abs.s fd,fs
17 17 0 fs fd 5 abs.d fd,fs
17 22 0 fs fd 5 abs.ps fd,fs PS
17 16 0 fs fd 6 mov.s fd,fs
17 17 0 fs fd 6 mov.d fd,fs
17 22 0 fs fd 6 mov.ps fd,fs PS
17 16 0 fs fd 7 neg.s fd,fs

212
8.6. -?è 1 8 Ù MIPS -8ëŒ
L 8.6: Y
31-26 25-21 20-18 17-16 15-11 10-8 7-6 5-0 ®?¶ ¤á ISA
17 17 0 fs fd 7 neg.d fd,fs
17 22 0 fs fd 7 neg.ps fd,fs PS
17 16 0 fs fd 8 round.l.s fd,fs MIPS64
17 17 0 fs fd 8 round.l.d fd,fs MIPS64
17 16 0 fs fd 9 trunc.l.s fd,fs MIPS64
17 17 0 fs fd 9 trunc.l.d fd,fs MIPS64
17 16 0 fs fd 10 ceil.l.s fd,fs MIPS64
17 17 0 fs fd 10 ceil.l.d fd,fs MIPS64

17 16 0 fs fd 11 floor.l.s fd,fs MIPS64


17 17 0 fs fd 11 floor.l.d fd,fs MIPS64
17 16 0 fs fd 12 round.w.s fd,fs
17 17 0 fs fd 12 round.w.d fd,fs
17 16 0 fs fd 13 trunc.w.s fd,fs
17 17 0 fs fd 13 trunc.w.d fd,fs
17 16 0 fs fd 14 ceil.w.s fd,fs
17 17 0 fs fd 14 ceil.w.d fd,fs
17 16 0 fs fd 15 floor.w.s fd,fs
17 17 0 fs fd 15 floor.w.d fd,fs

17 16 N 0 fs fd 17 movf.s fd,fs,N
17 17 N 0 fs fd 17 movf.d fd,fs,N
17 22 N 0 fs fd 17 movf.ps fd,fs,N PS
17 16 N 1 fs fd 17 movt.s fd,fs,N
17 17 N 1 fs fd 17 movt.d fd,fs,N

17 16 t fs fd 18 movz.s fd,fs,t
17 17 t fs fd 18 movz.d fd,fs,t
17 22 t fs fd 18 movz.ps fd,fs,t PS
17 16 t fs fd 19 movn.s fd,fs,t
17 17 t fs fd 19 movn.d fd,fs,t
17 22 t fs fd 19 movn.ps fd,fs,t PS
17 16 0 fs fd 21 recip.s fd,fs
17 17 0 fs fd 21 recip.d fd,fs

213
8.6. -?è 1 8 Ù MIPS -8ëŒ
L 8.6: Y
31-26 25-21 20-18 17-16 15-11 10-8 7-6 5-0 ®?¶ ¤á ISA
17 16 0 fs fd 22 rsqrt.s fd,fs
17 17 0 fs fd 22 rsqrt.d fd,fs
17 22 0 fs fd 24 addr.ps fd,fs 3D

17 22 0 fs fd 26 mulr.ps fd,fs 3D
17 17 0 fs fd 28 recip2.d fd,fs 3D
17 22 0 fs fd 28 recip2.ps fd,fs 3D
17 17 0 fs fd 29 recip1.d fd,fs 3D
17 22 0 fs fd 29 recip1.ps fd,fs 3D
17 17 0 fs fd 30 rsqrt1.d fd,fs 3D
17 22 0 fs fd 30 rsqrt1.ps fd,fs 3D
17 17 0 fs fd 31 rsqrt2.d fd,fs 3D
17 22 0 fs fd 31 rsqrt2.ps fd,fs 3D

17 17 0 fs fd 32 cvt.s.d fd,fs
17 20 0 fs fd 32 cvt.s.w fd,fs
17 21 0 fs fd 32 cvt.s.l fd,fs MIPS64
17 22 0 fs fd 32 cvt.s.pu fd,fs PS
17 16 0 fs fd 33 cvt.d.s fd,fs
17 20 0 fs fd 33 cvt.d.w fd,fs
17 21 0 fs fd 33 cvt.d.l fd,fs MIPS64
17 16 0 fs fd 36 cvt.w.s fd,fs
17 17 0 fs fd 36 cvt.w.d fd,fs
17 22 0 fs fd 36 cvt.pw.ps fd,fs 3D
17 16 0 fs fd 37 cvt.l.s fd,fs MIPS64
17 17 0 fs fd 37 cvt.l.d fd,fs MIPS64
17 16 0 fs fd 38 cvt.ps.s fd,fs PS
17 20 0 fs fd 38 cvt.ps.pw fd,fs 3D
17 21 0 fs fd 38 cvt.ps.pw.l fd,fs PS
17 22 0 fs fd 40 cvt.s.pl fd,fs PS
17 22 0 fs fd 44 pll.ps.ps fd,fs PS
17 22 0 fs fd 45 plu.ps.ps fd,fs PS
17 22 0 fs fd 46 pul.ps.ps fd,fs PS
17 22 0 fs fd 47 puu.ps.ps fd,fs PS

214
8.6. -?è 1 8 Ù MIPS -8ëŒ
L 8.6: Y
31-26 25-21 20-18 17-16 15-11 10-8 7-6 5-0 ®?¶ ¤á ISA
17 16 ft fs M 0 48 c.f.s M,fs,ft
17 17 ft fs M 0 48 c.f.d M,fs,ft
17 22 ft fs M 0 48 c.f.ps M,fs,ft PS
17 16 ft fs M 0 49 c.un.s M,fs,ft
17 17 ft fs M 0 49 c.un.d M,fs,ft
17 22 ft fs M 0 49 c.un.ps M,fs,ft PS

17 16 ft fs M 0 50 c.eq.s M,fs,ft
17 17 ft fs M 0 50 c.eq.d M,fs,ft
17 22 ft fs M 0 50 c.eq.ps M,fs,ft PS
17 16 ft fs M 0 51 c.ueq.s M,fs,ft
17 17 ft fs M 0 51 c.ueq.d M,fs,ft
17 22 ft fs M 0 51 c.ueq.ps M,fs,ft PS
17 16 ft fs M 0 52 c.olt.s M,fs,ft
17 17 ft fs M 0 52 c.olt.d M,fs,ft
17 22 ft fs M 0 52 c.olt.ps M,fs,ft PS
17 16 ft fs M 0 53 c.ult.s M,fs,ft
17 17 ft fs M 0 53 c.ult.d M,fs,ft
17 22 ft fs M 0 53 c.ult.ps M,fs,ft PS
17 16 ft fs M 0 54 c.ole.s M,fs,ft
17 17 ft fs M 0 54 c.ole.d M,fs,ft
17 22 ft fs M 0 54 c.ole.ps M,fs,ft PS
17 16 ft fs M 0 55 c.ule.s M,fs,ft
17 17 ft fs M 0 55 c.ule.d M,fs,ft
17 22 ft fs M 0 55 c.ule.ps M,fs,ft PS
17 16 ft fs M 0 56 c.sf.s M,fs,ft
17 17 ft fs M 0 56 c.sf.d M,fs,ft
17 22 ft fs M 0 56 c.sf.ps M,fs,ft PS
17 16 ft fs M 0 57 c.ngle.s M,fs,ft PS
17 17 ft fs M 0 57 c.ngle.d M,fs,ft PS
17 22 ft fs M 0 57 c.ngle.ps M,fs,ft PS
17 16 ft fs M 0 58 c.seq.s M,fs,ft
17 17 ft fs M 0 58 c.seq.d M,fs,ft
17 22 ft fs M 0 58 c.seq.ps M,fs,ft PS

215
8.6. -?è 1 8 Ù MIPS -8ëŒ
L 8.6: Y
31-26 25-21 20-18 17-16 15-11 10-8 7-6 5-0 ®?¶ ¤á ISA
17 16 ft fs M 0 59 c.ngl.s M,fs,ft
17 17 ft fs M 0 59 c.ngl.d M,fs,ft
17 22 ft fs M 0 59 c.ngl.ps M,fs,ft PS
17 16 ft fs M 0 60 c.lt.s M,fs,ft
17 17 ft fs M 0 60 c.lt.d M,fs,ft
17 22 ft fs M 0 60 c.lt.ps M,fs,ft PS
17 16 ft fs M 0 61 c.nge.s M,fs,ft
17 17 ft fs M 0 61 c.nge.d M,fs,ft
17 22 ft fs M 0 61 c.nge.ps M,fs,ft PS
17 16 ft fs M 0 62 c.le.s M,fs,ft
17 17 ft fs M 0 62 c.le.d M,fs,ft
17 22 ft fs M 0 62 c.le.ps M,fs,ft PS
17 16 ft fs M 0 63 c.ngt.s M,fs,ft
17 17 ft fs M 0 63 c.ngt.d M,fs,ft
17 22 ft fs M 0 63 c.ngt.ps M,fs,ft PS
17 16 ft fs M 1 48 cabs.f.s M,fs,ft 3D
17 17 ft fs M 1 48 cabs.f.d M,fs,ft 3D
17 22 ft fs M 1 48 cabs.f.ps M,fs,ft 3D
17 16 ft fs M 1 49 cabs.un.s M,fs,ft 3D
17 17 ft fs M 1 49 cabs.un.d M,fs,ft 3D
17 22 ft fs M 1 49 cabs.un.ps M,fs,ft 3D
17 16 ft fs M 1 50 cabs.eq.s M,fs,ft 3D
17 17 ft fs M 1 50 cabs.eq.d M,fs,ft 3D
17 22 ft fs M 1 50 cabs.eq.ps M,fs,ft 3D
17 16 ft fs M 1 51 cabs.ueq.s M,fs,ft 3D
17 17 ft fs M 1 51 cabs.ueq.d M,fs,ft 3D
17 22 ft fs M 1 51 cabs.ueq.ps M,fs,ft 3D
17 16 ft fs M 1 52 cabs.olt.s M,fs,ft 3D
17 17 ft fs M 1 52 cabs.olt.d M,fs,ft 3D
17 22 ft fs M 1 52 cabs.olt.ps M,fs,ft 3D
17 16 ft fs M 1 53 cabs.ult.s M,fs,ft 3D
17 17 ft fs M 1 53 cabs.ult.d M,fs,ft 3D
17 22 ft fs M 1 53 cabs.ult.ps M,fs,ft 3D
17 16 ft fs M 1 54 cabs.ole.s M,fs,ft 3D

216
8.6. -?è 1 8 Ù MIPS -8ëŒ
L 8.6: Y
31-26 25-21 20-18 17-16 15-11 10-8 7-6 5-0 ®?¶ ¤á ISA
17 17 ft fs M 1 54 cabs.ole.d M,fs,ft 3D
17 22 ft fs M 1 54 cabs.ole.ps M,fs,ft 3D
17 16 ft fs M 1 55 cabs.ule.s M,fs,ft 3D
17 17 ft fs M 1 55 cabs.ule.d M,fs,ft 3D
17 22 ft fs M 1 55 cabs.ule.ps M,fs,ft 3D
17 16 ft fs M 1 56 cabs.sf.s M,fs,ft 3D
17 17 ft fs M 1 56 cabs.sf.d M,fs,ft 3D
17 22 ft fs M 1 56 cabs.sf.ps M,fs,ft 3D
17 22 ft fs M 1 57 cabs.ngle.ps M,fs,ft 3D
17 16 ft fs M 1 58 cabs.seq.s M,fs,ft 3D
17 17 ft fs M 1 58 cabs.seq.d M,fs,ft 3D
17 22 ft fs M 1 58 cabs.seq.ps M,fs,ft 3D
17 16 ft fs M 1 59 cabs.ngl.s M,fs,ft 3D
17 17 ft fs M 1 59 cabs.ngl.d M,fs,ft 3D
17 22 ft fs M 1 59 cabs.ngl.ps M,fs,ft 3D
17 16 ft fs M 1 60 cabs.lt.s M,fs,ft 3D
17 17 ft fs M 1 60 cabs.lt.d M,fs,ft 3D
17 22 ft fs M 1 60 cabs.lt.ps M,fs,ft 3D
17 16 ft fs M 1 61 cabs.nge.s M,fs,ft 3D
17 17 ft fs M 1 61 cabs.nge.d M,fs,ft 3D
17 22 ft fs M 1 61 cabs.nge.ps M,fs,ft 3D
17 16 ft fs M 1 62 cabs.le.s M,fs,ft 3D
17 17 ft fs M 1 62 cabs.le.d M,fs,ft 3D
17 22 ft fs M 1 62 cabs.le.ps M,fs,ft 3D
17 16 ft fs M 1 63 cabs.ngt.s M,fs,ft 3D
17 17 ft fs M 1 63 cabs.ngt.d M,fs,ft 3D
17 22 ft fs M 1 63 cabs.ngt.ps M,fs,ft 3D

18 0 t cs 0 0 mfc2 t,cs
18 1 t cs 0 0 dmfc2 t,cs MIPS64
18 2 t cs 0 0 cfc2 t,cs
18 3 t cs 0 0 mfhc2 t,cs R2
18 4 t cs 0 0 mtc2 t,cs
18 5 t cs 0 0 dmtc2 t,cs MIPS64

217
8.6. -?è 1 8 Ù MIPS -8ëŒ
L 8.6: Y
31-26 25-21 20-18 17-16 15-11 10-8 7-6 5-0 ®?¶ ¤á ISA
18 6 t cs 0 0 ctc2 t,cs
18 7 t cs 0 0 mthc2 t,cs R2

18 8 0 broffset bc2f p
18 8 1 broffset bc2t p
18 8 2 broffset bc2fl p
18 8 3 broffset bc2tl p
19 b t 0 fd 0 lwxc1 fd,t(b)
19 b t 0 fd 1 ldxc1 fd,t(b)
19 b t fs 0 8 swxc1 fd,t(b)
19 b t fs 0 9 sdxc1 fd,t(b)
19 b t hint 0 15 prefx hint,t(b) MIPS64 or R2
19 s ft fs fd 30 alnv.ps fd,fs,ft,s MIPS64 or R2
19 fr ft fs fd 32 madd.s fd,fr,fs,ft
19 fr ft fs fd 33 madd.d fd,fr,fs,ft
19 fr ft fs fd 38 madd.ps fd,fr,fs,ft PS
19 fr ft fs fd 40 msub.s fd,fr,fs,ft
19 fr ft fs fd 41 msub.d fd,fr,fs,ft
19 fr ft fs fd 46 msub.ps fd,fr,fs,ft PS
19 fr ft fs fd 48 nmadd.s fd,fr,fs,ft
19 fr ft fs fd 49 nmadd.d fd,fr,fs,ft
19 fr ft fs fd 54 nmadd.ps fd,fr,fs,ft PS
19 fr ft fs fd 56 nmsub.s fd,fr,fs,ft
19 fr ft fs fd 57 nmsub.d fd,fr,fs,ft
19 fr ft fs fd 62 nmsub.ps fd,fr,fs,ft PS

20 s t broffset beql s,t,p


21 s t broffset bnel s,t,p
22 s 0 broffset blezl s,p
23 s 0 broffset bgtzl s,p

24 s d (signed) const daddi d,s,const MIPS64


25 s d (signed) const daddiu d,s,const MIPS64
26 b t offset ldl t,o(b) MIPS64

218
8.6. -?è 1 8 Ù MIPS -8ëŒ
L 8.6: Y
31-26 25-21 20-18 17-16 15-11 10-8 7-6 5-0 ®?¶ ¤á ISA
27 b t offset ldr t,o(b) MIPS64

28 s t 0 0 0 madd s,t
28 s t d 0 0 madd d,s,t R3900
28 s t 0 0 1 maddu s,t
28 s t d 0 2 mul d,s,t
28 s t 0 0 4 msub s,t
28 s t 0 0 5 msubu s,t

28 s s d 0 32 clz d,s
28 s s d 0 33 clo d,s
28 s s d 0 36 dclz d,s
28 s s d 0 37 dclo d,s

28 code 32 sdbbp code EJTAG

29 target jalx target MIPS16e


31 s t sz pos 0 ext t,s,pos,sz R2
31 s t sz pos 1 dextm t,s,pos,sz MIP64R2
31 s t sz pos 2 dextu t,s,pos,sz MIP64R2
31 s t sz pos 3 dext t,s,pos,sz MIP64R2
31 s t sz pos 4 ins t,s,pos,sz R2
31 s t sz pos 5 dinsm t,s,pos,sz MIP64R2
31 s t sz pos 6 dinsu t,s,pos,sz MIP64R2
31 s t sz pos 7 dins t,s,pos,sz MIP64R2
31 0 t d 2 32 wsbh d,t R2
31 0 t d 16 32 seb d,t R2
31 0 t d 24 32 seh d,t R2
31 0 t d 2 36 dsbh d,t MIPS64R2
31 0 t d 5 36 dshd d,t MIPS64R2

31 0 t hwr 0 59 rdhwr t,hwr R2

32 b t offset lb t,o(b)

219
8.6. -?è 1 8 Ù MIPS -8ëŒ
L 8.6: Y
31-26 25-21 20-18 17-16 15-11 10-8 7-6 5-0 ®?¶ ¤á ISA
33 b t offset lh t,o(b)
34 b t offset lwl t,o(b)
35 b t offset lw t,o(b)
36 b t offset lbu t,o(b)
37 b t offset lhu t,o(b)
38 b t offset lwr t,o(b)
39 b t offset lwu t,o(b) MIPS64
40 b t offset sb t,o(b)
41 b t offset sh t,o(b)
42 b t offset swl t,o(b)
43 b t offset sw t,o(b)
44 b t offset sdl t,o(b) MIPS64
45 b t offset sdr t,o(b) MIPS64
46 b t offset swr t,o(b)

47 b op offset cache op,o(b)


48 b t offset ll t,o(b)
49 b ft offset l.s t,o(b)
50 b cd offset lwc2 cd,o(b)
51 b hint offset pref hint,o(b)
52 b t offset lld t,o(b) MIPS64
53 b ft offset l.d ft,o(b)
54 b cd offset ldc2 cd,o(b)
55 b t offset ld t,o(b) MIPS64
56 b t offset sc t,o(b)
57 b ft offset s.s ft,o(b)
57 b ft offset swc1 ft,o(b)
58 b cs offset swc2 cs,o(b)
60 b t offset scd t,o(b) MIPS64
61 b ft offset s.d ft,o(b)
61 b ft offset sdc1 ft,o(b)
62 b cs offset sdc2 cs,o(b)
63 b t offset sd t,o(b) MIPS64

220
8.7. -UõU©a 1 8 Ù MIPS -8ëŒ
8.6.2 -?èLA:5º
• -O¶µŒõꜹe§·‚éӘ-3˜‡ÏPΧ´ó
¬k~ "” nop Ú l.s ù-´XdÊH§±–u)?5'Ž
ч {ü"
• ?nì-µQ²½ÂL´y3Ø^-˜Ø "?n
ì 3 3 MIPS I CPU ¥l5v^L§ Ú MIPS32/64 2:üØo
N——Ù¥k ®£Â^uØÓ^å ¬¤IO?nìöŠè§Ù
¥);ì\13S"
8.6.3 ?èÚ{ü¢y
XJ\w˜e-?è§kžŒ±wÑ CPU ´NO"¦+kˆ«
ØÓ?è§36Y‚é@ÏÒI‡±˜«š~k5Ɛª?è"
• Mìo´ uÓ ˜§¤± CPU Œ±lêMì³Ñü‡
öŠê ÃI^‡Èè"3, -¥§ü‡MìÑØI‡§´Q,
Mì³O5Ò´ 3z‡ž¨±ÏþJøü‡ öŠê§vk
Ÿo›”"
• 16 ~êo´ uÓ ˜§#N·- †x? ALU Ñ
\ÀJì Ø^^‡£ "
8.7 -UõU©a
·‚U±e^Sr-8©¤ ÜnŒ¬µ
• ˜öŠ No-op

• Mì/MìDѵ^é2§XJŽØþ :{¶)^‡Dx3S

• ~ê\1µŠêŠÚ/Œ.á=ê

• Žâ/Ü6-

• ê¦{!Ø{Ú¦{ê

• ê¦\

• \1Ú;

• a=!f§SN^Ú©|

• ä:Úg€

221
8.7. -UõU©a 1 8 Ù MIPS -8ëŒ
• CP0 õUµCPU ››-
• 2:
• ^reé“/e”A5Ɂ–¯µrdhwr Ú synci

8.7.1 ˜öŠ
-8˜öŠ nop éõ§Ï?Û± zero 8I-ÑØ
nop: MIPS
‰?Û¯œ"~^˜‡´ sll zero, zero, 0§Ù?›?èTЏ"
i"
ssnop: , ˜‡˜öŠ§Ù?èÒ´ sll zero, zero, 1"
ù‡-؆٧-Ӟux§ùÒy Ù$1‡s¤–˜‡
±Ïžm"ù3{ü6Y‚ CPU þÃ';‡§3E, ¢yþéu¢
yr›?§òžék^"
8.7.2 Mì/MìDx
Ï~^‹ $zero Mì or 5¢y"˜ ‡O CPU ——du,«
move:
Ïé\{|±'éÜ6$ŽÐ——^ addu"
^‡Dx
éu~©|k^O“-£ë„1 8.5.3¤"
movf, movt: ÏLÿÁ2:^‡è3êMì?1^‡Dx"
movn, movz: Šâ,˜‡MìGéêMì?1^‡Dx"

8.7.3 ~ê\1
! ^5\1§S¥, ‘IÒ ˜½Cþ/Œ÷-"^
dla la:
64 ž£k3Œ. Unix ƒaXÚ¥â¬^¤\‡ dla Ò "
ù -ÉÚ¤kÙ§ load Ú store Óόª£¦+(¢‡¦ØÓ
Àܤ"
dli!li: C\á=ê~ê"dli ´ 64 ‡§¿Ø´¤kóäóÑ|±§
3\1Œ±–u 32 CØeÃÎÒêžÿâI‡"ù´˜‡÷-§Š
âäN~êŒÐm¤A^-"
lui: rá=ê\1Mìp "16 ~ê\1Mì1 16–31 §
32–63 £XJk{¤˜†1 31 ƒÓ§$ 0–15 ˜""T-´\1
?¿ 32 ~ê˜éÅì-¥˜‡"®?§S ŒU[ج†ù‡
-¶ d li (load immediate) Ú la (load address) ƒa÷-¦^§Ì‡
´^u¢yˆ«k^όª"
222
8.7. -UõU©a 1 8 Ù MIPS -8ëŒ
8.7.4 Žâ/Ü6$Ž
Žâ/Ü6$Ž-?˜ÚŒ±©)ea.µ
\{
add!addi!dadd!daddi: addu -é)œ/ª§(JÄў¬
g€"ŒUéu COBOL ?Èìk^"
addu!addiu!daddu!daddiu: ©O^u 32 Ú 64 \{"3ùp±
9‡-8¥§64 ‡-mÞ^“d”£L« doubleword¤L«¶„k\
ÃI½“á=”ÏPΗ—‡‰®?옇~êÒ1 "XJ\‡~ê^
- 16 L«Øe§@o®?ìò)¤˜-"
dsub!sub: Äўg€~{CN"
dsubu!subu: ~5 64- Ú 32- ~{£vk~á=ê-§,´
Ϗ\{¥á=ꌱKŠ¤"
Ù§Žâ-
abs!dabs: ý銶Ðm˜Ú©|£½^‡DxXJk{¤-"
dneg!neg!dnegu!negu: ü8§ƒ‡ê¶Ø‘ U ÏPÎÄў¬g
€"
Å Ü6öŠ-
and!andi!or!ori!xor!xori!nor: nöŠêÅ Ü6öŠ"Ø^“á
=ê” a.——‰˜‡~êöŠêžÿ§®?ì¬gÄ)¤"5¿vk nori
-"
not: ^ nor ¢yVöŠê-"

£ Ú̂£
drol!dror!rol!ror: ̂m£½†£¶Ðm¤o^-S"
dsll!dsll32!dsllv: 64 £Vi¤†£§$ Ö""n‡ØӍ-Jøn«
½£ þØӐªµ~ê 0–31 §~ê 32–63 §½ö^,˜‡Mì$ 6
SN"®?§S ‡ dsll ÏPÎÒ1 "
dsra!dsra32!dsrav: 64 £Vi¤Žâm£"¡“Žâ”´r 63
——ÎÒ ——E›p "@Ò´`^ukÎÒ 64 êž(¢y
ر 2 ˜"?§žo´ dsra ÏPζ®?쬊⍽£ þÀJ
-‚ª"
dsrl!dsrl32!dsrlv: 64 £Vi¤Ü6m£"ù‡¡“Ü6”´Ïr 0
W¿p ",kn‡ØӍ-§®?§S [Aæ^ dsrl ù‡ÏP
ζ®?쬊⍽£ þÀJ-‚ª"
223
8.7. -UõU©a 1 8 Ù MIPS -8ëŒ
! †£"\‡ sll ÏPÎÒ1 "
sll sllv: 32
sra!srav: Žâm££^ÎÒ Öàp ¤"‡ sra Ò1 "
srl, srlv: Ü6m££p ^ 0 Öà¤"‡ srl Ò1 "

^‡˜-
slt!slti!sltiu!sltu: M‡-§XJ^‡÷vÒ‡ 1 §ÄK‡ 0"
‡ slt ½ö sltu"
seq!sge!sgeu!sgt!sgtu!sle!sleu!sne: Šâ\E,^‡˜8
IöŠê÷-"
8.7.5 ê¦{!Ø{Ú¦{ê
ê¦ØÅì-ØÓuÊύ-§Ï MIPS ¦{촘‡Õá
ü§vk8¤?~6Y‚¥§‰1å5'~ê-‡s¤õ
žm"k˜ Åì-5éĦ{½öØ{§, ¦Ø$ŽÒÚ U-¿1
?1"
Ә‡¦{üJøê¦\\Ú¦\ƒ-£ë„1 8.7.6 !¤"
^üÕM‡?1?n˜‡(JÒ´§¦Ø-¿Ø)ÄÑÚØ"ÿ
Á£ÏÉÚ$1ØU)É~¤ Ï~Ør(J?Ï^M죆 Y
-¿M쳬r6Y‚E,z¤"¦{/Ø{(JÑy3ü‡üÕM
ì hi Ú lo ¥"\U^ü^Aύ- mfhi Ú mflo 5–¯ù Š"=¦3
@Ï MIPS CPU ¥§(JM쏴p£µXJ\Áã3(JÑ5ƒc
Ö§CPU Ò¬Êe5–êâˆ"
´§\ÖÏ~¦{/Ø{®?ÏPΞÿ§®?ì¬)¤˜‡
-S5[˜‡nöŠê-¿?1ÄÑu"˜^ div £kÎÒêØ{¤
ŒUÐm¤ 13 ^-" -Ï~˜um©Ø{öŠ div ÚJ(J
 mflo ƒm" -wþÇØp§´§‚ÚM‡Ø{ì´¿1$1
¶3Œõê MIPS CPU þØ{$Ž‡s¤ 7–75 ‡±Ï"
MIPS úi®?ì¬r¦±˜‡~ê½Ø± 2 ~êg˜OŽ=†¤
·£ !ùè"´Œõêóäó¥®?ìŒUrù‡?Ö3‰
?Èì‰"
U옇زw½§žÿ±Mì zero Š(J¦{½Ø{
ò)¤©Åì-" d l hi ½ lo ¥Ñ(J¿?17‡u§Ò´
5

\¯ "
e¡´¦Ø-L"
k óä‡)ºAÏÏPΧmult L«¦{§divd L«Ø{Åì-", §½ zero
5

Š(JMì‰{,Û%§´u£‡"

224
8.7. -UõU©a 1 8 Ù MIPS -8ëŒ
! ! ! êØ{nöŠê÷-§‘k 64-/32- Ú
ddiv ddivu div divu:
kÎÒ/ÃÎÒÀ‘"3ر"žÿѬg€¶kÎҍ-Äў¬g€"
^ zero Š8IMìÒéÄØ{Åì-"
ddivd!ddivdu!divd!divdu: k, óäóJø©Åì-ÏP
Î"Ð^ ddiv zero, ..."
divo!divou: ‘ÄÑuØ{¶i§¢SþÚ¤ div!divu ´˜
"
dmul!mul: nöŠê 64-/32- ¦{-"vkÄÑu¶Ï ØI‡T
÷-ÃÎ҇——ä(JéukÎÒÚÃÎÒ)ºÑ´˜"®
?ìXJ3 MIPS32 ƒc™¢yù - CPU 3®?{§ò¬Ð
m¤d÷"
mulo!mulou!dmulo!dmulou: ¦{÷-§XJ(J‡Ñ˜‡Ï^M
ìU NB‰ŒÒ¬g€"
dmult!dmultu!mult!multu: m©¦{Åì-§kÎÒÚÃÎÒ
±9 32 Ú 64 CN"(Jl5جÄѧϏ©Ok 64 Ú 128 (
J"(J$k ˜3 lo ¥§pk Ü©˜3 hi ¥"
drem!dremu!rem!remu: {êöŠ§ÏL3Ø{ ˜^ mfhi ¢y"
{ê3 hi Mì¥"
mfhi!mflo!mthi!mtlo: l hi MìDÑêâ"ù ´–¯ê¦
Øü(JMì hi Ú lo -"XJ\j±¦^gCJ(Jܤ-
mul Ú div§@o~“è¥\ØI‡ mflo/mfhi -"
MIPS ê¦{§mult ½ multu§o´)¤Ï^MìV°Ý(J§
žØ ÄÑŒU5"(J¥ƒuMì°Ýp Ú$ Ü©©O3 hi Ú
lo ¥ˆ£"
Ø{öŠò(J˜\ lo Mì§ê{ê˜\ hi"mthi Ú mtlo k3É
~ƒ ¡E CPU Gžÿâ^"
8.7.6 ꦣ\¤\
k MIPS CPU kˆ«/ªê¦\\-——-vk˜^áu MIPS
IO-8"ù -ÑÉü‡Ï^M슏 öŠê§r(J\\
lo Ú hi ¥"†Ï~˜§“u”“LÃÎÒCN§Ødƒ ÏPΣ„k-
“è¤ÑdäN CPU ¢yû½"
dmadd16!madd16: NEC Vr4100 Ak-§ù CNÏLÉ 16
öŠê¼ „ݧ›3 C ?È쥦^"dmadd16 3 64  lo M
ì¥\\ 64 (J"
mad!madu: Toshiba  R3900!IDT  R4640/4650 Ú QED  CPU ¥
Œ„ù -§§‚Éü‡ 32 öŠê§r\\ 64 (J˜3 lo

225
8.7. -UõU©a 1 8 Ù MIPS -8ëŒ
Ú hi Mì¥"Toshiba R3900 „#NnöŠê‡ mad d,s,t§Ù¥\\
(J„DÑÏ^Mì d ¥"
8.7.7 \1Ú;
!Ѥk®?ê\1/;-§±9٧όSöŠ"±
eA:‡Úå5¿µ
• éu¤|±ØÓêâ°ÝkØӍ-µ8 £i!¤!16 £Œ
i¤!32 £i¤Ú 64 £Vi¤"
• éuuÅìMì°Ýêâa.§Œ±ÀJ"*УcM“u”“LÃ
ÎÒ¤½öÎÒ*ÐöŠ"
• ùpѤköŠÑŒ±¤®?ì|±?¿ÏŒª£ë„1 9.4
!¤"
• ;-Öžÿk Mì§, /ŒMì§Ú\1-Š
{±˜—¶ù:‹» MIPS -¥8IMì3k˜„5K"
• Åì\1-‡¦êâg,é࣌iéàüi!>.§iéàoi
!>.§Viéàli!>.¤"´®?ì|±˜@\1ŒU™é
àêâ÷-§ù -Ñk˜‡“u”cM£“L unaligned¤"
¤k(²IO C §S˜Ü©êâ(Ѭ(éà"´\ŒU-
3$1žOŽ/Œ™éàêâ!æ^šIOŠó*Ð(²êâ!
l Ü©‡Ö\êâ"
• z‡\1-G(JÑ'OŽ-36Y‚¥–˜‡±Ï"éu?
Û MIPS CPU §ÏL^˜^k^vk6-W¿ò´øѬ4
ǁŒz"
3P£MIPS I¤CPU þ‡¦§S 3z^\1-ƒ y˜‡ž
¨±Ïò´µ@£ MIPS I CPU ®?ì7‡ž¬ÏL\˜^ nop
-gĉù˜:"
e¡´˜‡-L"
lb!lbu: \1i!, ©OÎÒ*нö"*ЇMì"
ld: \1Vi£64 ¤"ù^Åì-3 64 CPU þâk§´é 32
8I®?ì~~^˜‡l;ì\1 64 ü‡ƒêMì÷
-5¢y"ùŒV´˜‡›v Ì¿§´k<Ò´Ž‡,«oN5"
ldl!ldr!lwl!lwr!sdl!sdr!swl!swr: •†/•m!\1/;!i/Vi
‡"¤é¦^Œ±– ulw ˜¢yšéà\1/;öŠ§,\oŒ±
gC5¢yšéà\1/;£ë„1 8.5.1 !¤"
226
8.7. -UõU©a 1 8 Ù MIPS -8ëŒ
\1Œi£16 ¤§, ©OÎÒ*н"*ЇMì"
lh, lhu:
ll!lld!sc!scd: ë£\1Ú^‡;£32 Ú 64 ‡¤¶^u&Òþ
Û%-£ë„1 8.5.2 !¤"
lw!lwu: \1i£32 ¤§, ©OÎÒ*н"*ЇMì"lwu
3 64 CPU þâk"
pref!prefx: ýêâp„ £„1 8.5.8 !¤"ù^-3 MIPS III
ڍ@ CPU þvk§ŒU˜öŠ"¦+ pref ^´Ï~όª§´
prefx \þ 3ü‡-¥¢yMì+Mìόª"
sb: ;i!£8 ¤"
sd: ;Vi£64 ¤"3 32 CPU þŒU´˜‡÷£rü‡ƒê
Mì;˜‡ 64 S/Œ¤"
sh: ;Œi£16 ¤"
sw: ;i£32 ¤"
uld!ulh!ulhu!ulw!usd!ush!usw: ™éà\1/;÷-"Vi
Úi‡æ^AÏ•†•m\1÷-¢y¶ŒiöŠ^i!!£
Ú or 5¢y"5¿~ò´ø5K¿Ø·^u¤™éàöŠ•†/•
m\1¶6Y‚O4§‚UlÞ—"1 2.5.2 !éšéà\19Ù¦
^kõ£ã"
2:\1Ú;
l.d!l.s!s.d!s.s: \1/;V°Ý£64 ‚ª¤Úü°Ý£32 ‚
ª¤"öŠê7Léà§ùpvk‰Ñšéà‡"3 32 CPU þ§l.d
Ú s.d \1ü‡ 32 S¬ƒ FP Mì½ö;ƒü‡
FP Mìü‡ 32 S¬£„1 7.5 !¤÷-"ù -‰
ldc1!lwc1!sdc1!swc1(load/store word/double ?nì 1)§؇ù
"
ldsc1!lwxc1!sdxc1!swxc1: æ^ČMì+ £þ όª\
1Ú;"3- ldxc1 fd, i(b) ¥§/Œ7L uÚČMì b 
•Ә¬§S;«§ÄKŒU¬€¯"
XJ\óäóÉ l.d fd, i(b) ùŠ{§@҆^j"
8.7.8 a=!f§SN^Ú©|
NX(éù -æ^Xe Motorala ·¶{µ
MIPS

• PC-ƒéό-¡“©|”§ýé/Œ-¡“a=”"öŠÏPÎ
©O± b Ú j mÞ"
• f§SN^“a=¿ó”½“©|¿ó”§ÏPα al (—"

227
8.7. -UõU©a 1 8 Ù MIPS -8ëŒ
¤k©|-§$–©|¿ó-§Ñ´k^‡§ÿÁ˜‡½ö

ü‡Mì"Ã^‡‡Œ±éN´ܤ——'X§ beq $0, $0,
label"

j: ù^-r››Ã^‡=£˜‡ýé/Œ"¢Sþ§j ¿ØNo+n 32
/Œµ8I/Œp 4 ¿Ø´-‰Ñ§ ´^c PC p 4 Š"
ŒõêžÿùvõŒ'X¶28 /ŒE,‰ÑŒ 256 MB “èŒ"
‡/§‡/Ïu jr£Mìa=¤-§T-^ua=8
II‡OŽœ/"žÿŒ±˜‡ j ÏPÎژ‡M짴61
‰{Øù"
jal!jalr: ù ¢y †Úmf§SN^"3a=½/ŒÓ
ž§„‡ˆ£/Œ£T-/Œ\þ 8¤Mì ra§= $31 O¶"  6

Ÿo‰§SOêì\þ 8ºPa=-Ú©|-˜§o´‰1;‹3 ¡
©|ò´ø-§¤±ˆ£/Œ7L©|ò´øƒ -"f§Sˆ£
ÏLMìa=¤§~^Ò´ jr ra"
PC-ƒéόf§SN^Œ±¦^ bal!bgezal Ú bltzal -"^‡
©|¿ó-=¦3^‡†Øžÿrˆ£/Œ\ ra§ù3^c-
/Œ?1OŽžÿk^"
b: ƒé PC Ã^‡£´ƒé᧤©|"
bal: ƒé PC ¼êN^"
bc0f!bc0f1!bc0t!bc0t1!bc2f!bc2fl!bc2t!bc2t1: Šâ?nì 0
Ú?nì 2 ^‡ ?1©|§ùü‡^‡ 3Œõêy“ CPU þÑØ
3"3Pª CPU þ§ù -ÿÁ˜‡Ñ\Ú &Ò"
bc1f!bc1f1!bc1t!bc1t1: Šâ2:^‡ £ 5 CPU kõ‡2:^
‡ ¤©|"
beq!beq1!beqz!beqz1!bge!bge1!bgeu!bgeul!bgez!bgez1!bgt!
bgt1!bgtu!bgtu1!ngtz!bgtz1!ble!ble1!bleu!bleul!blez! blez1!
blt! blt1! bltu!bltu1!bltz!tltzl!bne! bnel! bnez! bnez1: ÜVö
Šê½öüöŠê'©|-L§Œõê÷-"
bgezal!bgezall!bltzal!bltzall: ^‡¼êN^©Åì-§XJk
ŒUI‡ù‰{"
8.7.9 ä:Úg€
break: —˜‡“ä:”a.É~"dNÁì3®?ìܤ“èÚug
€¥^"
sdbbp: Úu1 12.1 !ùã EJTAG É~ä:-"
¢Sþ jalr -#N\½˜‡Ø´ $31 M숣/Œ§éù^"XJ\؍
6

½®?ì¬gÄ^ $31"

228
8.7. -UõU©a 1 8 Ù MIPS -8ëŒ
Úu˜‡DÚþ^uXÚN^É~a."
syscall:
teq!teqi!tge!tgei!tgeiu!tgeu!tlt!tlti!tltiu!tltu!tne!tnei: ^
‡É~§Šâˆ«ü!VöŠê^‡"ù‡´‰?ÈìÚ)ºì^§Ž‡¢
y$1žê|>.uƒaöŠ"
8.7.10 CP0 õUµCPU ››-
CP0 õUŒ±©¤±eA«a.µ
êâDx
cfc0!ctc0: rêâ£?£Ñ CP0 ››Mì§8cŽ MIPS CPU
фvkù››Mì"´ØÈ ˜UNÒk ùMì"
mfc0!mtc0!dmfc0!dmtc0: 3 CP0 MìÚÏ^MìƒmDxê
â"
cfc2!ctc2!dmfc2!dmtc2!mfc2!mtc2: ?nì 2 £XJ¢y 
{¤-"é„"
^u CPU ››Aύ-
eret: lÉ~ˆ££„1 5 Ù¤"
dret: lÉ~ˆ££R6000 ‡¤"ù^-®Lž§ÖØ2Kã"
rfe: 5g MIPS I É~(å-——¢Sþ®²Lž"-<ÐÛ´§rfe
==¡EGMì§ÏL˜ur››=£­#m©/Œ˜^ jr -
©|ò´øS5‰1"
cache: 1 4.9 !ùõ«/ªp„ ››-"
sync: éuŒUÏS‰1 load/store  CPU S–¯?1Óڍ
-£„1 8.5.9 !¤"†!ùÙ§-ØÓ§§vk¦^ CP0 -?è§3^
r§S¥Œ±Ü{¦^"
tlbp!tlbr!tlbwi!tlbwr: ›› TLB =;ì/Œ=†M‡-£„1
6.3 !¤"
standby!suspend: ?\Ž>ª£NEC Vr4100 CPU¤"

8.7.11 2:-
31 8.3 !Ñ 2:-"
8.7.12 ^reé“/e”A5k–¯
#N^rA?§SÖ˜ Ï~kS
rdhwr(read hardware register):
Ø⌄M‡&E"„1 8.5.12 !"
229
8.7. -UõU©a 1 8 Ù MIPS -8ëŒ
^rA?-"– load/store -˜½˜‡/Œ§Š^u˜
synci:
‡¹όi!p„ 1ŒS¬þ"\‘ ‡‰1-ž
^§"synci ‰17‡öŠ£~~¿›Xl L1 ˜?êâp„  D-cache 
£§±9Š¢?Ûkc®²?\-p„  I-cache SN¤§y CPU U
(‰1§Skc\ù¬S-"
sync: “o-§3ùp‘3rN§Ø´˜^Ø%A?-"T
-31 8.5.9 !ùL"

230
1 9 Ù Ö MIPS ®?Šó“è
ù˜ÙòwŠ\XÛÖ MIPS ®?“è——äN/`§Ò´ GNU ®
?ì as  MIPS ‡¤®?“è§Ïù´8c^2 MIPS ®?
ì"
Ϗ3ùp==´˜‡0 §·‚òÄg MIPS I ½ MIPS II ±5õc
˜†Š ISA ˜Ü©~„ 32 -"
Ù¿Ø\N?®?§S“è——ù‡K8Ҍ±2˜Ö
"ýŒõêÖöéŒUÜ^ C ?§§´ó¬-˜ y®?§
S‡Uwç½ö‡‰?U¶XJ\é MIPS ®?¦^؎ù‡
§Ý§\I‡֊‘\ MIPS óäó© "
ÆSÖ MIPS ®?==ÙGÅì-L´Ø "ù̇´Ï±e
A‡Ï:
• MIPS ®?ìJø Œþý½Â÷-§¤±?Èì-8‡'¢
SÅì-8Œõ"þ˜ÙL) GNU óäó®?ì@£
Ü÷-§ „k CPU M‡U †@£Åì-"
1

• MIPS ®?“茱£OÚ)º˜|^5+n®?“è1!¡®
?“«”½“–öŠ”AÏ' i"~X§^AÏ' i5I“§S
¼ê“èm©Ú(å!››-ü^S!±9››é“è`z
"
• ¢SA^¥§§S <®?“è ‡²L C Šóý?nì?n
§âJ‰®?ì§ùA´Ï^‰{£¦+Ø´M5r›¤"¦
^{§Œ±Ñäk4pŒÖ5®? “è§Ù¥–ÅìMì
ƒaÀ܌±^é§S k¿Â¶i5Ú^¶rù ¶i=†¤®?
쇦J±ÖÃ/ª?ցÐ3‰óäó"
Nõ§S uy„Ìù˜‡{ü½¬éBµŠ C Šóý?nìÑ
\®? “詇¶‘k M“.S”§ý?n )¤Ñч‰˜
1–´d MIPS úi‘o®?ì– 2005 cg‡¤@£÷-§ŒU'žúm
]‡@˜ "

231
9.1. ˜‡{ü~f 1 9 Ù Ö MIPS ®?Šó“è
‡Ó©‡¶´ M“.s”"¶ù¦+nü«ØÓ/ª®?
©‡?֍\N´"
3?˜Úփc§k£Þ§S˜e1ÙSNék^§). Åì
-8!êâa.!όªÚDÚMì^{"=¦\®²é@ áéÙG
§3@p \˜‡Ö\„k^"ù·‚UY cwžÿ§\Œ±
éN´€£"
9.1 ˜‡{ü~f
·‚„´÷^31 8 ل@‡~fµC Šó¥¼ê strcmp(1) ˜‡
¢y"ØLù˜g·‚‡)®?Š{Ĥ©§¿ ‰Ñ˜ Ãó`zÚN
Ý“è"ùp‰ÑŽ{'© strcmp() ¼ê‡h²˜ ¶·‚le¡
“èm©——E,^ C ——^˜«¤k$ŽÎÑ©m±Buöp/ª§“
èXeµ
strcmp(char* a0, char* a1)
{
char t0, t1;
while(1) {
t0 = a0[0];
a0 += 1;
t1 = a1[0];
a1 += 1;
if (t0 == 0)
break;
if (t0 != t1)
break;
}
return (t0 - t1);
}

ùãЩ/ª“è‰1žm¬ÏÑy3zĝ¥ü‡^‡©
|£éAuü‡ if() Šé¤Úü‡\1£éAuügê|eIöŠ¤ ÉK¶
zg©|Ú\1ÑÚ\˜‡ò´ø§ ̂N¥vkv óŠ5W÷§‚"d
§“è÷X˜éiÎG?1ž§3zéi!'£éAu while() Šé(
åŒ)Ò¤žÑk˜‡r›̂(—©|"
=¦3€È¤®?Šóƒc§·‚Œ±éù‡“èŠk^U?"Œ
UC´Ðm̂4zĝŒ±Šüg'¶·‚Œ±rÙ¥˜g\1£
̂(—"ÏLù Cz§zg\1Ú©|ò´øь±Wþk^óŠµ
232
9.1. ˜‡{ü~f 1 9 Ù Ö MIPS ®?Šó“è
int strcmp (char *a0, char *a1) {
char t0, t1, t2;

/* first load moved to loop end,


so load for first iteration here */
t0 = a0[0];

while (1) {
/* first byte */
t1 = a1[0];
if (t0 == 0)
break;
a0 += 2;
if (t0 != t1)
break;

/* second byte */
t2 = a0[-1]; /* we already incremented a0 */
t1 = a1[1]; /* didn’t increment a1 yet */

if (t2 == 0)
/* label t21 in assembler */
return t2 - t1;

a1 += 2
if (t1 != t2)
/* label t21 in assembler */
return t0 = a0[0];
t0 = a0[0];
}
/* label t01 in assembler */
return t0 - t1;
}

·‚®²l“襞 ̇$“è§y34·‚r§€È¤ MIPS


®?µ
#include <mips/asm.h>
#include <mips/regdef.h>

LEAF(strcmp)

233
9.1. ˜‡{ü~f 1 9 Ù Ö MIPS ®?Šó“è
.set noreorder
lbu t0, 0(a0)
1: lbu t1, 0(a1)
beq t0, zero, .t01 # load delay slot
addu a0, a0, 2 # branch delay slot
bne t0, t1, .t01
lbu t2, -1(a0) # branch delay slot
lbu t1, 1(a1) # load delay slot
beq t2, zero, .t21
addu a1, a1, 2 # branch delay slot
beq t2, t1, 1b
lbu t0, 0(a0) # branch delay slot

.t21: j ra
subu v0, t2, t1 # branch delay slot

.t01: j ra
subu v0, t0, t1 # branch delay slot
.set reorder
END(strcmp)

þ~¥5ºÏ`²-Nݐ{¶´3?˜Ú[wƒc§·‚A
)º˜eþ~¥ÑyNõ#Š{("4·‚UìÑy^SŇ)ºµ
• #include: T©‡|^ C Šóý?nì cpp 5‰~þå‡k¿Â¶
i§¿½Â˜ {ü©O†÷"ùp§3r“èJ‰®?ìƒc§
^ cpp rü‡Þ©‡Si\®?“è"mips/asm.h ½Â LEAF Ú END
£„e©¤§mips/regdef.h ½Â t0 Ú a1 MìS.¶¡§Œë
1 2.2.1 !"
• ÷µùp·‚^ mips/asm.h ¥½Âü‡÷µLEAF Ú END" LEAF
½ÂXeµ
#define LEAF(name) \
.text; \
.globl name; \
.ent name; \
name:

^5½Â˜‡{ü~§£ØN^Ù§~§§Ï ?u‡N^
LEAF
ä/“f0 ˜——ë„1 11.2.9 !¤"š“f£nonleaf¤¼ê7Lõ‰
éõ¯œ5Mì!ˆ£/Œ"ؚ\94AÏ?§§
ÄKØŒU-I‡^®?Šóš“f¼êœ¹——AŒ±’
234
9.1. ˜‡{ü~f 1 9 Ù Ö MIPS ®?Šó“è
½^ C Šóù«¼êk¿Â§½N2d C ŠóN^˜‡µCýI
‡^®?“è“f¼ê"5¿e¡A:µ
- .text wŠ®?ì§Øš,k`²§Ard )“膘?
8I©‡¥¶/.text0«¥¶l C Šó?È)¤8I©‡^Ó
˜‡¶iL«NB¤k“è«"
- .globl (²/name0ÛCþ§TCþ¶‡)3¬ÎÒL
S§ ¶i3‡§S‰ŒS7L´˜"ù‡aqu C ?Èì
é¼ê¶£XJؑ static ?»Î¤?n"
- .ent é)¤“èvkK§´wŠ®?ìòù˜:I“/name0
¼êå©:§3NÁP¹¥^T&E"
- .name 3®?ìÑÑ¥T:Jø˜‡¶/name0IҧӞ
é/name0¼êN^lT/Œm©"
END q½Â ü‡®?‘"

#define END(name) \
.size name, .-name; \
.end name

L«3ÎÒL¥§/name0Ú¤^-i!ê˜Ñ"
- .size
- .end Ñ¼ê(—§^uNÁ"

• .set ®?«µ
^5wŠ®?ìN?1®?""Žž§MIPS ®?ìÁãÏL£ÄNC
-¦þW¿©|Ú\1ò´ø£žØ‡ú%——®?ìýéج‰
ØSN¶XJéØSY§Ò¬±ò´øØĤ"Œõêž
ÿ§ù«1´k^§Ïu`\3®?§SžÿØ7ÄW¿
ò´ø"
´XJ·‚(I‡°(››-^SžNo§Ò”3Nõ^4
ª„¥¼ê˜aœ/ºùÒ´ .set noreorder 8µwŠ®?ì3
eg-ƒéA .set reorder ƒcʎ­#üS"
3ù˜é®?«ƒmŒ“諍§·‚wŠ®?ìr)öŠè
Uì3 “襍-ÖgS?8I©‡"
• IÒµ /1:0´êiIÒ§Œõê®?ìÑɧŠÛÜIÒ"3˜‡§
Sp\Œ±k?¿õ‡IÒя‰/1:0¶^/1f(forward)0Ú^e˜‡
IÒ/1:0¶^/1b(backward)05Ú^þ˜‡/1:0"ù:š~k^"

235
9.2. Š{V‡ 1 9 Ù Ö MIPS ®?Šó“è
• -µ\ŒU5¿˜ -^S¬Ñý§Ï .set noreorder ù
˜«³ e¡©|ò´ø§3‰·‚£ Ǥ5yff\1
êâجá=e˜^-^"
'X`§3Ðm̂ ŒÜ©éMì t2 ¦^"7L‡^1‡M
ì§Ï lbu t2 -1(a0) uc˜^©|-ò´øS§Ï ØUU
 t0 ——XJu)©|§©|8I?“è‡^ t0 ¥Š"
9.2 Š{V‡
L ˜Hc¡~f4\w Œõꭇ®?-3¢S¥´N¦
^§Aé\S.®?Šó “詇Ö MIPS -ªk¤Ï"y
3·‚‡XÚ/o(˜eù ÀÜ"XJ\±c^Laq Unix XÚþ®
?ì§@ȯVgATÑØ))"
9.2.1 ÙÛ!½.ÎÚI£Î
‡ )ù:§\ÄkÙG C Šó"Ö®?“èžÿ‡5¿e¡A

• ®?“è±1ü §†1L«˜‡-½«(å"\Œ±3˜1
põ^-½«§´§‚¥m‡^©Ò/;0 m"
• l/#01—ƒmSN5º§®?ìòѧ"؇r/#0˜3
1†µC ý?nì cpp éù1‡AÏ?n§N´—· §
\ŒU¬^cpp"XJ(½\“謲L C ý?nìý?n§@o
Œ±3\®?“襦^ C º‚5ºªµ/*,*/"‡\W¿§ù
«5ºŒ±ªõ1"
• IÒÚCþ¶iŒ±´ C Šóp?¿Ü{I£Î§Óž„Œ±Œ±
¹iÎ/$0Ú/.0"
• 3“è¥\Œ±¦^˜‡ê£0  99 ƒm›?›ê¤ŠIÒ"~5
©IÒ3©‡¥7L˜§´Ó˜‡êiIҌ±3“襭E¦^
?¿õg"3©|-¥/1f0•e˜‡/1:0§ /1b0•c˜‡/1:0
IÒ"ùÒØ^¤%@ éáa=Ú̂å¶i "r^¶i·¶
IÒ3‰f§S\:½öAOa="
• rïÆ\¦^L 2.1 ¥Ñ MIPS MìS.·¶¶d§\
“è7L²L C ý?nì?1ý?n§ “襇^ #include ¹˜‡
Þ©‡§¶iŒU´ mips/regdef.h"XJ\û½Ø^ý?nì§P4®
?쇦Mì¶i¤{ÎÒ\þêi/ª§'X $3 “LÏ^
Mì 3§Ï^Mì?Òl 0  31"
236
9.3. -˜„5K 1 9 Ù Ö MIPS ®?Šó“è
• vkÚ C Šó¥“”†éAöŠ"®?ìI‡˜‡Œ
Šž§^/Œ5“˜‡IÒ£½öÙ§Œ­½ ÎÒ¤"I£Î/.0“
Lc-½öêâ(²/Œ"\$–Œ±éù À܉ k$Ž
öŠ"
• iÎÚiÎG~ê½Âª† C ƒÓ"

9.3 -˜„5K
®?ì#N˜ -æ^{B{"JøöŠêŒ±uÅìè
MIPS
‡¦§ùž®?ì¬)º˜‡VöŠê/ª"½ö3Åì-‡¦¦^M
ì/^˜‡~ê“O§ùž®?ìU íäÑ\I‡´T-á=ê
όCN"!o(˜e~„œ¹"
9.3.1 OŽ-µn!!˜‡Mì
‰1OŽÅì-´nMìöŠ§Ò´`‘ü‡Ñ\ژ‡Ñ
MIPS
ÑŽâ½Ü6¼ê§~Xµ
d = s + t

¤ addu d, s, t"
·‚JLùpn‡M쌱­E"‡)¤˜^ CISC º‚Vö
Šê-§^˜‡Ú öŠêƒÓ8MìÒ1 "XJ\ŽÑ s ®?ì
¬gĐ\‰µr addu d,s Š addu d,d,s Ów–"
neg Ú not ü8$ŽÎo´^˜‡½õ‡n‡Mì-5ܤ"®
?ìÏ"ù -õkü‡öŠê§¤± negu d,s Óu subu d, zero, s
§ not d ®?¤ nor d,zero,d"
ŒU~„MìMìöŠÒ´ move d,s"®?ìrù‡Ã?Ø3
-®? or d,zero,s"
9.3.2 ‘á=ê$Ž-
3®?Šó½öÅìŠóp§i\3-¥~ꡏá=ê"MIPS 
éõŽâÚÜ6-Ñk, ˜«^ 16 á=ê“ t Mì/ª"á=
êÄkÏLÎÒ*нö"*Ð*Џ 32 §^=«*ÐûuäN-"
˜„ ó§Žâ$Ž-?1ÎÒ*Ч Ü6$Ž-?1"*Ð"
¦+á=êöŠê)¤ØÓunMìöŠê‡Åì-£'X)¤
addui Ø´ addu¤§´§S ØI‡²(«©"d®?ìu ˜‡ö
Šê´˜‡M섴˜‡á=꧿ƒAÀJ(-µ
addu $2, $4, 64 ⇒ addiu $2, $4, 64

237
9.4. όª 1 9 Ù Ö MIPS ®?Šó“è
XJá=ꊌÃ{˜?Åì- 16 öŠê§@o®?ìò2
ÝÑ¡a"§gÄò~êC? ®?žMì at/$1 , ^§5?1öŠµ
addu $4, 0x12345 ⇒ li at, 0x12345
addu $4, $4, at

5¿ li £\1á=ꤍ-§3Åì-8péضli ´˜‡é~^
÷-§§r˜‡?¿ 32 êŠ\1?M짧S ÃI'%N˜?
——®?ìŠâTêŠ5ŸgÄÀJÐªéöŠ?è"
XJ 32 Š u ±32 KB ‰ŒS§®?ì¬^˜^ addiu Ú $0 ƒ\¶
p 16–32 я"žÿ§Œ±^ ori¶$ 0–15 "žÿ§Ò¬^
lui¶ù ÑØ´žÿ§¬ÀJ˜é lui/oriµ
li $3, -5 ⇒ addiu $3, $0, -5
li $4, 0x8000 ⇒ ori $4, $0, 0x8000
li $5, 0x120000 ⇒ lui $5, $0, 0x12
li $6, 0x12345 ⇒ lui $6, 0x1
ori $6, $6, 0x2345

XJ\3¦^ .set noreorder «5››©|ò´ø+n§@o*Ф


õ^Åì-®?-¬k¯K"XJ3˜‡ò´ø¥^ ˜‡õ^-
÷§®?ìAT¬´w"
9.3.3 'u 32/64 -
·‚3c¡£2.7.3 !¤w§MIPS NX(3*Ð 64 ž4%/
y=¦´$1u MIPS64 Åìþ§MIPS32 §S1ØC¶3 MIPS64
Åìþ§MIPS32 -‰1o´±Ï^Mìp 32 "½ö˜£
ûu 31 Š¤"
Nõ 32 -Œ±†^u 64 XÚþ——'XÜÅ Ü6$
Ž——´Žâ$ŽØ1"\~¦ØÚ£ ÑI‡#‡"#-·¶´
3P¶ic¡\þ d (double) cMµ~X§32 \{- addu Or#-
daddu 5¤ 64 °ÝŽâ$Ž"-ÏPÎc¡“d”Ï~´“double”
¿g"
9.4 όª
c¡JL§M‡|±˜«ÏŒªµMìÄ/Œ+á=ê £þ£
base reg+offset ¤§ £þ offset 7L3 -32768  +32767 ƒm"´®?ìU
ܤ“è5–¯^ˆ«Oª½/Œ?êâ"ù ª)µ
• Direct£†¤µd\JøêâIÒ½ ÜCþ¶"

238
9.4. όª 1 9 Ù Ö MIPS ®?Šó“è
• Direct+index £†\¢Ú¤µ˜‡ £þ§\þdMìÑIÒ/
Œ"
£~ꤵ˜‡)º 32 ýé/Œ~ê"
• Constant

• Register indirect£Mìm¤µ´Mì\ £þ§ £þ"AÏ/


ª
þ¡ù όª§(Ü®?ì3?Ȟ˜ {ü~ê$Ž§\þ÷
?nì¦^§\ÒU ¤Œõꇉ¯œ"e¡´˜ ~fµ
- Ðm
lw $2, ($3) ⇒ lw $2, 0($3)
lw $2, 8+4($3) ⇒ lw $2, 12($3)
lw $2, addr ⇒ lui at, %hi(addr)
lw $2, %lo(addr)(at)
sw $2, addr($3) ⇒ lui at, %hi(addr)
addu at, at, $3
sw $2, %lo(addr)(at)

þ~¥ addr ÎҌ±´±e?ۘ«µ


• Œ­½ ÎÒ——IÒ½öCþ¶i£¬SܽöO?¤

• Œ­½ ÎÒ ± ˜‡~êLˆª£®?ì½öó쌱3)¤8I“


èž?nù ¤
• 32 ~êLˆª£~XMìýé/Œ¤

ùü‡( %hi() Ú %lo() “L/Œp 16 Ú$ 16 "ùØ´{ü


†r/Œ©p$ü‡Œi§Ï lw  16 £þ´)ºkÎÒê"
¤±XJ addr ŠÐ1 15  1 ,@o %lo(addr) ŠÒŠKŠ§·‚I
‡O\ %hi(addr) ±Ö€µ
addr %hi(addr) %lo(addr)
0x1234 5678 0x1234 0x5678
0x1000 8000 0x1001 0x8000

la (load address) ÷-é/ŒÑÖ§aqu li ê~þJøÑÖµ


la $2, 4($3) ⇒ addiu $2, $3, 4

la $2, addr ⇒ liu at, %hi(addr)


addiu $2, at, %lo(addr)

239
9.4. όª 1 9 Ù Ö MIPS ®?Šó“è
la $2, addr($3) ⇒ liu at, %hi(addr)
addiu $2, at, %lo(addr)
addu $2, $2, $3

Kþ§la Œ±;¦^ ori -ž3wþ”KŠ %lo() Šþ—


·Ï"´ load/store -k 16 kÎÒ/Œ £þ§(Jó쮲
é/ŒüÜ©?1?U姱¦ƒ\ (J("¤± la ^ add -
±;4ó‡n)ü«ØÓ?a."
9.4.1 ƒéu GP ό
‡-8Ñl3 32 öŠ˜mp‰{— ˜‡† JÒ
MIPS
´§–¯˜‡?È?5;ì/Œ ‡s¤–ü^-§~X:
lw $2, addr ⇒ lui at, %hi(addr)
⇒ lw $2, %lo(addr)(at)

3Œþ¦^Û½·êâ§S¥§ù — ?ÈÑ“èR¬


$"
@Ï MIPS ?Èìéù‡¯KÚ\ ˜«?E⧌õê MIPS
?Èóäóј†÷^ ù˜‰{§Ï~¡/ۍ gp ƒéό0"ù
‡E⇦?Èì!®?ì!óì±9éēèpƒÓܧr§S¥
“”CþÚ~ê®8˜¬ÕáS«¶, ˜Mì $28 £¡
ۍ(global pointer) ½ gp M줍•T«¥ "£óì)¤˜‡A
ÏÎÒ gp§Ù/ŒT«m¥ ", gp /Œd§Séēè\1
gp Mì§ù˜ÄŠ3?Û load/store -‰1ƒc¤" ¤‡ù CþÓ^
˜m\å5؇L 64 KB Œ§ÜêâÒÑ uƒé«¥: 32 KB ‰Œ
±S§ù˜^ load -ÒC¤µ
lw $2, addr ⇒ lw $2, addr - _gp(at)

¯KÒ´?ÈìÚ®?ì‡3ü‡¬?ÈžÿÒ7L(½= CþU
ÏL gp 5–¯"Ï~‰{ru,‡A½Ý£Ï~"Ž´ 8 i!¤
Üêâј?T«m"ù‡þÝÏ~Œ±ÏL?Èì/®?ì“-G n”À‘
5››¶½“-G 0”òžù«`z"
¦+ù´˜«š~k^E|§¦^¥k˜ “€²”‡5¿"3®?“è
ž\7LAO5¿éÛêâ(²‡±˜—¿ ؇цµ
• Œ‡¦Ð©zêâ7Lwª/˜\ .sdata «"

• Ûúêâ(²ž7LÑÙ(Ý¿ ±˜—µ

.comm smallobj, 4
.comm bigobj, 100

•  ÜCþÓI‡²((²µ
240
9.5. 8I©‡9Ù3;ìN”¥ÙÛ 1 9 Ù Ö MIPS ®?Šó“è
extern smallext, 4

éuŒõê®?ì5`§ØšCþ(²3Cþ¦^ƒc§ÄKÒØn

¬(²"
3 C Šó¥§ÛCþ7L3¤k¦^¬¥((²"éu Üê|§
\Œ±–ùŽÑÙݵ
extern int extarray[];

Œ±‰ÑÙ(ݵ
extern int extarray[NARRAY];

kžÿ§S$1ªû½ ØUæ^ù«{"k ¢žöŠXÚ£„


kéõ PROM i›§S¤æ^˜¬üÕó“è5¢ySاA^§S¦^
§f§SN^5¦^SØõU"Ã{阇k{3SØÚA^
§S©O¦^ü‡ØÓ gp Šƒm5£ƒ†"ù«œ¹e§‡oA^§S!
‡oöŠXÚSاüöƒ˜£v7‡ü‡Ñù‰¤7L¦^“-G 0”À‘5
?1?È"
¦^“-G 0”À‘?È?ۘ|¬žÿ§Ï~@ I‡†ù ¬ó
¤k¥ÑAT¦^“-G 0”À‘?È"XJóì-A‡¬éu‰½
k¶CþA˜3ê⫄´ÊÏêâ«¿„ؘ{§éŒU¬‰ÑÛ
% ÎÃdŠ†Ø&E"
9.5 8I©‡9Ù3;ìN”¥ÙÛ
3Ù(—{á/w˜e§S3XÚ;ì¥Ùېª§¿J2'u
;ìÙÛÚóäó)8I“èƒm'XA:­‡5¿¯‘"éu
“è3C\Sƒ wþ´‡Ÿofk‡Ä )š~k^§AO´\
3¡é?Ö´‡4 MIPS “è3˜‡#muXÚM‡þ1˜g$1ž
ÿ"
MIPS Dڽ½“èÚêâ«£Œ˜u ROM §S¤Xã 9.1 ¤«"
3®?§S¥§ˆ‡«ÀJUìeã©|5|„"
.text!.rdata Ú .data

{ü/rƒA«¶¡˜3êâڍ-ƒc§Xe~ùµ
.rdata
msg:.asciiz "Hello world!\\n"
.data
table:

241
9.5. 8I©‡9Ù3;ìN”¥ÙÛ 1 9 Ù Ö MIPS ®?Šó“è

ã 9.1: Œ ROM z8I“èãÚ;.;ìÙÛ


.word 1
.word 2
.word 3

.text
func:sub sp, 64
...

Ú lit8 µÛ52:~ê
.lit4

\ØU^®?«5ù «¶¡"§‚´®?ìÛ¹)¤^5NB
Š li.s Ú li.d ÷-ëê2:~ê"k ®?ìÚóì¬Ü¿ƒÓ
~ê±!Ž˜m"
XJA^§Sï´^ gp ƒéόª{§.lit4 Ú .lit8 Œ±˜?“
ê┫"
.bss!.comm Ú .lcomm êâ

ù «¶iØ^Š®?«"^5Â8 C ¬¥(²¤k·½ö
242
9.5. 8I©‡9Ù3;ìN”¥ÙÛ 1 9 Ù Ö MIPS ®?Šó“è
ۙЩzêâ"C Šók˜‡A5Ò´ØÓ¬¥õ‡Ó¶½Â
´#N§‡Ù¥Ð©z؇L˜‡Ò1".bss Ò´^5Â8??Ñvk
ЩzLêâ"FORTRAN §S ¬@ÑùÒ´¡ common úêâ
¬——ù´ŸoùA‡®?«ùoå¶Ï"
\Ao´½ê⣱i!ü ¤˜mŒ"§Sóžÿ§
ù êâò¬v NBŒêâ˜m"XJ,‡¬3Щzêâ«
éTêâ?1 (²§@o‡æ^ٍ½¤kŒÚ@‡½Âµ
.comm dbgflag, 4 # global common variable, 4 bytes
.lcomm dbgflag, 4 # local common variable, 8 bytes
.lcomm array, 100 # local common variable, 100 bytes

šÐ©z”˜c¢Sþ^cØ"3 C Šó¥§vk²(Щz·½

öÛCþ3§Sm©žÿѬ˜"——ù´öŠXÚ½ö§Séēè
óŠ"
.sdata!êâÚ .sbss

Ž‡rê⑩móäórù «Šþ¡ .data Ú .bss «Ö


¿½O“Y"MIPS ?nìóäóù‰´Ï ‘5êâ«v
;n§ùŒ±k˜«X1 9.4.1 !¤ãp–¯Å›§Tś6u3
3Mì gp ¥‘o˜‡êâ"
5¿ .sbss Ø´˜‡Ü{«¶XJêâ‘^ .comm ½ .lcomm (²§
¿ Ó^˜muD4‰®?§S -G Š§óäóÒrTêâ© .sbss
«"
Û¹ .lit4 Ú .lit8 ~꫌U˜?ê⫧‡wÙþ˜"
æ^ gp- ƒéόž§gp ¬Щz•‚C“êâ«”¥:
˜"
.section

m©˜‡?¿·¶«§¿Jø››I“£ù†äN“èƒ'§„ŒU†ä
Nóäk'¤"ë\óäÃþ§éu~„«§[^äN«¶ƒA
®?«"
9.5.1 )æÚÒ3S¢S§SÙÛ
ã 9.1 ¤«§SÙÛ·^u“è˜u ROM p§$1u˜‡à CPU
þ£Ò´`§vk?ÛöŠXÚ¥m^‡JøÑÖ¤Œõê¢SXÚ"
Ö«ŒU˜u˜¬lÖ«;ì¥"
ÒÚ抏XÚ/Œ˜m«š~­‡§´®?ì½óìéd
)ØÓué .text Ú .data «"ÒÚæ´d$1žXÚЩzڑo"Ò´
243
9.5. 8I©‡9Ù3;ìN”¥ÙÛ 1 9 Ù Ö MIPS ®?Šó“è
ÏL˜ sp MìŒ^SºÜ£éàli!>.¤5½Â"æ´
^– malloc() ¼ê¦^˜‡ÛCþ5½Â¶TCþ~~Щz
end ÎÒ§´dóìOŽÑ¤k(²Cþ¦^p/Œ"

AÏÎÒ
ã 9.1 ‰Ñ ˜ dóìgĽÂAÏÎÒ§Ï§Suyˆ‡«
mÞÚ(—"§‚5 u3 Unix ˜aöŠXÚ¥6De5S.¶¡§Ù¥
k ´ MIPS ‚¸Ak"\ó䝌U½Â ÜÎҏŒUvk¶eL¥
@ ‹A’½Ñ¬½Âµ
ÎÒ IOº Š
ftext ©£“褫mÞ
etext X ©£“褫(—
fdata Щzêâ«mÞ
edata X Щzêâ«(—
fbss ™Ð©zêâ«mÞ
end X ™Ð©zêâ«(—

244
1 10 Ù • MIPS NX(£‡^
‡
ék‘8ý釦¤k^‡Ñ‡lÞmu¶Œþ^‡muõõ
‡^, ®²yk“è——3A^§S?§3öŠXÚ?§Ñ´Xd"\Œ
U¬uy§\Ž‡^3\ MIPS XÚ¥yk“见д‰Ù§?nì[
xmu", §\I‡­#?Șe “è±)¤^u MIPS þ
?›©‡¶X·‚¤„§ù‡?֌U'­#?È5E,"Œ£‡5
Ò´˜‡^‡^|ÃØ/=†˜‡#‚¸§AO´˜‡#-8
J´§Ý"£‡Œþ^‡óŠýš´¯§XJ–£‡^‡´£½)¤ö
ŠXÚ§½´ÃX°Ä§Sƒa†öŠXڗƒƒ'§£‡JÝÒ¬:
ìþ,"
p ^‡£Linux A^§S“è½aq“è¤3žÿ–Ñ¿£ Œ
£‡5§¿ éŒU®²3A«Øӂ¸¥¦^ §¤±N\ÃI?Û?U
‡­#?ȘeÒ1 ". ^‡——½N´, i\ªXÚ “èŒÜ
©——¯KÒõ "3˜«A½‚¸emuÑ^‡éŒU¬Ñy£‡5
¯K§ÏÙmuöŒUvk¿£‡;½ö)û£‡¯K"Ù8I
Ò´4\5¿å=£3• MIPS £‡^‡žÿAON´Ñ¯K¡"
˜‡XÚ¥°Ä. M‡ܩ،;¬k£‡5¯K¶;.i
\ªXÚz˜üc†mчk­ŒO,?§3ù«CzeE,j±‡¦
±5M‡/^‡ØC§ÒØÜn £,Ø¬!Ž¤¤"
10.1 MIPS A^§S. ^‡µ~„¯K˜AL
e¡ù ¯KÑyƒª„µ
• —àµOŽÅ­.©¤ üŒ E§öƒm´˜‡ØŒ}õ"Œ
õê MIPS CPU Œ±˜¤±Œ—à½ö—à$1¶=¦\®²
\ MIPS XÚ´N˜§„´rïÆ\˜½‡ß”n) ù
‡¯K"3\ƒc®²kéõLk²§S 3ùþ¡- ‹Þ§±
„¬kõ<3ùþ¡-‹Þ"žë 10.2 !"
245
10.2. —àµi!i!Ú S 1 10 Ù • MIPS NX(£‡^‡
• S¥êâÙÛÚéàªµ\§Séu C Šó¥(²êâ3S
¥ÙÛkŒUŠ Ø·£ØŒ£‡¤b"¦^ C struct (²5N
©‡êâ½lÏ&ó´þÂêâAl5Ѵ،£‡"¦^Ø
Óa.½öéÜNéhkêâõ‡ݖ¯§S¥ÒdÏk
ˆx"
, §êâÙÛ ÚÙ§£'uMì¢^!ëêD4!æÒ?n¤
½ƒ'§3e˜Ù¬ùù ½µXJ\Ž‡Jc¤˜ú§ë1 11.1
!"
• †+np„ I‡µ\N¬uy\Ž‡E^“è´3˜«Š
Ø¢yp„ ?nì!½ö´^ ˜‡‘kéu^‡“ß²”p
„  CPU £~X§3 PC oN?nìþ§A¤kp„ B
Š^ÑM‡Ûõ¤"´Œõê MIPS CPU  ±M‡{ü§4,
BŠ^±Œ„¿4^‡KIp„ +n¶·‚ò31 10.3 !)ºù
‰¿›XŸo"
• ;얯^SÚ­#üSµ3Nõy“i\ªXÚ½ž¤aXÚ¥§
XÚ±ŒDxêâlå:£Ä ª:ƒmŒU‡óªÏLõ
‡fXÚ"ù fXÚkŒUgµC NõE,M‡§‰\¥yÑ¿
دK"~X§3 CPU Ú I/O ƒmDx&EŒU½?\
è–§—ØÓ§Ýò´¶½öŒU©¤A‡Õáêâ6§
ùˆˆgª:^S§ØUyځÐux^Sƒš"1 10.4 !
?Øù¡˜ ;.¯K9Ù)ûY"
• ^ C ŠóÖ§Sµù†Ù`´¯KØX`´Å¬"´k MIPS Ak
ÀܧU ^ C £NA`ku®?Šó“è¤"!ùãSi
®?§;ì/ŒNM짱9¦^ MIPS žŒU‘,Ô,l
€²"
10.2 —àµi!i!Ú S
—à(endianness)ù‡c´d Danny Cohen(Cohen 1980) Ú?OŽÅ‰Æ
"3˜ŸJ4_%´Ö©Ù¥§Cohen 5¿§ÄuéÏ&XÚ¥
i!/ŒÚê½Âª<ÀJ§OŽÅNX(®²©üŒ E"
3 Johathan Swift 5‚6iP6¥§“à ”Ú“Œà ”Ϗéu¯È
/žAk‹=˜àâé©Ü u ˜|Ô"Swift 3Àe›l­V
mاVÑwئ‚ƒm«O´Ì*<"Cohen {Œ
[ú@§d Ò÷^e5 "—à¯KØ==†Ï&k'§„'XŒ£‡5"
OŽÅ§So´?nØÓa.êâSÚ^SµU^SH{˜‡iÎ
G¥iÎ!˜‡ê|z‡ƒ§½ö?›L«¥z‡'A"C §S
246
10.2. —àµi!i!Ú S 1 10 Ù • MIPS NX(£‡^‡
ÊHb½¤kù Cþј3S¥§ SÒ´˜‡i!S
——memcpy() Œ±€?¿êâa."C  I/O XÚé¤k I/O öŠÑ±
i!ü ï¶\Œ± read() ½ write() ¹?¿êâa.;¬"
ù˜‡OŽÅŒ±ј êâ§,˜‡OŽÅÖù ¶â,m§·‚
é1‡OŽÅUÄn)1˜‡OŽÅÀÜa, "
·‚n)3?néàÚW¿žÿI‡%£[!œë„1 11.1 !¤"Ï
"–2:ê@E,êâa.oU µØÄ/DÑ´Lu ¦ "·‚
–F"w{ü±?›Öè/ªL«êDÑv¯K¶—à ¹´
êØ1"›8?›Š 0x1234 5678  32 êÖў~~C¤ 0x7856
3412 ——?1 “i!†”"‡n)Ÿo¬ù§·‚k£Þw˜e"

10.2.1 'A!i!!iÚê
32 êL«¤˜ ?› S§z‡ kØÓ­"$k
­ 1 §, ´ 2 !4 ——Җ›?›L«“‡!›!z!Z”"\;
ì±i!όž§32 êÓ^o‡i!"éuˆ‡i!N¤˜‡êk
ü«ÜnÀJ"k OŽÅr$k ˜3c¡£=$/ŒSi!¤k
rpk ˜3c¡——Cohen ¡§‚©O—àڌ—à"· 1976
c1˜g>OŽÅž§DEC .Å´—ৠIBM Œ.Å´Œ—à
¶?ۘÑØ¿4Ú"
ŠrN´ù‡ÀJ ¹3\U όi!žÿâuŠ"1960 c
“ σck°OŽÅÑ´Uìü‡Åìiü |„µ-!ê!S
°ÝÑ´ÓiŒ"ùOŽÅvk—à¯Kµ3;쥱iS§
iS± S§övk'X"
Җ‹ÈÙ/˜§V EÑk¿©nd"
·‚S.ul†–mÖ›?›ê£wžÿÏ~l†–m¤§Öꞏ
´˜µÞ¬'æŒU¬`“oÚ›§”·‚K`“›o"”ùêž
ÿ§g,Òkp "3SU±i!όƒc§i!˜m©Ñy´Š
˜«riΘ?i¥{Bª"1970 c“@1 IBM §S s¤ ŒŒ)
²{ wŒþÑÑL§z|iδ“L˜‡L«êŠi"—àê
wþ錧†*þ´–•Œ—à"´êžÿp 3†>§i!/
Œ÷Ә•O\§ùXJêz‡?› lm†?ÒҬؘ—µ¤±
IBM r˜‡ip I 0 "¦‚­.Xã 10.2 ¤«"
´Šâ3êa.SÜŽâ­éˆ?› ?ҏég,——=r
Ò n ©‰Žâ­ 2  ˜"ù3i! 0 ; 0–7 Ҙ— §\q
n

C¤ —à "3ÑÑw«˜‡ižXØ1秴—àéuS.
urS¤˜‡i!S<5`AOk¿Â"cي˜J´§Intel ´
—à "ùi!i!Ú wþXã 10.1 ¤«"

247
10.2. —àµi!i!Ú S 1 10 Ù • MIPS NX(£‡^‡

ã 10.1: IBM £˜—Œ—à¤Ýw 

ã 10.2: ˜—£Intel¤—àÝw 
\¬5¿ù ã¥SNƒÓµ´p/$ † §„kˆ‡
gS‡= "IBM Œ—à wdi©)¤i!§ —à Kwd
i!¤ i"ùü«XÚéuØÓ<5`ѴÌF(µöÑk
Nõ`:§´\Ul¥À˜"
4·‚2£fâ* ¯K"·‚áÏim© 0x1234 5678§
?›Ò´ 00010010 00110100 01010110 01111000"XJ\†Òuxäk
ƒ‡—àXÚþ§\’½¬w¤k р= "‘@«œ¹§\¬
 00011110 01101010 00101100 01001000§›8?› 0x1E6A 2C48"
´·‚fâ`·‚Ö›8?ê 0x7856 3412"
؆§ ^S”.=3, œ¹e¬Ñy¶k˜ Ï&ó´kuxp
§˜ kux$ "´3 1970 c“,‡žÿ§l i!IO¤ 3O
ŽÅSÜÚOŽÅÏ&XÚSÜ£¡“octet”¤Ï^Äü ";.Ï&X
Úli!ï¤k©§k. M‡ó§“â=‡ kux"
Ӟ‡?nìXÚm©¦^l  Œ››ì£°››ì3‰pà
¬¤§¤kù ŒÑk˜‡ 8 àl 0  7 ?Ò§pk  7"
ØNot§vku)²w»¿§z‡i!ÑC¤ —ৠd ˜
†±e5 "
@χ?nìXÚ´3l o‚þ^l ;ìXÚl CPU§¤±
vk—à¯K"Intel  8086 ´ 16 —àXÚ" Motorola 3 1978 cc
íÑ 68000 X?n잧¦‚š~í IBM ÌZÅNX("ØØ´Ñ
ué IBM í§„´Ñuk¿‡‹ Intel ±ØÓ§¦‚@gCT^Œ—
à"´ Motorola Ã{|᮲ÓÌ/ i!S gSS.½——z

248
10.2. —àµi!i!Ú S 1 10 Ù • MIPS NX(£‡^‡

ã 10.3: l 68000 x?nìM©ؘ—Œ—àÝw 


‡l  Motorola Œë 68000 þžÿØ؇=êâo‚"(
J§68000 [xwþXã 10.3 ¤«§ †i!±ƒ‡^S?Ò"68000 9Ù
U¬UY3Œõê¤õ UNIX ÑÖìÚóŠÕ£²w~fÒ´ Sun¤þ
¦^" MIPS ÚÙ§ RISC 3 1980 c“fÑyžÿ§ÙOö áÚæ
^ƒA—àXÚO< §¦‚O CPU Œ±^?˜«—à"g 68000
§Œ—àҍ 68000 ªŒ—ৠ†i!•ƒ‡"\˜ MIPS CPU 
Œ—àž§wþҖã 10.3"ùÒ´æ†ým©/"
\Ö\ CPU M‡ÃþÚwMìãžk˜ æ†"z‡<Ñ@
Mì£Äk¤´ 32 ꧤ±ÑÎ×kxp £1 31 ¤"ùé§
S ÚM‡O˜a< kK"TÌã— “†£”Ú“m£”- O§
„^±(½ - Òëê§$–K¤ MIPS - IÒ"
˜ \-@«œ¹§£‡^‡½ö3ØoNÅìƒmDxêâžÒ
¬kî­^‡¯K¶ëØoNo‚½ö‡žÒ¬kM‡¯K"·‚
ò©m?Ø^‡ÚM‡¯K"
10.2.2 ^‡Ú—à¯K
ù´˜‡¡•^‡—à½Âµ˜‡ CPU/?ÈìXÚ§õi!ê$
/Œi!NB´$k žÒ‰—à¶õi!ê$/Œ
i!NB´pk žÒ‰Œ—à"ÏL$1˜ã¿،£‡
“觌±éN´/éÑ\ CPU ´=˜«µ
#include <stdio.h>

int main(void)
{
union {
int as_int;
short as_short[2];
char as_char[4];
} either;

249
10.2. —àµi!i!Ú S 1 10 Ù • MIPS NX(£‡^‡

either.as_int = 0x12345678;

if (sizeof(int) == 4 && either.as_char[0] == 0x78) {


printf("Little endian\n");
}
else if (sizeof(int) == 4 && either.as_char[0] = 0x12) {
printf("Big endian\n");
}
else {
printf("Confused\n");
}
}

î‚5ù§^‡—à´?Èìóäó˜‡á5§oŒ±——XJv ñå
óŠ{——)¤?ۘ«—àJ"´3˜‡– MIPS ùŒ±ÏŒ
i! CPU þ§SÜÒ´^ 32 Žâ$Ž§XJr1‹M‡é|¬—4à
$§¤±·‚?Ø CPU —à"
, §i!3/Œ˜mÙÛ¯K·^uØêƒ Ù§êâa.¶¬
K?ÛÓ^‡L˜‡i!˜mêâ§'X2:êâa.!©iÎG$
–„k“L- 32 öŠè"Žâ­Vg§éuÙ¥˜ šêêâ
a.Uk›¦^§éuÙ§êâa.ŒUvk?Û¿Â"
XJ˜«Šó|±, ^‡Eêâa.§ ù a.‡LM‡U+n
‰Œ§@oùž—à¯K´X{^‡½¯K——Œ±^?ۘ«—à
E"·F"y“?ÈìŠöU n)ù˜:§Ð4^‡½ÚM‡gC
½±˜—"
—àÚ§SŒ£‡5
‡l5ØlO?Ñ\?›ê⧐‡\;±ü«ØÓêa.
Ә¬êâ£Ò–þ¡~f¥k¿‰@¤§CPU —àҴ،„
£\“èÒ´Œ£‡¤"y“ C ?Èìò¦þÏ\uÿù«œ¹µX
J\Ø%ù‰ §ŒU¬?Èì†Ø½ö´w"
´\NÃ{Éù ›¶\ŒUØØ?nlO?G‰\XÚ
 5ê⧽ö‡?n;ìNM‡Mì"-ùü‡œ¹?ۘ
‡§\ÑI‡(ƒ\?Èì´N–¯S"
ù˜ƒwþÑvkŸoˆ³§´²L²3¤kêâN¯K¥§—à
N´Úå· "·Žù´Ï=¦´£ãù‡¯Kؑk •Ñé(J"ù
ü«YÐå Ò3uü«ØÓxãÚ£ãêâ{¶3ØÓ‚¸
eöÑ´ég,"
250
10.2. —àµi!i!Ú S 1 10 Ù • MIPS NX(£‡^‡

ã 10.4: ;.Œ—àã”

ã 10.5: —àã”
Xþ¤„§;.Œ—àŒ7Xi5xã"¤±‰ ·‚˜ÌXã 10.4 p
^êâ("‡´Uì IBM rp IP 0 ½§ã¬Ðwõ§
´y3Ø2ù‰ "
´—àŒUrNl˜«¡•^‡!ĖÝrOŽÅSwŠ
˜‡i!S"¤±Óêâ(wþ”ã 10.5"—à¿ØrOŽÅê
â̇¤´êŠ§¤±–•ur$ ê£ !i!½öÙ§¤3†>"
ØxãéJýn)—à¯K§Nõ<uygCo´éJ˜egCS.
½§~X§XJ\S.ulm†é ?Ò§‡s¤éŒ¿“åâUl†
m?Ò£˜‡—à(ã”4˜‡S.uŒ—à<xÑ5wþŒU
š~ØÜÜ6¤"ù´TK8N´Úå· Ÿµé˜‡ØÙG½=¦´
Ž–˜eÑéJ؀\gCÙGÀÜK"
10.2.3 M‡Ú—à
·‚3c¡w CPU S3—৐k3ӞJøéiêڍâÝ
±i!ü ;ìXÚ†|±žâUNyÑ5"aq§i!Ï
ŒXچõi!°Ýo‚랧M‡XÚ¼˜‡Œ±£O—à"
\ÏLo‚DÑõi!ê➧Têâz‡i!ÑkgCÕá/
Œ"XJê⥁$/Œi!÷X$ ÒlŠo‚£i!Ï´¤D§T
o‚´ —à"´XJêâ$/Œi!÷Xp Òi!Ï´D
ѧ@oTo‚´Œ—à"
3 CPU “S3”—à9يo‚Xڝ—àƒmvk7,é
X"´§·Øk=‡ CPU ^‡Ú—àؘ§¤±·‚Œ±
`“CPU —à”^5ӞÙSÜ|„ÚXڝ"
251
10.2. —àµi!i!Ú S 1 10 Ù • MIPS NX(£‡^‡
Œ±ÏŒi! CPU zgDÑêâžÿѬL²gC´Œ—à½ö
—à"Intel Ú DEC  CPU ´—à¶Motorola 680x0 Ú IBM CPU ´Œ
—à"MIPS CPU 3þ>žŒ±›¤?¿—ඌõêÙ§ RISC CPU
÷Q MIPS ‰{§4—एŒ˜——ù3^˜‡# CPU 5,?y
kXÚžÿéB"
M‡ó§“ÏLéþ Ò5ëØÓo‚‰{ØATI"´\
Xڝ)—à؃šo‚!CPU!½ö Œžæ†Ò5 "3ù«œ
¹e‰ÑÀJýéØ@o”t¶XÚO< ØØ“ü³ƒٔ"”
• ± Ҙ—/´i!S‹Ïµ²wÀJÒ´§O< Œ±U
ì ?Òrü‡o‚å5§ùJ´±éàip ?ÒØ
C"´Ï ?ÒÚiSi!^Sƒ‡§ë‚üàw;ì
i!SØÓ"
Úo‚°Ýؘ—´éào‚>.êâ3ƒëo‚þDў¬
áϧz‡o‚°ÝüSÜi!†"ù«*a'^‡¯K<s"
^‡¥—à†Øêâ§éÑêâa.>.vŸo¯K¶==´êâ
vk¿Â"-ù«M‡¯K§êâ>.tÏ £Øš-|§êâÑ
éào‚°Ý“i”>.¤"
ùp¡k ¿¥"XJ²LDÑêâo´éài>.ê§@
o Ҙ—قҬùX—à O§; ^^‡=†êI‡"
´M‡ó§“é(ƒ3‡XÚ)·ÏSѬkŸoêâ
²LDÑ"
• i!/Œ˜—/ê‹ÏµO< Œ±ÀJÏLrz‡i!Ï´ë
ƒAÓiSi!/Œl ±i!/ŒØC§,dži!S
êâ낊ؚ"@o–‡XÚéurêâ¤i!ê|5w´
˜—"
, §XÚ¥ŒU„¬k˜ ü^‡—àؚ"¤±˜—i
!/Œ’½¬³Ñõi!êêâL«ؘ—y–" ——AO
´——=¦´éào‚°Ý>.ê£DÑ“g,”ü¤Dx
, —àžwþw´i!† "
éuŒõê8§‹Ïi!/Œk³§·‚í“i!/Œ˜—”Ù
‚"?nêâL«ÚDѯKž§§S ~~¬£ C ŠóòS¤´˜
‡i!ê|.þ§Ù§êâÑ´3dƒþï"\éSb½Ø
éžÿ§éJwÑ.Ñ Ÿo¯K"
Ø3´§ Ҙ—/i!/Œ‹ÏëlOþwg,Ün¶‡`
ÑM‡ó§“Š‡ù‡Or¯œ‰éŒUš~(J"

252
10.2. —àµi!i!Ú S 1 10 Ù • MIPS NX(£‡^‡
¿šXÚz˜‡ëÑÉK"b½·‚k˜‡ 32 ;ìXچ
ëþ CPU"CPU XڝŒU¿vk)iSi!/Œ——/Œo‚¿
؍½/Œ 0 Ú 1" ´§Nõ CPU Ñko‡“i!ÀJ”&Ò§L²3DÑ
êâáu,‡A½i!Ï";ì 낇o‚§žÿ§i
!ÀJwŠ;ì TiSo‡ŒUi!¥=‡i! ˜¬¢S\"
3SܧCPU rz‡i!ÏÚiSi!/Œƒë§´@‹;ìXÚö
ŠÃ'"`§;ì/CPU ¤XÚU« CPU —ඐ‡ CPU U
­#Ö£5\ê§iSi! 0 ¢Sþ3;ìŸo/¿Ø­‡" 1

魇˜:Ò´§Ø‡ RAM ;ìù‡k^5ŸØ§Ò@3{


ü CPU/RAM XÚ¥vkS3—à¯K"\Œ±3°o‚þ?¿DÑ¥
uy—à¯K"ùp˜‡^‡L§3Ñ^‡e;ìXÚ
žÿ§ØUÑ CPU —àµ
• XJ\XÚ¦^ýk?§? ROM ;쇧3XÚSM‡/ŒÚ
i!Ï´ë©‡Ú ROM ?§žªƒ˜—§ROM ¥¹ê
âI‡š CPU ˜¤—à"du`§ROM ¥êâSN´lXÚ
ÜG‰XÚ¦^"XJ‡¦“è†l ROM ¥‰1§(—à
Ò¬AO­‡§ÏØŒU4 CPU 3žÿéöŠè?1^‡i!
†"
• ˜‡ DMA  ‡†DÑêâ;ìžÿ§@o§éu—à
VgÒ¬åŠ^"
•  CPU ¢SþØ^i!Àϧ ´^˜‡i!°Ý“è£é MIPS
CPU é~„¤uxiSi!/Œ§@o–Èè CPU Öž¦M‡7
L CPU ^´=«—à"XJ CPU —àŒ±^^‡˜§Ò¬A
ON´Ñ†"
e˜!4\wŠ\M‡ó§“N˜˜‡i!/Œ˜—XÚ——$
–)3^rŒU±ü«ª˜ MIPS CPU žÿ§N4@‡Xڌ±Šâ
CPU ˜"

—àؘ—o‚m‚
b½·‚k˜‡˜¤Œ—à 64  MIPS CPU§·‚I‡r§ë
˜‡—à 32 o‚þ§'X PCI þ"
ã 10.6 w« ·‚Nëêâo‚±ˆíJ§Ò´3Œ—à
CPU Ú—ào‚þwå5ј—i!/Œ"
ÙGM‡󧓌U¬¿£ù´˜‡˜„K(JµŒ;ì ˜‡5Ÿ
1

Ò´§Ø+ë§/ŒÚêâ‚Noü§ÑUUYóŠ"˜‡äNêâ3=p¿Ø­‡§­
‡´\‰ÑÓÖ/Œž§\U Ö\k\êâ"

253
10.2. —àµi!i!Ú S 1 10 Ù • MIPS NX(£‡^‡

ã 10.6: Œ—à CPU Ú—ào‚ƒm‚


ã¥?Ò‰“i!Ï”w« ˆ@pi!êâ/Œo‚°Ý
SÜi!Ü©"?i!ÏÒ´té˜|ë‚' "
Ϗ CPU o‚´ 64 °Ý PCI o‚´ 32 §\I‡U r°o‚
z˜ŒŠâ“i”/Œ——=/Œ 2 ——ëÄo‚§Ï/Œ 1 Ú 0 á
u 32 iSi!/Œ"CPU  64 o‚´Œ—৤±p êâ^´
$/Œ§ù:Œ±li!ÏÒþwÑ5"
\ŒUuygC‡ Œú«3o‚†ì±Œë?ÒwЌ˜¬§
âUýwÑ:€5"ùÒ´—à‘5W"
5¿·´‰Ñ êâ"PCI êâÚ/ŒE^o‚§3, ž¨±Ï§ù
“i!Ï” Dx´/Œ"3/Œ±Ï§PCI o‚ 31 ҂Dx´/Œ
pk "3/ŒÏmS†Äu MIPS XÚëØA†"

254
10.2. —àµi!i!Ú S 1 10 Ù • MIPS NX(£‡^‡
—àŒ˜‚
b½\Ž‡‰˜¬Ì†½öo‚†§#N MIPS CPU U±?˜«—
à˜$1"þ¡ïÆT‰Ní2Qº
·‚ïƧXJ\U `Ñ\M‡ó§“§\A3 CPU Ú I/O ƒm˜
˜˜‡Œ?§i!φì"ù«{óŠnXã 10.7 ¤«"5¿ù
p´˜‡ 32 Œ˜§r§í2 64 CPU ëœ/Š˜‡
öS3‰Öö"

ã 10.7: i!Ï´†ì
·‚rù‡‰i!Ï´†ì§ Ø´i!†ì§±rNٿشŠâ
zgDÑUC1§AO´L²§Ø¬ÏDÑêâ°ÝØÓ ½m½'"k
˜ ‚¸e§Œ±ÏLŠâDÑØÓ/Œ« ½m½'——rXÚ,Ü
©N ?Ҙ—/i!/Œ‹Ïª——´\gC‡yùUóŠ"
˜‡i!Ï´†ì(¢ˆ ù˜‡8I§Ø+\ CPU ´˜¤Œ
—à„´—à§ÑU y CPU چ Üo‚½ƒmÎ± i
!S"
255
10.2. —àµi!i!Ú S 1 10 Ù • MIPS NX(£‡^‡
~œ¹e\جri!Ï´†ì˜3 CPU ÚÛÜ;ìƒm——ù
´Ï§CPU/ÛÜ;ìƒmëq¯q°§¦i!†ì¤
p"
X·‚þ¡J§‡\U ¤õÈè CPU Xڝ§ÒŒ±r
CPU/ÛÜ;줘‡ü§¿3 CPU/;ìüÚXÚ٧ܩƒm
SCi!†ì"3ù«œ/e§ ?ÒÚÛÜ;ìSi!^S'X‘
X CPU Cz§´ùéXÚ٧ܩ،„"
éu—à¯K†Ø‰{چØ@£
z˜‡Oìè1˜g-—à¯KžÑ¬²Lù‡ãµ@ù ¯K
‡N´˜‡I‡)ûM‡"€"œ¹š@o{ü"e¡´A‡~fµ
• Œ˜ I/O ››ìµk # I/O ÚXڛ›ìŒ±˜¤Œ
—བྷàª"3¦^ù˜aA5ƒc§\‡4c[/ÖÃþ§
AO´3\Ø´r§^Š˜‡·À‘£Ož¤ ´^Š˜‡a‚£E
ž¤À‘žÿ"
é~„˜«œ¹´§ùA5==K1þêâDѧ 4§S 5
?nÙ§—à¯K§'X–¯ ?èMì½ö;ì›
›"Ӟ››ìO< N¿vkÖLÖ——'u—à««q´
š†Ø@£6Dé2"
• ŠâDÑa.?1i!†M‡µXJ\3, i!†M‡þ?1
O§Áã)û‡¯KwþékáÚå"XJ·‚´†i!êâ
±±Ù/ŒØC§´éuiêâK˜ƒØn§JØU“Ž‡^‡
¯Kíº‰Y´ØUœ‚M‡?ØU)û^‡¯K"~X§˜‡¢SX
Ú¥NõDÑ´±êâp„ 1Šü "§‚ŒU¹Øӌ
Úéàêâ?¿·Ü¶XJ\ʬ§Ò¬²xvkŸo{U
êâ>.3=p§Ò¿›Xvk{(½¤Ii!†˜"
^‡i!†==´\ì ·Ï§ÃÉu»þh"‡ÑÃ^‡i!Ï´
†ƒ ?ۉ{Ñ´ô þ^5¢< ¿"
10.2.4 MIPS CPU V—à^‡
\ŒUŽMïU ($1u?ۗà MIPS CPU þ?›“
è——N´Ï‡$13Œ˜?˜«—à,‡Aφfþ§½öMï
˜‡U$1u?˜«˜†fþŒ£‡°Ä§S"ù‡Œk:Jݧ
éŒU‡gޓè˜Ü©UùÒ1 "!‰Ñ˜ H"
UC MIPS CPU —à¿ØI‡‰õ"-8¥˜U @£Øv 32
é–Ü©Ò´Ü©i\1Ú;"3˜‡Pk 32 o‚ MIPS CPU þ§
-µ
256
10.2. —àµi!i!Ú S 1 10 Ù • MIPS NX(£‡^‡
lbu t0, 1(zero)

¼ u§Si!/Œ 1 i!§r§\1Mì t0 $k £0–7


¤§rMìÙ{ ÑW 0"ù‡£ã´—àÃ'"´3Œ—àªe§
C?Mìêâòg CPU êâo‚ 16–23 ¶3—ધi!l
CPU o‚ 8–15 \1"
3 MIPS CPU pÞ§k˜‡êâ+ÊM‡§CPU ^5?nrzgDÑ¥¤
k¹Äi!lˆg3þi!ϧÚSÜMì( ˜"ù
‡+ÊÜ6ØØ·A\1êâ°Ý!/ŒÚéàª£)1 8.5.1 !ùã
load/store left/right -¤Üü|Ü"
´¹Äi!Ï´ÚÜ©i/Œƒm'Xx MIPS CPU —
à"\­#˜ MIPS CPU —àž§´êâÚMìƒm+ÊÜ61
u) Cz"
†¡—àŒ˜5pÖ´§Œõê MIPS óä󌱊â·-1
À‘§)?¿—à“è"
XJ\3˜‡XÚ¥˜† MIPS CPU —à§@o¬u)A«œ¹"
Äk§XJ\OÀܟoÑvkC§^‡é¯Ò¬$§Ïé?ÛÜ
©iöŠ§;ìXÚò¬l CPU o‚†ØÜ©Â-Ãêâ"3­#
˜ CPU Ӟ§·‚Ð­#˜Èè CPU ±ÏÜ6" 2

XJ\? ù˜:§Ò¬uyÚXÚÙ{Ü©ƒ'§CPU wi!


/ŒÏ@ "^þ¡{5`§·‚Û¹/ÀJ ˜‡± Ҙ— Ø
´i!/Œ낐ª"
, §CPU UC—à \êâé CPU gC5`v¯K¶XJ·‚
#N3E žÿâUUC—à§@oáu CPU hk´”;ìÒج‘
5æ†"
„‡5¿ CPU w3éào‚°ÝiS ?ÒE,ÚXÚÙ{
Ü©±˜—"ùÒ´·‚@ žÿù Ҙ—§·‚žïÆ\˜„AT
;"3ù‡äN~f¥§ù‰k˜‡k^BŠ^§Ï MIPS -
?è 32 iS "éuŒ—à CPU k¿Â- ROM éu—à
CPU k¿Â"#N·‚gÞ§S“è",vk{¯œ——ù«œ
¹e§ROM ¥?ÛØ´dTÐéà 32 i¤êâѬÏ@"Nõc±
c§Algorithmics  MIPS †f3Ú ROM ¥=kv ˜m˜eV—à“
è§5iÿÌ ROM §SÚ CPU —à´Äš¿‹<ѐÏ&Eµ
Emergency - wrong endianness configured.
ù‡ücŠ˜‡ C iÎG§±˜iÎ(—"\y3A
Emergency
Tkv £Un)Ÿo ROM éē襝¹Xe˜„§S1µ
.align 4
.ascii "remEcneg\000\000\000y"
2 k CPU Ü©iDÑæ^Õái!ÏÀÏ&Ò§Òجu)ù«¯K"
257
10.2. —àµi!i!Ú S 1 10 Ù • MIPS NX(£‡^‡

ã 10.8: ·Üªž‹ÏiÎG¶ë„©
ùÒ´iÎG Emergecny £‘kIO C (—˜iÎ\þü‡W¿i!¤3—
à†Øžwþf"XJÙm©/ŒØ3oi!éà>.þ§œ¹¬
<s"ã 10.8 £lŒ—àÝ5x¤ü«.No£¯"
\w ÑV—à^‡´ŒU§´‡¿£\O\1? ROM
žÿ§\ò‡¦\ó䊘 ¿Ø´dOóŠ";.§Œ—àóä
r-i‹˜‡Ù¥p 3ci!©‡§—àóäЎ‡"\‡
c[χˆ(J§¿u)¤©‡±(@˜ƒUOy?1"
10.2.5 Œ£‡5ڗàÃ'“è
U옇ÊH„Ž§Œõê MIPS óäó½ÂXe BYTE_ORDER
ÎÒµ
#if BYTE_ORDER == BIG_ENDIAN
/* big-endian version... */
#else
/* little-endian version... */
#endif

ùXJ\ýI‡§Œ±˜˜ ØÓ“è?nz«œ¹"´
З—‡ŒU——„´—àÃ'“è"AO´3¿©É›^‡e£'X
‰˜‡ CPU Œ±Ð©z?¿˜«ª MIPS XÚ“èžÿ¤§@ý
g˜eҌ±žØNõ65"
¤kl Üêâ ½öÂêâÚ^Ñkd3—à6¯K"
´ŠâXÚقª§Œ±)¤3ü«—àeÑU$1“è"3Øӗàƒ
m‚kü«ªµ˜«±i!/ŒØC§,˜«± ÒØC"3XÚA
258
10.3. p„ Œ„5‘5¯K 1 10 Ù • MIPS NX(£‡^‡
½«S–¯äN Mì§Ù—àCz4kŒU†öƒ˜±˜—"
XJ\;.N±i!/ŒoN§@o\Aî‚Uìi!öŠ
?§"XJ ǽöÑuØ®§Ž‡˜gDxõ‡i!§\I‡?Šâ
—à^‡?1‹Ú)êâ“è"
XJ\´3i£32 ¤ gþoN——~X§dë‚ MIPS êâ
o‚ ½Ü©M줗—@o?§ž±o‚°Ý?1ÖöŠ"@Ò
´ 32 ½ 64 ÖöŠ"XJMìØ´ MIPS êâo‚l 0 m
© §\ŒU3փ Úƒc‡éêâ?1£ "~X§˜m©O
Œ—àXÚ 32 o‚þ 8 Mì§Ï~ë‚ 31–24"
10.2.6 —àÚ 5êâ
Ù´'u?§§ Ø´ù I/O ÚÏ&§¤±!éá"?ÛØ´3\
“è!À^¥ÚöŠXڥЩzLêâ˜Æ´ Üêâ"Œ±´\l
,‡;ìNM‡Öêâ!d DMA ˜?Sêâ!¿š\§S˜
Ü©ýk?§? ROM êâ!½ö\3Áã)ºl\öŠXÚe˜
‡“Ė” I/O ¼i!6"
1˜Ú´éÑù‡êâ3S¥wþ´Ÿof¶3 C ŠópÏ~Œ±
ÏLrêâSNŠ˜‡ unsigned char iÎGNÑ5"=¦\éêâÚ
?Èìkv )§U ßÑ=« C Šó(¤õNTê⧯œØÎ
ÜÏ"žÿ„´‡­#£i!ê|þ5¶XJ\êâ(Ø(§ÒN
´†L¯Kýƒ "
Ø —àƒ §êâŒUd\ CPU /?ÈìØ|±êâa.¤¶Œ
Ukaqêâa.´?èØÓ¶ŒUkÙGêâvk(éල
öá\ !{K‰ŒS§=Pk†Ø—à"
XJêâ3ˆ\Ï´ó^þz‡‚!ѱ i!S§ŒUu)
€œ/Ò´êêⱃ‡gSL«§éN´E˜‡“swap”÷5¡E!
o!li!êŠ"
´XJêâ岘‡ Ҙ—/i!/Œ‹Ï§@ÒJ "3ù
«œ¹e§\k‡½ u)êâi!†¤3o‚°ÝƒA>.¶, Ä
Ñù >.Si!|§Ø+nÔ›˜Ò?1i!†"XJvkц§y
3ÒAT(i!^Sk¿Â(J §,\„‡?nêâ¥Ï~¯
K——)ŒUI‡2g†õi!êêâ"
10.3 p„ Œ„5‘5¯K
31 4.6 !§\Ƭ Œ^5(ЩzÚ$1p„ öŠ"!´w
\5¿ŒUÑy˜ ¯K§¿)º\N‰Œ±)û¯K"

259
10.3. p„ Œ„5‘5¯K 1 10 Ù • MIPS NX(£‡^‡

ã 10.9: CPU!;ìÚp„ mêâ6


Œõêžÿ§p„ éu^‡´،„§´\¯XÚ„Ý"
AϜ¹e§XJ\Ž‡?n DMA ››ì9aq§rp„ Ž–¤Õ
á À;ìŒUkÏ§Xã 10.9 ¤«" 3

‡P4­‡˜:§3p„ ÚSƒmDÑo´±·Üp„ 1
(S¬——;.œ¹ 16 ½ 32 i!éଗ—ü §¤±p„
ŒUϏ CPU ==†Ú^Ù¥¹˜‡i! Ö‡¬¶=¦ CPU
l5vk-LӘ‡p„ 1Ù§i!§E,¬3e˜gDÑTp„ 
1žÿ)¤ki!"
3˜‡nŽXÚ¥§·‚oU’½SG#U‹þ CPU ¤k
öŠž¦§z‡kp„ 1)ƒAS ˜°(€"Ø3´§¢
SXÚ¿šoUˆù‡nŽ"·‚b3zgE \ÑЩzp„ §
\;£ Ø´Áã)û¤ 1 4.12 !ùŒùp„ ­K"lù b
½m©Ñu§˜‡ý¢XÚ1ÚnŽkõŒ Oº
• p„ ¥Lžêâµ\ CPU \p„ ;ì˜mž§
§#p„ ¥€£Œ±Óž\S¤"´XJ,‡;ì
˜Š^Oª‰ #§@op„ SNUY±PŠ§
y3ÒLž "ù3 DMA ››ìêâžÿÒ¬u)"½ö§ CPU
gC ˜^#-§-p„ ŒUUY±TS ˜þ±c
Š"§S ‡@£M‡Ï~ØUgÄ?nù ^‡§ù˜:魇"
• ;ì¥Lžêâµ CPU ˜ ê☇££ª¤p„ 1
žÿ§Têâ¿Øá=€;ì"XJ 5 CPU Öêâ§Òp
„ ¥ê⤱vk¯K¶´XJ´ CPU ± üÖ;ì§
3 éuäk{üßêâp„  MIPS CPU§ã¥I“write-back”Ü©¿Ø3"

260
10.3. p„ Œ„5‘5¯K 1 10 Ù • MIPS NX(£‡^‡
ŒUÒ¬PêŠ"ùŒ±u)3• Dxêâ DMA DÑþ"
^5éGϏp„ Œ„5—¯K^‡É쥧kA‡´Äu
MIPS  cache -ƒþIOf§S§U4\n˜p„ /S˜—5¯
K"§‚3éAu˜‡‰½S«þp„  ˜þöŠ§Œ±£#
p„ êâ½öŠ¢p„ ê⣽ööÑZ¤"
, §\oŒ±rêâNØ²p„ –¯"¢Sþ§k ‚¸e§
‡ù‰Ò1 µ~Xk ä››ì§k‡73S››(3@p
Öi!Ú I“§XJ\rù‡››(NØ²Lp„ {‡N´
éõ",éu;ìN I/O Mì§I‡éÖ Ÿo Ÿo‰
››§Ó·^"\Œ±ÏL kseg1 ½öÙ§šp„ ˜m–¯ù
Mì¶XJ^p„ ˜m–¯ I/O§’½¬€¯"
XJ£AϜ¹e¤\I‡^ TLB NM‡M얯§Œ±r¡IP
Ø²p„ "XJk<›E ˜‡ I/O MìØ3$ 512M Ôn;ì
˜mM‡§@où‡{Ò þ^| "
kù«ŒU§\Ž‡r˜‡aq;죌U´˜‡ã/v À
«¤²Lp„ ˜m?1N§ùŒ±l CPU ^5¢yp„ ­WÚ£
¬Ö„Ý¥ÉÃ"´\ØØ3zg–¯žÿÑ^Š¢½£5
†+np„ "k i\ª CPU Jø Û©p„ À‘Œ^uùa
M‡——u\Ãþ"
10.3.1 p„ +nÚ DMA êâ
ù´~„†Ø §k²§S kž¬3ùpц"؇d
ú%µ‡\c[Ž˜Ù ‡ˆ8I§ÒU4p„ 1X\¤§
ӞE,U 4 DMA DÑQ²wqp"
 DMA rêâ˜?Sžÿ§'X äê⧌õê MIPS
Xڿ؍#p„ ——=¦k p„ 1c˜/Œ u DMA D
Ñff#L«S"XJ CPU ‘ Öù p„ 1&E§Ò¬
p„ ¥PLž‡¶Ò CPU Ý5`§êâ,IPk§vk
ŸoÀÜL²S¥k #‡"
 ;ù:§\^‡7L3 CPU kŬ2gÚ^ù êâƒc§ÌÄ
Š¢?Ûá\ DMA À«‰ŒS/Œp„ 1"XJ¤k DMA À
«å©(å/ŒÑÐá3p„ 1>.§@o+nå5Ò¬N´õ"
éu• Dѧ3#N DMA lSDÑêâƒc——'XÏL
äuxѝ——\7Lýéy‡uxêâvk=up„ "
3^‡¤\k' DMA DÑêâ&Eƒ §7Lyéu?Ûp„ 
1§ ´c;/Œ u DMA ››ì‡DÑ/Œ‰ŒS§˜Æ‡r›
£S"k3ùž§\⌱S/uå DMA DÑ"
261
10.3. p„ Œ„5‘5¯K 1 10 Ù • MIPS NX(£‡^‡
3˜ MIPS CPU þ§ÏLrp„ 1˜¦^ß Ø´£
§ÒŒ±;†?1£öŠ §ù‡{؀”——ßoNþ‡ú
éõ§ ¬O\XÚõÑ"
ÏLlšp„ /Œ«–¯¤k DMA DѦ^S§\Œ±ý
K†p„ Š¢Ú£öŠ"ù«‰{Øí§ÏA’½¬r
N5Uü$u\Ž‡Y²"=¦\^‡é À«–¯´U^
S§é DMA À«?1p„ ¿›X&EÖ±pp„ 1
âuª Ø´ügDÑ"ZÊ·ïƴ阃Ñ?1p„ §´
e¡œ/~ µ
• I/O M쵌Uw ´„§„´ŠÑ"MIPS vk;^Ñ\
Ñэ-§¤kMìÑ7LN/Œ˜m,‡/§XJØ
%p„ §Ò¬u)éÛ%¯œ"
• DMA £ãÎê|µE, DMA ››ì^73uS£ãÎêâ(
Ú CPU ››/G&E";.‰{´§CPU ^ù &EM
–DÑ&EL§, âwŠ DMA ››ìm©óŠ"XJ\XÚ
¦^£ãÎ(§\F"–¯T(¤3S«žÿزLp„
"
˜‡– Linux @Œ£‡öŠXÚ7L?n錉ŒSˆ«ØÓa.
p„ §lE,ß²p„ 4{ü©a.§Ï Jø ˜‡²
(½Â API£­½õUN^8ܤ‰°Ä§SŠö¦^§„k˜ 0
N¦^ API {²© "ë„1 15.1.1 !"
10.3.2 p„ +nڕS\-µg?U“è
XJ\“è‡k•S\-§, ‰1ù -§\˜½‡(Ä
p„ 1"
ùŒ±3ü‡ gþ4\a¯ç"Äk§XJ\k˜‡£êâp„
 D-cache§\§Sэ-ŒU„vkˆÌ§†kŸoÀÜ>uƒ
Ap„ 1˜g£ƒcÑ´Xd"\Áã‰1\§Sэ-ž
ÿ§ù -„´Ê33 D-cache S§CPU ØU–¯êâp„ "¤
±1˜ÚÒ´éƒA\-p„ 1‰1£öŠ¶@–Œ±
y-ˆÌ"
1‡¯ç£Ø+\^@«a. D-cache¤´=¦Ñ#-ˆ
Ì,‡«§\ CPU  I-cache ŒU,˜´3ù /ŒþL˜
&E€"3\wŠ CPU ‰1#\-ƒc§^‡Äk‡Š¢¹É
K/Œ‰ŒS&E¤k I-cache p„ 1"
, §\Œ±ÏL3šp„ /Œ«\ډ1#-§±;ù
†£ڊ¢öŠ¶´@‰˜ï p„ `³§Ao´˜‡†
262
10.3. p„ Œ„5‘5¯K 1 10 Ù • MIPS NX(£‡^‡
Ø"
1 4.9 !£ãÏ^p„ +n-Ñ´ CP0 -§kØ%A?
^‡âU¦^"p„ öŠÚ DMA öŠk'žÿù:䢧ϏÑ
´Ø%¯œ"´éuk\- ‰1A^§S£Ž–˜ey“¦
^“9ž” )º/€ÈŠó¤5`ÒkK "
¤± MIPS32/64 Jø synci -§é\#“襘‡p„ 1Œ
“謧˜göŠS¤ D-cache £Ú I-cache Š¢"äNNo‰§ë„1
8.5.11 !"

10.3.3 p„ +nښp„ ½ßêâ


XJ\rNӘ‡Ôn/Œ‰ŒSp„ ښp„ –¯·Ü
å5§Ò‡Ęeù‰ép„ ¿›XŸo"šp„ ==#
‰½/Œ3Ì¥€§ŒU4 D-cache ½ I-cache ¥@‡ ˜þSNC¤
Lž€"šp„ \1ò¬ÀJ3ÌéSN——=¦@‡SN
ƒéup„ ¥8c€®²LÏ"
3E ò\Xڑ\®G. “襧éӘ‡Ôn/Œ
%¦^p„ ښp„ –¯k˜½^?§kž$–´7‡"´é
u$1“è§\ŒU؎ù‰"éuz˜¬Ôn;쫍§û½\^‡
–¯.´²p„ „´Ø²p„ §˜ û½–¯ªd ҇ýé
±˜—"
10.3.4 p„ ­Kڐ¡XÚ
31 4.12 !éup„ ­K¯KM‡å ùõ"¯KÑyu L1
˜?p„ æ^ J[¢ÚÚÔnI\§ ¢Ú‰ŒŒÓ^ ü‡½
öõŒ"¢Ú‰Œp„ z˜“|”Œ§@oæ^~5 4K
Œ§3 8K †Np„ ½ö 32 K o´|ƒép„ ¥Ò¬
Ñy­K"
˜‡ ˜“ôÚ”Ò´@ ^53z´p„ |¥ÀJŒ;
¬˜‡½öõ‡J[/Œ "•Ó˜¬Ônêâü‡J[=Pk
ØӐڞâkŒU)­K"‡•Ó˜êâ¤k¤?ÑP
kƒÓ ôÚ,@o˜ƒÑéЗ—?¿êâ§=¦ uõ‡ØÓJ[/Œ§
¬;p„ Ә‡ÔnÜ©§dÓÔnI\5I£"
˜‡ÔnŒ±lõ‡J[¡ ˜–¯£¥Ò~~3PkØÓJ[
/Œ§Sƒm¤§ù3 Linux ¥i˜„."
Œõêžm§öŠXÚéuêâJ[/Œéà‡¦Ñ¬
p——?§Ø˜½^Ó/Œ§´·‚‡(ØÓJ[/Œ
ƒmƒ målя§'X` 64 KB ê§@oØÓJ[/ŒÑ´Ó
263
10.4. –¯SgSSü9N 1 10 Ù • MIPS NX(£‡^‡
Ú"@õs ˜:J[;ì˜m§´J[˜mƒB¨"
éN´¬Ž‡êâ´“Ö”£,7L–‡˜g§@3­K
u)ƒc ¤p„ ­KҴóµ·‚Ø3˜‡Ökõ‡€"
´U`Œõêžm´Ã³"éÖêâ­K½NŒ±N=§AO´3
I-cache ¥µ´\‡yp„ +n^‡3˜‡J[/ŒŠ¢êâ
kŒU„3p„ ,˜‡ ˜þ"
‘XJ[;öŠXÚ£AO´ Linux ¤3i\ªÚž¤aOŽ½|2
¦^§5õ MIPS CPU 3›EžÒyجu)p„ ­K"?ù
‡ϱ5"€´˜‡žm¯K"
Ø+\‡‰Ÿo§MIPS32/64 CPU 7Äp„ öŠ§31 4.9.1
!Ñù "
10.4 –¯SgSSü9N
§S –•u@¦‚“è´UìûÐ^S‰1µCPU w˜e-§
^·ª#XÚG§, UYe˜^-"´XJ#N CPU ‹»
ù‡X{G1‰1ª§¦öŠØ˜½ÛuUìS^S‰1§@
o§SҌ±$1¯"ùéu3?nì?ω1- >uÖ
¯ÖcÙ­‡"
l CPU Ýw5§˜g;I‡˜‡é ž¦µ‰ÑS/ŒÚ
ê⧉;웛ì¤óŠ"¢S;ìÚ I/O ƒéú§3ö
Š‰1L§¥§CPU Œ±$1A›^$–Az^-"
,ÖöŠÒØÓ µ§I‡V•Ï&§˜‡é ž¦Ú˜‡éS
A" CPU I‡˜‡S/ŒSN½öMìSNž§3Xډ
ÑُA&Eƒc™ù‰Ø õ¯œ"
‡J¦p5U§Ò¿›X·‚‡4ÖöŠ¦ŒU¯§$–ØJ4
öŠCú"rù‡gŽ?˜ÚÚ§·‚ÒŒ±4öŠüè–§r?Û
‘ ÖöŠž¦JcD4 Àc¡"l CPU Ýw5§ù´‡Œ`
:¶ÏLá=m©Ö¯Ö§U ¦¯A"öŠ釞m5‰§Ï
èÝ´kµkŒU´3ùgÖöŠ¤ƒ CPU ‡3p„ ¥
‰1˜ãžm"XJ À讲÷ §·‚I‡3öŠžÿÊe5
˜¬µù,ج'·‚U^S‰1öŠJ "
\ŒUwÑùpk˜‡¯Kµk §SS, qÖ£5"XJÖö
Šsku§@o·‚ŒUlS¥¼Lžêâ§ù·‚§SÒÃ{
~óŠ"Œõêžmp·‚Œ±\þ M‡§éìuÖöŠž¦Úè
¥/Œ§¿3öšžØ#ÖöŠNskuöŠ"ÏLù˜‡ M

264
10.4. –¯SgSSü9N 1 10 Ù • MIPS NX(£‡^‡
‡ÒŒ±?ù‡¯K" 4

3@ ý¿u£=$1uØÓ CPU þ¤?ÖmCþXÚ¥§


Ö^S¯KC\ˆx"؆§3õêžm?փmvkpƒgS¯
K"?Ök¿^SCþ?1ÓÚÚÏ&žÿ§gS(¢kK¶3
ù«œ¹e§^‡ò¬^°%OöŠXÚÓÚöŠ£'X£Ú&Òþ¤"
´Sk˜ E|—— ´Ð^!íd!kE|——ØI‡
^@oõ&Òþ½ö£§´N´‰1gS‘¿Cz»€"~Xb·
‚kü‡?Öµ˜‡?Ö3,‡êâ(§,˜‡3ÖӘ‡êâ("
öÓ¦^Têâ(§Xã 10.10 ¤«"
‡öŠ(§·‚I‡Ö?Öw' iŠ®²#ž§U y
¤kÙ§#¬éÖ?֌„"
ؚ·‚ï)Ø CPU ÖƒmÍܤ‘5Ü5U`³§4M‡
é§S Ûõ¤kgS¯K´Øy¢"MIPS NX(Jø sync -^
uù‡8µŒ±•\y£éuS¤kë†ö¤3 sync -ƒcÑ
y¤kÖöŠÑ¬3Ù ÑyöŠƒc¤"Šc[g˜eù˜«
ìہ5µ==ugS§ =uë†éšp„ ½ö˜—5p„ 
;얯?֌„J"
‡4±þ~f3Ü·XÚþŒ‚$1§?ÖAT3 keyfield ƒc
)˜^ sync§Ö?Ö3Ö keyfield ƒ A‡k˜^ sync -"œë„
1 8.5.9 !"´'uù‡{K„kéõÀܶXJ\3ïùo˜‡XÚ§
rïÆ\^˜‡Jø ·ÓÚśöŠXÚ§¿Òù‡K8Š?˜Ú
Ö"
ØÓNX(éu‰1^S‰Ñ ØÓ«ì"˜«4à´§‡¦¤k
 CPU ÚXÚO< ãåy˜‡ CPU ÜÚÖöŠl,˜‡ CPU
ÝwþgSƒÓµ@‰“rkS"”k f˜:«ì£'X“
ÜöŠ‡±gSØC”¤¶´ MIPS NX(æ 4-?á|§=
Š؉?Ûy"
10.4.1 –gSÚ Àì
4·‚lm_JnØ5ù:¢SÀÜj"ré ž¦3˜‡“
Àì”gŽ3¢‚¥y²š~k§Ï;-–•uSæÑy3˜å"
éu˜‡$1X?ÈÑ MIPS “è CPU§;.(JL²kz©ƒ›
-´;-¶´ù –¯–•uâu?1——~X§3¼êÄܘ
|M슞ÿ"
Œõêžÿ§ ÀìöŠéu^‡ß²"3k AÏœ¹e§
§S I‡u) Ÿoœ¹µ
\Œ±§3, œ¹e§l À숣êâ5÷v֞¦"´e·‚#NÖöŠk–˜
4

e, –¯S{§ÒØI‡u²?ÛÀÜ"
265
10.4. –¯SgSSü9N 1 10 Ù • MIPS NX(£‡^‡
?Ö Ö?Ö
... keyfield = WAITINGFORWRITE;
/* update entries */ ...
keyfield = WRITEDONE;
sendsignaltoreader();

while (keyfield != WRITEDONE) {


waitforsignalfromwriter();
}

ã 10.10: êâ(?Ö
• I/O M얯žS'Xµù¬K¤k CPU"3 CPU ‰1˜g
;öŠ# I/O M잧é ž¦3ˆ´þ§k
ŒU3 Àìɘ ò´"Ù§¯‡§'XéS¥ä§ŒUu)u
CPU ‰1;-ƒ §3ž¦u I/O ¥)ƒc"ùŒ±—
Û%1µ~X§3\wŠ˜‡؇¥äƒ §CPU „ŒUÂ5
gT¥ä"2‰˜‡~fµXJ˜‡ I/O I‡^‡¢yò´
±Bl,‡öŠ¡E§Ò7Ly3\m©éò´Ožƒc Àì
˜——‡y3 À옘Ïm CPU ‡–"Љ{´½Â˜‡
f§S¤ù‡óŠ§S.þT~§·¶ wbflush()"äN¢yë„1
10.4.2 !"

• ÖskuµMIPS32/64 NX(#Nþ¡?ØLù«1"XJ\
^‡‡èF¿ ‡´u£‡§ÒØATb½¬±Ö^S"\I‡
yü‡±ÏU,‡A½gSu)ž§\I‡1 8.5.9 !ùã sync 
-"
• i!Â8µk  Àì* Ә‡Si¥Ü©iöŠ£D–Ó˜
‡p„ 1SöŠ¤rù Ü©öŠÜ¤ü‡öŠ"
 ;òšp„ «öŠÜ¿¤˜‡i°ÝöŠ ‘5Ø
û‡A§˜‡Ð{Ò´r\ I/O MìN4z‡Mì©O u
üÕi/Œ£'Xµ8 Mì–‡lmo‡i!¤"
10.4.2 ¢y wbflush
Œõê茱ÏL‰1˜‡?¿ ˜šp„ ;, X
ÖӘêâöŠ5˜˜"˜‡è,ØU#NÖsku——@¬
266
10.5. ^ C Šómu 1 10 Ù • MIPS NX(£‡^‡
ˆ£Lžêâ"3Úփm˜˜‡ sync -§ùé?ÛÎÜ MIPS32/64
IOXÚAÑk"
ù‰Œ1§´Ø˜½Çp¶ÏLl¯Œ^;ì\1ê⌱r
m~"N\XÚJø , XÚAk¯ś"¦^cž
kÖe¡5¿¯‘œ
5¿œ  Àì~~3 CPU SÜ¢y§´ŒU3 Ü¢y¶?Û
(¡äk write-posting A5Xڛ›ì½ö;웛ì
§Ñ3XÚ¥Ú\ , ˜? À"CPU Ü À
ì¬ÚåÚSÜ ÀìƒÓæ†"I‡c[éÑ\
XÚ¥Ü ÀìÑ uŸo/§3?§žÿ‡
Ä"
10.5 ^ C Šómu
\ŒU®²A˜ƒÑ^ C ½ö C++ 5 "MIPS "y;€ I/O -
¿›X I/O –¯Ò´é·ÀJ;ì/Œ\1Ú;¶ùéB§´
é I/O Mì–¯Ï~k˜½å§\‡y?Èì؇h² "MIPS
Œþ¦^ CP0 M쏿›X OS “茱l¦^°%]À C  asm() öŠ
¥ÉÃ"
10.5.1 ^ GNU C ?ÈìK®?“è
?È죓GCC”¤#N\3 C Šó ©‡¥i\®?“è¡
GNU C
ä"GCC Pk˜ AOrŒA5§Ù§y“?ÈìŒU|±ùp~f§
´Š{Œ±kéŒØÓ§¤±·‚ùp?Ø GCC"
XJ\éM‡. ››I‡ØŽA^Åì-§'XI‡˜‡¥¼ê5
‰1, E,OŽ§@\ý‡n)NX{®?§S¶´XJ\´
Ž\˜^½A^AÏ MIPS -|¤áS§asm() «ŠéŒ±ƒ
{üˆŽ‡J"Ð´§\E,Œ±r+nMìÀJ?Ö‰
?Èì§4ÙUìg½?n"
Š˜‡~f§e¡“è4 GCC ¦^#C MIPS CPU þÑknö
Šê/ª¦{"XJ´¦^~ C Šó * ¦{$ŽÎ§ù‡óŠ
ŒU¦^k¦{-/ª§=kü‡ öŠê§Û¹/rV°Ý(J
ux hi/lo Mìé" 5

C ¼ê mymul() ÚnöŠê mul -1ƒÓ§rVÝ(J


$˜Œk ˆ£¶p˜ŒÒ{ü¿ï "d\gCy‡oجÄѧ‡
5 3ÖŠžÿ§GCC k˜‡¦^ MIPS32 nöŠê mul -‡®²36D
—— ùE,´˜‡éÐ~f"

267
10.5. ^ C Šómu 1 10 Ù • MIPS NX(£‡^‡
oÄяv'X"
static int __inline__ mymul(int a, int b)
{
int p;

asm("mul %0, %1, %2"


:"=r"(p)
:"r"(a), "r"(b)
);

return p;
}

¼ê(² inline§ùwŠ?Èìéù‡¼êN^A^Ù¼ê
N£#N–\ÛÜMì`z¤5O†"\þ˜‡ static L«T¼êØI‡úm
‰Ù§¬¦^§¤±¿Ø)¤¼êg?›“è"ùK asm()
´k¿Âµ\Ï~Œ±r‡½Â˜?˜‡ include ©‡"\Œ±¦^˜‡
C ý?nì÷§´Sé¼êя˜ß"
asm() )Òp¡(²wŠ GCC )¤˜^ MIPS mul -1‰®?ì§T
1‘n‡öŠê——˜‡Ñѧü‡Ñ\"
3e¡˜1§·‚wŠ GCC ¦ÈöŠê %0 ‡¦µÄk§^“=” ?»ÎL
«ù‡Š´£Ò´`vk7‡3§kcŠ¤¶“r”wŠ GCC Œ±gd
ÀJ?ۘ‡Ï^Mì5TŠ" ·‚wŠ GCC ·‚¤ %0 öŠ
êéAu C Cþ p"
3 asm() (1n1þ§·‚wŠ GCC k'öŠê %1 Ú %2 œ¹"·
‚#N GCC r§‚˜?ÛÏ^M쥧¿`§‚éAu C Cþ a Ú b"
3~¥¼ê"—§·‚rl¦{-(Jˆ£‰ C N^§S"
GCC 3½öŠêžÿJøŒþ››§\Œ±½˜ Š´ÓžŒÖ
Œ§, M‡Mì¬ÏA½®?SBŠ^ —ÿŠ"\
Œ±l GCC Ãþk' MIPS Ü©эõ[!"
10.5.2 ;ìN I/O MìÚ“volatile”
ŒõêÖö¬^ C –¯ I/O Mì“è——\,ØAT^®?“
è§ØškŸo4½ƒ‡¦§ Ϗ MIPS I/O MìÑ´;ìN
§l C Šó¥–¯¿ØJ"` ùoõ§\%p‡P4˜^§‘X?ÈìuÐ
½ö\Œþ¦^ C++§‡O(/ýÿ“è ). -SC\
(J"ùp‰Ñ˜ ²LÏ¢‚uJ«"
268
10.5. ^ C Šómu 1 10 Ù • MIPS NX(£‡^‡
·‡˜ã“觎‡uÿ˜‡GGMì§XJG´ÒXÒux
˜‡iε
unsigned char *usart_sr = (unsigned char *) 0xBFF00000;
unsigned char *usart_data = (unsigned char *) 0xBFF20000;
#define TX_RDY 0x40

void putc(char ch)


{
while ((*usart_sr & TX_RDY) == 0)
;
*usart_data = ch;
}

‡´ù‡§Sux ü‡iÎ, Òk̂§·’½¬a%†¿Ï§


ékŒUÒ¬u)ù«œ¹"?Èìw *usart\_sr éA;ìN I/O
Ú^´˜‡Ì‚ØCþ¶3 while ̂¥vk?U§öŠ§¤±wþq
r\1öŠĴ ¡´S"?Èì@\ C §Sduµ
void putc(char ch)
{
tmp = (*usart_sr & TX_RDY);

while (tmp)
;
*usart_data = ch;
}

ù‡äN¯K§Œ±ÏLe¡ª½ÂMì5“Žµ
volatile unsigned char *usart_sr =
(unsigned char *) 0xBFF00000;
volatile unsigned char *usart_data =
(unsigned char *) 0xBFF20000;

XJ\‡u˜‡¥ä½öÙ§É~?n§S?UCþŠ§¬k
aqœ¹"(²TCþ volatile ATU?ù‡¯K"
·Øyù«‰{[kµC ’²pÞ` volatile ûuäN¢y"
·~¦%@Ø#NÑ volatile ' i?Èì`zK\1"
Nõ§S ^ volatile žk(J"‡P4§Ú C ŠóOa.?»Î
1˜——Ҕþ~¥ unsigned ˜"\‡;–e¡ùnÜwµ
269
10.5. ^ C Šómu 1 10 Ù • MIPS NX(£‡^‡
typedef char *devptr;
volatile devptr mypointer;

y3\wŠ?Èì7Lj±lCþ devptr \1Š§´éuT


•Mì1¿vk`"r“è¤e¡ùk^µ
typedef volatile char *devptr;
devptr mypointer;

˜ \?n ù‡ƒ §`z—“èØU($1~„ÏÒ´


?n„ݯM‡‹Øþ "M‡MìÖ~~k½ž¡›§\
~~ØØ¿˜ú“è„ݱ†ƒƒ·A"
!̑´Ÿoº,^ C ŠóÖڑoM‡°Ä§S“è'®?Š
ó‡N´˜ §KI?/¦^ù˜ÀJE,魇"AO´\I‡éóäór
p?Šó §S“è=z¤. Åì-ªkv  )§±yXÚ
1´\Ž‡"
10.5.3 ^ C Šómu MIPS A^žÙ§,Ô,l¯K
• Kµ3 MIPS CPU þ$1؊/ŒN{ü“螧¤kÑ
u kseg0 Ú kseg1 «§ù?Û 32 ê⍊p Ñ´˜§w
þ´“KŠ”"؊/ŒN§S3ŒõêÙ§NX(þÑ´†?
nÔn/Œ§Ï~u 2Gœ
XJÛª=†¤kÎÒêa.§ùŠ3Š'ž
ÿ¬Úåæ†"êڍa.ƒmÛª=†£3 C Šópé~„¤
A?Uwª=†§ A=†ÃÎÒêa.£ùpAT^
unsigned long¤"
Œõê?ÈìѬé-ê=†?1´w§¦+kž‡½˜‡À‘
â1"
• kÎÒÚÃÎÒiε3@Ï C ?È쥧^uiÎG char a.
Ï~du signed char¶ù†Œêa.´˜—"´§˜ \
ØØ?n‡L 7 ŠiÎ?è§ù«kÎÒiÎ3=†Ú'žÿ
Ñéˆx"y“?ÈìÏ~4 char du unsigned char"
XJuy\P§S6u char a."ŽÎÒ*ЧÐ?ÈìJø
k˜‡À‘Œ±¡EDÚ½"
• é 16 int J,µ„kاSl 16  x86 ½öÙ§ CPU þ
=£L5§ù CPU þIOê 16 "ù§SkŒU±˜«‡Ñ
Ž–!4‡©ª§6u 16 ŠkŒÚÄÑA5",\
Œ±rù a.=†¤ short ($1§@ÇØp"Œõꜹe§
270
10.5. ^ C Šómu 1 10 Ù • MIPS NX(£‡^‡
\Œ±4CþŠww= 32  MIPS int§´\AAO5¿@ ^
kÎÒê'5Ó¼ 16 ÄÑ/"
• 6uÒ§SOµk a.¼êN^ÒÚêâÒÛ¹3 C Šó¬
(¥"¦+ MIPS M‡vkJøéÒ|±§MIPS C ?Èì¢
y ˜‡ƒDÚÒ("{Xd§´\§Sý‡´@§
Ò(§Ò¬—Ã{£‡"‡ŒU§Ò؇Ž,/^#b
“Îbµy3k˜ ÊH@ŒÚÎÜIO÷/¥öŠ§½NU
)û±c\^‡ÁãgC‰¯œ§ùÒžØ E^Òü‡~„
Äŵ
- stdargsµ^ù‡Äu include ©‡÷5¢y?Ȟëê‡êÚ
a.Ø(½f§S"
- alloca()µ‡3$1ž©S§N^ù‡¥¼ê§§©S
´“Òþ”§¿g´`žS¼êˆ£žg嘘m"k
?Èìé alloca() ¢yÙ¢´˜‡*ÐÒSï¼ê¶‡ØÒJ
ø˜‡X{¥¼ê¢y"´Ø‡Ž,/Ò@ù©˜m
¢Sþ u†Òk'X/Œþ"

271
1 11 Ù MIPS ^‡IO (ABI)
3֌ܩ§·‚´l§S úpw–M‡Ý50 NX("
Ù50 ˜e†NMïpƒoN MIPS ?›§Sk'IO"
ù IOŒ7XM‡A55O§´~~‘k˜½?¿5——o
^˜«ª5‰§‡´z‡óäóÑ^Ӑª‰Ò¬‘5²wÐ?"·
‚®²-LÙ¥˜‡IOµ1 2.2 !0 Mì¦^½"
Ù·‚‡w˜e?Èì3¼êëêD4Ú¦^æҞ§NL« MIPS
§Sêâ"·‚¤k~fÜæ^ C Šó§,ŸþÓ½
·^uÙ§Šó"êâL«Ú¼êóáu¡A^§S?› ABI
(Application Binary Interface) ªIO˜ ¡"·‚0 ´ ABI ¥k
ž‰ o32 ¦^½"´ ABI © „5½ 8I©‡£^5NB?›§
SÚ¥©‡‚ª§'X ELF ¤?è§ÖØ9ùÜ©"
Linux „‡kõ½§âU4ˆÜ©§Sڐ¥Äó˜å¤
˜‡A^§S"·‚ò31 16 Ùùù‡¯K"
êâ|„É·‚31 10.2 ![ùã CPU —àK"
MIPS {¤þ­‡ ABI kµ

• o32: uDÚ MIPS ½£“o”“L old¤§ù´·‚ùp‡[ù)


"o32 Äþ,´i\ªóäóÚ 32 Linux Ï^½"
• n64: #^u$1X IRIX öŠXÚ SGI 64 CPU þ 64 §S
( ABI"SGI  64 .¥Ú C Šó long a.я 64 "
´ n64 „UC Mì¦^½ÚëêD45K"Ϗòõëê
^MìD4§5UkчJp"
• n32: Š‘ n64  ABI§¢Sþ´^u 64 CPU þ“32 ”§S"Ø
Ú C  long êâa.¢y 32 ± §ÄþÚ n64 ƒÓ"ù˜:
Ík^?——éu 32 /Œ˜m®² ^@ A^§S5`§64 
Ø O\m ØUJø?ÛÐ?"

272
11.1. êâL«Úéà 1 11 Ù MIPS ^‡IO (ABI)
L 11.1: êâa.±93S¥L«
C a. ®?¶i °Ý£i!ê¤
char byte 1
short half 2
int word 4
long long dword 8
float word 4
double dword 8

11.1 êâL«Úéà
\3 C Šó¥½Âêâžÿ§êâ3S¥Ù۝6u?È8I
Åì" " §,b½k,‡A½SÙÛ´“،£‡§”´ƒ'uÙ
1

§Œ^{§ØŒ£‡ C 3½Â½êâÙ۞´u‘o"
UÀJêâÙÛÉM‡Uå›"MIPS CPU U\1g,éà
õi!êâ——loi!>.\1oi!êâ——´Nõ CISC NX(
Òvkù˜›"MIPS ?ÈìÁãyêâ u·éà/¶ùÒ¬K
Nõ¡ g£¿Øo´²w¤1"
Ò!SN ó§;쌱wŠ˜‡ÃÎÒ 8 þê|§Ù¢
ÚÒ´J[/Œ"éu®¤k MIPS NX( CPU§ù‡ƒuu C Š
ó½Â unsigned char []"
Ú·¤y“OŽÅ˜§MIPS ^?›Öè/ªL«kÎÒ
ê——¤±Ø+=‡êâ°Ý§-1 ?›L«Ñ˜"ÖèL«̇Ð
?Ò´ÄŽâ$Ž£\~¦Ø¤éukÎÒÚÃÎÒêâa.¢y´˜
 " 2

C êa.k signed Ú unsigned ü‡‡§öêâ°ÝÚéà‡


¦[ƒÓ"\vk²(½=˜‡žÿ§Ï~ int!long!long long 
signed§ char  unsigned" 3

11.1.1 Äêâa.°Ý
L 11.1 Ñ Ä C êâa.±9§‚3 MIPS NX( CPU þ
¢y"·‚‘ £Þ2ù long ڍa.——ٰ݊â¦^ ABI ØÓ"
®?ì¿Ø«©êÚ2:êâa.;½Â"
î‚5ù§6u?È짴¢S MIPS ?ÈìфÅ!£ã½"
1

–3(J؇ÑöŠê°ÝžXd"
2

ù´ ANSI C A5"@Ï C  char "Ž´ signed"Œõê?Èì#NÏL·-1À‘


3

UC char "Ža.——ù3­#?ÈP^‡žk^"

273
11.1. êâL«Úéà 1 11 Ù MIPS ^‡IO (ABI)
11.1.2 “long” ڍa.°Ý
·‚3L¥Ñ ùü«a.§Ï§‚°Ý3ØÓ ABI ¥ØÓ"
´§‚ö°Ýo´ƒÓ"
éu o32 Ú n32£„k?Û^u 32 CPU þÜn ABI¤§long ¢y
Ú int ˜¶éu 64 n64  ABI§long ¢yÚ long long ˜"
3¤kœ/§;o´Ú unsigned long ˜¶MIPS NX(o´
(¡Pk{ü/²"0/Œ˜m"
11.1.3 éà‡¦
¤kù Äêâa.§kg,éàžÿ§âŒ±^IO MIPS
-†?n§Ò´`§Vi!êâ‡lóê/Œm©§oi!êâ‡l 4
ê/Œm©§li!êâ‡l 8 ê/Œm© " 4

11.1.4 Äa.3S¥ÙÛÚ9ّ—àCz
ã 11.1 w« z‡Äêâa.3·‚i!όS¥üÙ¶éu
Œ—àÚ—à^‡üÙØÓ"
·3ü«—àÙÛ¥‡= ˆ‡ ?Ò"ùéuSό5`vk¿
¶z‡i!´˜‡ØŒ© 8 N"´r ÒL5§¦2:êˆ
‡ ã)wþ´un)£ Ðw¤"
±þz˜«êâa.Ñ´g,éà"
“—à”N´Ú别¯K§·‚31 10.2 !k[?Ø"

11.1.5 (NÚê|a.SÙÛÚéà
E,êâa.´ÏLr{üêâa.©å5§3Ùm\Ã^
£“W¿”¤i!±÷véà5K 5¤" 5

ù:ŠÞA‡~fyy"e~‰Ñ struct mixed ¥êâ‘i! £


þµ
struct mixed {
char c; /* byte 0 */
/* byte 1-7 are ‘‘padding’’ */
double d; /* byte 8-15 */
short s; /* byte 16-17 */
éu^ 32 MìÚêâÏ´ MIPS32 CPU 5`§vk?nli!êâÅì-§l
4

i!éà›¿Ø´ýé7‡"´®¤k API Ñr›‡¦ù˜:"


k ?ÈìXÚJø UCA½êâ½Âéà5Kś"ù#N\^ C Šóêâ½Â
5

Oõ2ê⪧¿ ?Èì¬)¤·“裛”˜ Ǥ5?n™éàÄêâ


a."1 11.1.7 !éd‰Ñ ˜ J«"
274
11.1. êâL«Úéà 1 11 Ù MIPS ^‡IO (ABI)

ã 11.1: C êâa.3S¥L«
}

ŠrN˜:´§Eêâa.ˆ‡i! £þØɗàK"
êâ(½öê|3S¥‡éàÙ¤¹êâa.¤‡¦
Œéà>."¤± struct mixed lli!>.m©¶ù¿›XXJ\^
ù (N|¤˜‡ê|§\I‡3z‡ê|¤ ƒm?1W¿"C ?È
ìÏLé(NJø“(—W¿£tail padding¤” ¦§Œ±^uê|§¤±
sizeof(struct mixed) == 24 T(N(5ºATXeµ

struct mixed {
char c; /* byte 0 */
/* byte 1-7 are ‘‘padding’’ */
double d; /* byte 8-15 */
short s; /* byte 16-17 */

275
11.1. êâL«Úéà 1 11 Ù MIPS ^‡IO (ABI)
/* bytes 18--23 are ‘‘tail padding’’ */
}

´J2˜e§Ú long a.°ÝÚéà‡¦Œ±o½öl§û


u\´Ä^ 64 öŠ"
11.1.6 (N¥ 
#N½ÂòeZ‡á“ ”¤ Ø ?˜‡½õ‡IOêa.
C
; ˜"ù‡Aéu•ý!M‡!$–½Â;nêâ(k^?§
„ØŽud" ½Â¶Âþ6u CPU£Ù§ÀÜqÛ}Ø´Xd¤§Ù¢
ûu—à"
\N„P31 7.9.3 !·‚^ 5N˜‡˜3S¥ü°Ý
IEEE 2:Š£C float¤"˜‡2:ü°ÝŠÓ^õ‡i!§¤±Œ±ýÙ
½Â†—àk'"Œ—à‡wþXeµ
struct ieee754sp_konst {
unsigned sign:1;
unsigned bexp:8;
unsigned mant:23;
};

C o´; ——Ò´`§ù Ø¬W¿±÷v,«éà‡¦"


´?ÈìØ#N ªNB  C a.£3þ¡~f¥§Ò´˜‡
unsigned§= unsigned int  ¤>."

ã 11.2: Œ—àÀw 
Œ—à CPU ¥(ÚNXã 11.2 ¤«£æ^ ;.Œ—à㔤¶
—à‡Xã 11.3 ¤«"
C Šó?Èìj±‡¦§=¦éu §(N¥k(²‘‡Óâ$
S/Œµ\Xڏ—àž§\I‡r(N(²L5µ
struct ieee754sp_konst {
unsigned mant:23;
unsigned bexp:8;
unsigned sign:1;
};

276
11.1. êâL«Úéà 1 11 Ù MIPS ^‡IO (ABI)
‡n)Ÿošù§lã 11.3 wѵ3—àªp§?Èìl$?Ò
m©rz‡?› ‹(Np¡"

ã 11.3: —àÀw 
ùkŸo'Xíº,k ¶XJ\Áã^é—à6ª¢y
ž§@o3e¡~f¥§struct fourbytes 3;쥩ÙÒÚ
struct fouroctets ØÓ§ù‡(JwþØÜnµ

struct fourbytes {
signed char a; signed char b; signed char c;
signed char d;
};

struct fouroctets {
int a:8; int b:8; int c:8; int d:8;
};

 w˜‡2:êSÜžÿ CPU —à¯KÑyN¿ØÛ%¶·‚c¡


ùL^ØÓ C êâa.Óêâ~~¬‡NÑ CPU A5"´ù
‡~f2gJ2·‚—à¯K´˜‡ý5ÃÚÃ?Ø3¯K§=¦vk
ÜêâÚM‡I‡+nžÿXd"
˜‡U?Ù½Âa.˜‡;üp¶XJ·‚‡ MIPS 
V°Ý2:ê½Â˜‡(N§—ꍝ¹ü‡ 32 ;üÜ©§¤±Ø
U3˜g½Â¥¤"·‚U‰Ð{Ò´–e¡ùµ
struct ieee754dp_konst {
unsigned sign:1;
unsigned bexp:11;
unsigned manthi:20; /* cannot get 52 bits into ... */
unsigned mantlo:32; /* .. a regular C bitfield */
};

#N3½Â¥ŽÑ¤ ¶¡§ùÒØ^@ ==^5W¿å


¶ "
277
11.1. êâL«Úéà 1 11 Ù MIPS ^‡IO (ABI)
XJ^´ GNU C ½öÙ¦y“?È짷‚^˜‡ long long 
ÒU˜g½Â˜‡V°Ý2:Mì "´ ANSI C 5‰¿vk‡¦?È
ì7L|± long long"
'u éà5Kk:E,µ
• Xþ¤`§ 7L u·ÜuÙ(²a.ü‡;üƒ¥"Ï
ØUªÙü>."
• Œ±ÚÙ§(N/éÜN¤ §)š ¤ £‡˜˜å§
ƒ(Nü7L´˜‡êa.¤˜‡;ü"
• (NÏ~U«Ù¤ ¥éà‡¦î‚¤ a.éà‡¦"k¶i
 4(Néࣖ¤ÚTa.‡¦ÓIO"
öi ——Ø+Ù½Âa.´Ÿo——Ur›‡¦;ü
½ö‡(NéàU NB@oõ êa.þ"
• \NŽr›‘ (N¤ Ó^˜‡#;ü"3, ?Èì
¥§\Œ±^˜‡Ã¶"°Ý ¢yù˜:"Ù§/"°Ý´
š{£–´vk¿Â¤"
y3\®² ) 3U oNˆ« ABI ^‡e§r C êâ(²N
;ì¤I˜ƒ£"
11.1.7 C ¥šéàêâ
ÏJp MIPS CPU $1Lj«éà5Kkžÿé†<§Ï\Ž‡
š,˜‡A^§Sê⧎‡\ C (NL«˜‡°(i!i!
;ìüÙ"
GNU C ?È죱9Ù§ŒõêÐ?Èì¤#Né^5½ ?¿êâ
éà5K?1››§ØØêâ´{üCþ½öE,(N"3 GNU C 
Š{¥§êâ(²¥__attribute__((__packed__)) ò—¤k~5éà
‡¦ÑÚ‡êâ; § __attribute__((__aligned(16)__)) j±
éà 16 i!——' MIPS ?Èì¦^?ÛIOêâa.¤‡¦éàэ
î‚ " 6

··Üùü«á5§\Œ±^\Uª?¿Süêâ(£ü‡
__aligned__() U쇦››; (SÜéà¤"
ANSI IOéuêâ(k‡õUÑ´(¹Š{§Ø·^uÄa
.£Œ´Ï§´IO§Ï U ªØÓ?È줵^˜‡aqý?n·-"
ùXJ\¹˜‡± #pragma pack(2) m©˜1êâ(²§?ÈìÒ¬é
ù êâ^؇Lü‡i!éà"^ praga pack() ¡E~éà1"
,?È쬃­\JÑŒтéà‡¦§kžÿóì½öóäóÙ§ YÜ©
6

¿ØXd——¤±¦^ž‡&­"
278
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)
~Xe¡~fµ
int unalignedload (void *ptr)
{
#pragma pack(1)
/* define what you like here, with no assumptions about alignment */

struct unaligned {
int conts;
} *ip;

#pragma pack()
/* back to default behavior */

ip = (struct unaligned *) ptr;

/* can now generate an unaligned load of int size */


return ip->conts;
}

11.2 MIPS ABI ëêD4ÚæÒ½


ŠóÚÙ§~„?È.ŠóŒ±l©O?Èõ‡¬5ï§S"
C
 y3¬ƒpƒm±9ÚöŠXڃmU ܊§¬?ÈÑ“è
6uk'Mì¦^!æÒEÚëêD4¡£d?È좖§Ï é®
?Šó§S ´r›¤Ú˜½"
, ÖöŒUvkL C ½ö C++ §S"XJ\^ Java ½öÙ§ܽ
Ü©)ºp?Šó?§§@oùpù‹\vkŸo†'X"·!´
é C “裷éÙ§Šó )Ø õ§ØTù=pŽ¤"
!SN)æÒ!f§Só!ëêD4±93 MIPS “è¥N+n
ù ±BUk÷v§S ¤I˜ƒ"k'Mì¦^½31 2.2 !0
§k'?ÈìXۋ MIPS CPU êâ0 Œë1 11.1 !"
11.2.1 æÒ!f§SóÚëêD4
gl MIPS u 1980 c“@ÏÑy§Òk˜@k'N‰¼êD4ë꣓‰
f§SD4ëê” C Šó`{¤±9Nl¼êˆ£(JŠ½"
ù ½Ü6þ„Ì,‡ Kµ¤këêÑ3æÒêâ(p©
˜m§´áuæҁÐA‡ ˜SN¢Sþ3 CPU Mì¥D4——ƒA
279
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)
S ˜Š´™½Â"3¢S¥§ù¿›XéuŒõêN^§ëêÑ´3
Mì¥D4¶´Òêâ(£=¦vk\?ÛÀܤéun)N^L§
5`´Ðƒ\:"
·‚ò[0 o32 IO5½ëêD4ÚæÒ¦^§, 31 11.2.8 !
V)˜e n32 Ú n64 ¥Cz"
'uU?ù IO?Økéõµo32 š~P §glÙu²±5?§S.
®²u) UC"·‚F"¤kù ?ØU ‰Ñ˜‡Ð5‰——´
ÖŠž£2006 cS¤±9Œ±ý„ò5§^u 32 MIPS CPU þi\
ªA^„‡¦^ o32 ?È짤±ÆS o32 جkõŒ›”"
11.2.2 o32 ¥æÒëê(
M‡¿Ø†|±æÒ§´ C ŠóŠÂÄþ˜½‡¦k
MIPS
Ò"o32 k˜‡•eOÒ§cÒ. ˜3Mì sp £$29 O¶¤
¥"?ÛJøoÚS„–öŠXÚجé^r҉?Ûb½§Ø ¼ê
N^:ƒ §sp ŠÃ';‡"´S.þ„´r sp 3¼ê¦^$æ
Ò ˜½öe¡"
3¼êN^:§sp 7L´li!éà§éAuŒÄa.——ê
. long long ½ö2:. double"li!éàéu 32 MIPS êM‡Ø´
7L§éuÚ 64 Mì CPU oN´7،§Ï ¤ 5½
˜Ü©"f§So´òҍN 8 ê5‰ù˜: " 7

Uì MIPS ION^f§Sž§N^ö3ÒþMNBëêêâ
(§l sp • ˜m©"1˜‡ëê£C “襁†>¤ u$/
Œ"z‡ëêÓâ–˜‡i£32 ¤˜m¶– double 2:Ú long long 
64 Š7Léàli!>.£¹ 64 Iþêâ(´˜¤"ëê
(wþý–˜‡ C  struct§´„‡„ōõ5K"
Äk?ÛN^©˜‡– 16 i!ëê˜m§=¦ëêvk@oõ " 8

3vk¼ê.ž§C Šó5½?Û°Ýu int {ü.ëê£=


char Ú short¤‡“J,”˜‡ int ¿Š 32 êâD4"ØLù«?nª
·^u{üa.ë굿ط^u struct Sܤ "
11.2.3 ^MìD4ëê
©ëê(c 16 ‡i!£4 ‡i¤üëê3Mì a0–a3 ($4–
$7) ¥D4"N^§SÏ~rT(c 16 i!3™½Â"Ò¥Óâ(
E,7L3¶N^¼êXJI‡{Œ±r a0–a3 ŠS¥§
ù‰žÿŒ±´_8§ÃIkA‡ë꧱9Ÿoa."
7 SGI  n32 Ú n64 IO‡¦æÒéà 16 i!>.þ‘o"
8 Ÿoºë„1 11.2.3 !"

280
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)
3êMì¥D42:ŠÇØp§¤± “ƒ´§k˜‡AÏÿ
Á^5£OŒ±32:Mì¥D4¼êëê"
(½Ÿožÿ¦^±9N¦^2:MìIOwþéÛ%"Pª
C vkS3ś5uN^öÚN^öéu¼êz‡ëêa.´Ä˜—"
 Ï§S ?nù«œ¹§N^öòëê=†¤½a.§ê˜Æ=†
¤ int§2:˜Æ double"‡´§S ë2:ÚêëêÑt· §@„´v
ͧ´–“Ž Ü©·Ï"
y“ C Šó3?ȼêN^žÿæ^¼ê.§d¼ê.5(½
¤këêa."´=¦k ¼ê.§„k˜ f§S——ÙG
printf ——Ùëêa.3?Ȟ´™§printf 3$1žÄuyëê
‡êÚa."
MIPS ›½ ±e5K"ؚ1˜‡ëê´2:a.§ÄKØU3 FP M
ì¥D4ëê"ùŒ±y printf() DÚ¼êEU~óŠµprintf()
1˜‡ë괍¤± YëêÜÑ©êM쥧 Ø+ëêŸ
oa. printf() oU é¤këêêâ"ù‡5KØ¬¦~^êƼ
êÇeü§Ïù ¼êŒõê^2:ëê"
1˜‡ëê´2:a.ž§TëêÒ32:Mì¥D4"3ù«œ¹
e§U 3ëê(c 16 ‡i!˜eÙ§ Y2:ëêa.32:M
ì¥D4"ü‡ double Óâ 16 i!§Ïd½Â ü‡2:Mì fa0 Ú fa1
= $f12 Ú $f14 ^uëêD4"w,vk<@Š‘kŒþü°Ýëê
¼ê2½Â˜‡#5K"
du o32 c# —˜‡Œ"€´§Mì^{ځ@Ï
MIPS 2:ü±oN§Ï ^óê?ÒMì5NB2:Š"V°ÝŠ
ww/òƒÛêÒMì¶Ûê?ÒMì3l;ì½öê
MìÖ2:Šžÿâ^"o32 —M콿Ø{Ž^‡¦^ 5
CPU Ü 32 ‡2:M짴@¿ØUJpÇ"
, ˜‡'AÏ/´§XJ½Â ˜‡ˆ£Š(Na.¼ê§
¿ ˆ£(J3~¦^ü‡Mìp˜Øe§@oˆ£Š½‡¦)
˜‡ŠÛ¹1˜‡ë꧘31˜‡£Œ„¤ëêcƒc£ë„1
11.2.7 !¤"
XJI‡˜‡N^½¿š{üÚw ´„®?f§S§ŒUŠk
^ C ?˜‡˜¼ê§^“-S”À‘?È)˜‡®?©‡Š†"
11.2.4 C Šó¥¼ê¥~f
e¡´˜‡“è~fµ
thesame = strncmp("bear", "bearer", 4);

281
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)
·‚©OxÑëê(ÚMì£ë„ã 11.4¤§,ù‡~f¥vkëê
êâ?\;ì§ ¡·‚òwù~f " 9

Ϗëêu 16 i!§¤±ÑU˜?Mì¥"
wþД^ ˜‡4E,ªòn‡ëê˜?~5Mì"4·‚
25Á˜eêÆ¥¥N´Ñ†~f¶
double ldexp(double, int);

y = ldexp(x, 23); /* y = x * (2 ** 23) */

ã 11.5 ‰Ñ ƒAëê(ÚMìŠ"

ã 11.4: strncmp() ëêD4§n‡š2:ëê

ã 11.5: ldexp() ëêD4µ2:ëê

11.2.5 ˜‡‡~~fµD4(N
Šó#N^(Na.Šë꣍~„´D4•(N§
C
´ C ŠóöÑ|±¤" Ú MIPS 5K±˜—§D4(NÒ¤ë
ê(˜Ü©§ÙSÜÙÛÚÙÏ~;ìN”ƒÓ"3 C (N
p§i!ڌi; ü‡i;ìü¥§¤±·‚ÏLMì5D4V
²LgŽÌ§· û½3ù 㥁Є´rëêlþeüS"ϏҕeO§Ò´
9

`;ì/Œ÷X¡•eO\§ùÚ·3Ö¥O/x;ì(ªЃ‡"

282
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)
gþáu73æÒ(ž§·‚ØØ^êâC÷M챕;ì¥
êâüÙ"
ù§XJ·‚kµ
struct thing {
char letter;
short count;
int value;
} = {’z’, 46, 100000};

(void) processthing(thing);

@oÒ¬)¤ã 11.6 ¥ëê"

ã 11.6: D4(a.žëê
MIPS C (ÙÛ4ˆ‡3;ì¥^SÚ½Â^S±˜—£
,7‡žÎÜéà5K ?1W¿¤§¤±ˆ‡3M쥘˜„Ì
load/store -‰Ñi!S§‘X CPU —à ØÓ"ã 11.6 ¥ÙۇN
˜‡Œ—à CPU§dž(N¥ char ŠA uëêMìp 8 §
´Ú short Ø  ˜‡Mì¥"
XJý‡D4(Na.ëê§ ë꥝¹áuiêâa.§@o
ÒATÿÁ˜eù«œ¹§ww?Èì?n´Ä("
11.2.6 D4ؽêþëê
ëê‡êÚa.k3$1žâU(½¼êr½rN 4"
Äe¡~fµ
printf("length = %f, width = %f, num = %d\n", 1.414, 1.0, 1.2);

Uìþ¡5K§·‚Œ±wѧëê(ÚMìSNXã 11.7 ¤«"


kü:‡5¿µÄk§3 sp+4 ?W¿éy double Š(éà´7
L£C Šó5½2:ëê[UìV°ÝD4§Øš\²(¦^a.r›=†
½ö¼ê.5‡¦^ü°Ý¤"5¿W¿li!>.ŒU—IOëêM
샘aL"

283
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)
Ùg§Ï1˜‡ëêØ´2:Š§Uì5K؇¦^?Û2:Mì5D
4ëê"¤±1‡ë꣆3;ì¥Ó?è¤\1 ü‡Mì a2 Ú
a3 ¥"
ù'L¡wþ^?‡Œõœ
printf ¼ê½Â^ stdarg.h ÷§T÷3–¯¯k،ý
ëê‡êÚa.ž9MìÚÒöŠJø ˜‡Œ£‡µC/
ª"printf() ¼êÏL¼1˜‡½ö1‡ëê/Œ)Ûë꧿3ëê
(¥^X;ì/Œ•þ|¢5éÙ{ëê"
‡‰ù˜:§·‚I‡`Ñ?n printf() ¼ê C ?ÈìrMì a0
 a3 ˜ëê(¥f ˜"k ?Èìw\ëê/ŒÒ¬
J«¶ANSI C ?ÈìA3¼ê½Â¥?n“...”¶Ù§?ÈìŒUI‡^
-<? “pragma”§´ù Ñ÷Ûõ "
y3\Œ±wяŸor double Š˜?êMì´7‡¶ù stdarg
Ú?È쌱r a0–a3 ˜ëê(c 16 ‡i!¥ Ø^+ëêa
.ڇê"

ã 11.7: printf() ëêD4

11.2.7 l¼êˆ£˜‡Š
.½öa.ˆ£Š˜3Mì v0($2) ¥"Uì MIPS ½§M
ì v1 ($3) ‡´3§¦+éõ?ÈìŠØ^"´Œ±Ï"^3ˆ£
long long £64 ê¤a.Š 32 “è¥"éu˜‡Ó^Êl‡i!˜
m(NŠ´Ä^ü‡Mì5ˆ£§„kØƵGNU C ?Èìo´^
ˆ£‡LMìŒ(N§´5‰édvk²(5½"
?Û2:(JÑ3Mì $f0 ¥ˆ££32 CPU ¥XJ´V°ÝŠKÛ
¹^ $f1¤"

284
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)
XJ C Šó¥(²¼êˆ£˜‡Œˆ£Mì v1 Ú v2 Ã{NB(
NŠ§ÒI‡æ^O{"3ù«œ¹e§N^ö3gCÒþ˜‡]¶
(NCþ©˜m§¿3¤kwªëêc¡\þ˜‡•T(N¶
N^¼êòˆ£ŠE›ù‡/"U옄ëê5K§Û¹1˜‡ë
ê3¼êN^ž˜\Mì a0"ˆ£ž§v0 •ˆ£(N"
11.2.8 Mì^{IOüzµSGI  n32 Ú n64
3!£N^½ÚêMì^{¤§é n32 Ú n64 Ø\«© " 10

¦+Š éõãå5±M콃q§o32 Ú n32/n64 pÝØoN§^


ØӐª?ȼêÃ{¤õó˜å"±eA:V) n32/n64 5Kµ
• M쥌±D4õˆl‡ëê"

• ëêøÚ^uëêD4MìÑ´ 64 "áêa.ÑJ, 64
§Ò–\1Mì˜"
• N^öØI‡3Mì¥D4ëê©Ҙm"

• ÒÓâcl‡ëêøƒ˜2:ŠÑÏL FP MìD4§$–)
ê|Ú(N¥éà double §‡TØ3 union a.¥½öØ´
printf() ƒaëêØ(½¼êŒCëê"

• n32 Ú n64 @£ 16 i!ŒÄ閣'X long double 2:a.¤§


ùé–éà 16 i!>."ù‡¦éuz‡¼ê§Òv7L­#é
à 16 ‡i!ê"
¯KCE,£=D4(N½öê|a.ëꤞÿ§Mì¦
^E,‡Šâ˜‡bŽëê((½§=¦dž¿vkcl‡ëêøý3
Ҙm"
n32/n64 ½¢Ø o32 ˜‡½§Ò´ o32 'u printf() ¼ê‡¦
1˜‡ëêØ´2:½±B«OuÊÏ2:ëêœ/"#½‡¦N
^öÚN^ö“è3?Ȟ‡²(ëê‡êÚa.§ÏdI‡k¼ê
."
éu printf() ƒa¼ê§ëêa.3?Ȟ™§¤k™ëê¢
SþÑ´3êMì¥D4"
n32/n64 |„k˜@ØÓMì¦^½¶L 11.2 òêMì¦^
Ú o32 Xڊ '"˜¢Ÿ5 O3uµ±cüX^už;o‡M
ìy3^uD41ʖ1l‡ëê"·éu3žMìm‘¿ ²wØ
7‡­#©¶i‰{a¦¾Ø)§´¦‚Ò´@‰"
10 3 n64 ½e§long ڍa.Ñ?ȏ 64 ¶ n32 =k long long a.?ȏ 64 "

285
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)
L 11.2: # SGI óä¥êMì^{üz
Mì?Ò ¶i ^{
$0 zero ["
$1 at ®?ž¦^
$2§$3 v0, v1 ¼êˆ£Š
$4–$7 a0–a3 ëê
o32 n32/n64
¶i ^{ ¶i ^{
$8–$11 t0–t3 ž; a4–a7 ëê
$12–$15 t4–t7 t0–t3 ëê
$24, $25 t8, t9 t8, t9
$16–$23 s0–s7 Mì
$26, $27 k0, k1 ¥ä/g€?n§S3
$28 gp ۍ
$29 sp æҍ
$30 s8/fp I‡ž^Šv£ØI‡žŠ, Mì¤
$31 ra f§Sˆ£/Œ
\½N@?È “è¬Ï›” o‡^už;Mì
Kǧù´L–"Œõêžÿ¤këêMì±9 v0 Ú v1 MìÑ
Œ±4?Èì^Šž;", § n32/n64 ù˜Cz¿vkK= M
썽“”£=@ 3f§SN^L§¥ÙŠMì¤ " 11

2:Mì½£XL 11.3 ¤«¤CzÌݍŒ¶ù¿Ø¿ §Ï


n32/n64 ½´^u 5 MIPS CPU §ù CPU Pk 64 2:ü
Ú 32 ‡Œ^ÕáMì "5 SGI Œ±O¦^M챑±,
12

«§ÝþoN5§Túi „´û½ïykŒõê5K­#m©"
Ø Œ±^MìD4õëêƒ §n32/n64 IO¿vk›½?۝
6u1˜‡ëê´Ä2:a.5K" “ƒ´§Šâ3ëêL¥
˜òëꩈ‡Mì"4·‚­E^˜eþ¡~fµ
double ldexp(double, int);

y = ldexp(x, 23); /* y = x * (2 ** 23) */


¿ØXd"3 ˜Ã'“襧¼êÏLöŠ gp Mì5‹l˜‡êâ/¼ê/ŒL£
11

œ„1 16 Ù¤"3 o32 ¥§z‡¼êŒ±ŠâgCI‡?n gp§Ò´`3z‡¼êN^ƒ \ŒU


I‡¡ETMìŠ"3 n32/n64 ¥§gp Mìy3½Â“”"
¤k MIPS CPU Ñk˜‡ªm'Œ±42:1oNuPª 32 CPU¶n32/n64
12

b½ CPU $1ž'4Tª"

286
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)
L 11.3: o32 9 n32/n64 ½¥2:Mì^{
MìÒ o32 ^{
$f0, $f2 ˆ£Š¶fv1 =^u FORTRAN ¥Eêêâa.§C Šó
vk"
$f4, $f6,$f8,$f10 ž;——¼êŒ±Ø7҆¦^
$f12,$f14 ëê
$f16,$f18 ž;
$f20,$f22,$f24, Mì——¼ê7LÚ¡E‡\M짦
$f26,$f28,$f30 §‚·^uYžmª¼êN^ÏŠ
MìÒ n32 ^{ n64 ^{
$f0,$f2 ˆ£Š——$f2 =^uˆ£TН¹ü‡2:Š(N¶
ù´?n FORTRAN EꘇA~
$f1,$f3 ž;
$f4–$f10
$f12–$f19 ëê
$f20–$f23 óêÒ£ $f20–$f30¤ž;¶Ûê ž;
$f24–$f31 Ò£$f21–$f31¤‡ Mì
3 n64 ¥§V°Ýë꬘?2:Mì $f12 êŠ 23£“ÎÒ*Д
– 64 ¤˜? $a1§=^5˜1‡ø¥ëêêMì"éù ëêØ
3Ҙm"
, n32/n64 Œ±?n2:ÚÙ§Š?¿·Ü§ E,òcl‡ëê
¥ double a.˜\2:M진´k˜ 5K‡%5¿" union -L
ëê£Ï ؘ½ý´ double a.¤üØ3 §„këê‡êؽ¼
êëêüØ3 "Ϗ¼êÚN^§S7L‰Óû½£ÄKÃ
{?n¤§ùҝ6uPk(¼ê."X8§ù3Œõꜹe´˜‡Ü
nb"
11.2.9 ÒÙÛ!Òv±9éNÁì|±
ã 11.8 ‰Ñ ˜‡ MIPS ¼êÒv«¿ã£·‚­#£4ҕeO§
ºÜL«Sp/Œx{¤"\AU@ÑDÚ MIPS ¼êN^5½T¼ê
ëê¤3co‡i˜m——#N^½Jø¢SI‡˜m"
㥝ÚÒK«L«T¼êg¤^˜m¶o‚þxÚ«á
uN^¼ê"Òv¥ܝګÑ´ŒÀ§k ¼êŠØI‡¶ù«{
ü¼ê¿ØI‡^Ò"·‚3ِ{Ü©~f¥¬-ù˜ ¼
ê"

287
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)

ã 11.8: š“f¼êÒv
Ø ëê£ÙÙÛ7L†N^¼ê˜—¤ƒ §„kÒ(áu¼êh
k"·‚I‡˜‡IOÒêâSü˜Ï´ BuNÁÚäóä3
Ò¥Ê"XJ·‚¥ä˜‡3$1§S?1NÁ§·‚鎇U ÷X
ҕþˆ£§w«Ñ·‚ä:˜´þ¼êN^§±9D4‰ù ¼êë
ê"Ød §·‚„Ž‡U 3NÁ삸¥÷Xҕþ £rAÚ§éÑC
þ3#‚¸¥Š——=¦Tã“è`z?Èì?Ȥ3M쥑o
CþŠ§ù‰,k"
‡?1ù«©Û§NÁì7L˜‡IOÒÙÛ¿ƒ'&EU
wz‡Òv¤ Œ±9ù ¤ SÜÙÛ"XJ˜‡¼ê3Òþ,?
Ϗ‡^ s0  s0 Š§NÁìI‡l=péŠ"
3 CISC NX(¥§~~k˜^E,¼êN^-5‘oaquã 11.8
Òv§„‡ \þéA·‚ã¥IP“sp on entry” vMì"3
ù« CPU ¥§N^övò¬;3Ò¥,‡® ˜§#NNÁìÏL
©Û˜‡{üóL aLÒ¥A‡ ˜"´3 MIPS CPU ¥ù  $
1žóŠÑvk¶Œõêžÿ§?Èì3¼êmÞéҍ~õ§3¼
288
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)
ꈣƒcO\õ"
@o3 MIPS Òv¥§NÁìlŸo/éÑêâ˜3=pQºk
NÁì4 Û§$–U ©Û˜‡¼êÞA^-ŽÑÒvŒ¿½
ˆ£/Œ"´Œõêóäó38I“襖D4Ü©Òv&E§
d·®?–-\8I“è"
Ϗ·Ü –- pݝ6uóä󧊽˜‡¼êÄÜڗÜ
÷§ùŒ±Ø7P4[!§ 7‡žN´†Oóäó"Œõêóäó
Jø y¤÷Œ±†¦^¶\Œ±we¡~f¥^¶ LEAF Ú
NESTED {ü÷"
·‚¿ØŽJø^uNÁ®?–- [!µk"\Ð‰{
ŒU´?Ș “è§, ïĘe?Èì®?ÑÑ"
·‚r¼ê©¤n«a.¿‰Ñn«ØӐ{§ATºX \I‡˜ƒ"
“f¼ê
XJ˜‡¼ê؝)éO¼êN^§Ò‰“f¼ê"“f¼êØ7
ú%˜ëê(§Œ±S3š3Mì t0–t7!a0–a3 ±9 v0 Ú v1
¥‘oêâ"XJúI‡Œ±^Òê⧴U Arˆ£/Œ
33Mì ra ¥¿†ˆ£ ra " 13

Ñu5U`z½ö–¯ C ŠóvkA5 ^®?Œõê¼êѬ´


“f¼ê¶NõŠÒØ^Ҙm"ù«¼ê(²š~{ü§~Xµ
#include <mips/asm.h>
#include <mips/regdef.h>

LEAF(myleaf)
...
<your code goes here>
...
j ra
END(myleaf)

õêóäóŒ±r\®? “è3®?ƒcD4‰ C ÷?nì——Unix


ƒaóäŠâ©‡*ж5û½"©‡ mips/asm.h Ú mips/regdef.h 
¹k^÷£'Xþ¡ LEAF Ú END¤5(²Û¼êÚêâ¶Óž#N
¦^^‡M춧~X^ a0 Ø7^ $4"
LEAF Ú END ÷ò9ÏNÁì±H{\¼ê I‡w®?ìÜ
&E‹ ˜åµ§‚¿ØJøØ ¼ê¶i Ù§?Û&E"
13 ˆ£/Œ˜uO?U óŠ§@NÁìÒéØX "

289
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)
š“f¼ê
š“f¼êÒ´¹ éO¼êN^¼ê"~œ¹e§¼ê˜
m©“裼êÄܤr sp ˜¼êSܦ^$Y‚¶$Y‚Ò´i
@¼êN^ëê(Č"·‚I‡Ò˜m5T¼ê^?
Û“saved”Mì s0–s8 #?5Š"‡ ra ÚgÄCþ£=ÄuÒÛÜ
Cþ¤§„kT¼ê3gCN^L§¥I‡Ù§MìŠý3Ҙ
m"£XJëêMì a0–a3 ŠI‡§Œ±ëê(IO ˜
þ"¤
5¿Ϗ sp ˜˜g£3¼êÄܓ襤§Ò¥3¤k ˜Ñ
Œ±^l sp m©½ £þÚ^"
 `²ù˜:§·‚ò½Â˜‡4{ü C ¬"¼ê nonleaf() ‘
kʇëê£ùlÒþ–‡D4˜‡ëꤧ§‡N^,˜‡‘ʇëê
¼ê§Ù¥˜‡ë괍•Ò¥/Œ˜‡"ù A‰4\é ABI ´N
óŠkv õa5@£"
extern nested(int a, int b, int c, int d, int *e);
extern nonleaf(int a, int b, int c, int d, int e)
{
nested(d, b, c, a, &e);
}

ù‰Ñ˜‡aqL 11.4 ¤«Ò("


L 11.4: nonleaf() ÒÙÛ
48 e
44 (reserved for c/a3)
40 (reserved for b/a2)
36 (reserved for a/a1)
sp on entry => 32 (reserved for a/a0)
28 (pad to 8 bytes)
24 saved ra
20 (pad to 8 bytes)
16 &e
12 (reserved for a/a3)
8 (reserved for c/a2)
4 (reserved for b/a1)
sp running => 0 (reserved for d/a0)

290
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)
\Œ±w@ ϏƒAëê3Mì¥ 3™^ëêø ˜"
\Œ±w§Ï$MìÚ$1Òv.ÜÑ7Léàl
i!>. Ú\W¿/"
^ GNU C ?Èìr nonleaf.c ?Ȥ®?“èÒµ
.file 1 "nonleaf.c"
.section .mdebug .abi32
.previous
.text
.align 2
.globl nonleaf
.set nomips16
.ent nonleaf
nonleaf:
.frame $sp,32,$31 # vars= 0, regs= 1/0, args= 24, gp= 0
.mask 0x80000000, -8
.fmask 0x00000000, 0
.set noreorder
.set nomacro

addiu $sp, $sp, -32


sw $31, 24($sp)
move $2, $4
addiu $3, $sp, 48
sw $3, 16($sp)
move $4, $7
jal nested
move $7, $2

lw $31, 24($sp)
j $31
addiu $sp, $sp, 32

.set macro
.set reorder
.end noleaf
.ident "GCC: (GNU) 3.4.4 mipssde-6.03.01-20051114"

·‚ŒUI‡©¤AÜ©L˜H"
.file 1 "nonleaf.c"
.section .mdebug .abi32
.previous

291
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)
©‡m©´˜ ^uNÁÄ&E£XJ·‚?Ȟ\þ“-g”À‘§Ò
¬k'ùõéõNÁ&E¤"·‚؉?˜Ú)º§kœ
.text
.align 2
.globl nonleaf
.set nomips16
.ent nonleaf
nonleaf:

8I“èÚó^&E"·‚)¤´“觤±˜?8I©‡ .text
«§¼ê\¶i´˜‡ÛÎÒӞ´˜‡\:"k\:IÒ"
.frame $sp,32,$31 # vars= 0, regs= 1/0, args= 24, gp= 0
.mask 0x80000000, -8
.fmask 0x00000000, 0

k'Ò&E"·‚ù‡¼ê)¤ 32 ‡i!Òv§XL 11.4 ¤«"


˜‡MìÒ´ $31 =ˆ£/Œ"ù3 .mask ¥Mì ã
31 ¥wÑ5§-8 “L^uÏ^MìæÒ¬ ˜".fmask é2
:Mì¤ÓóŠµùpvk?Û2:M짤±Ò´""
.set noreorder
.set nomacro

ùü1wŠ®?ì3ùpd?ÈìKI"®?ì؇£Ä-5W¿©|
ò´ø§½ö)º“÷-”£Åìè¥Ðmõ^-®?-¤"
y3Tw˜ “è µ
addiu $sp, $sp, -32
sw $31, 24($sp)

Nҍ¿ l nonleaf() N^ˆ£/Œ"


move $2, $4
addiu $3, $sp, 48
sw $3, 16($sp)
move $4, $7
jal nested
move $7, $2

Nëê, N^ nested()"
lw $31, 24($sp)
j $31
addiu $sp, $sp, 32

u¢ˆ£/Œ¿ ˆ£"3ò´ø¥¡Eҍ"
292
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)
.set macro
.set reorder
.end noleaf
.ident "GCC: (GNU) 3.4.4 mipssde-6.03.01-20051114"

­#‹mfâ'4®?A5§¿ ¹˜‡I£?Èì‡iÎG"
E,ÒI‡v
3þ¡£ãÒv¥§?Èì^˜‡3Mì sp ÒU+n‡Ò"Ù
GONX(Öö‘oæÒ~~I‡^ü‡MìµÒ sp I£Ò
.ܧv•k¼êÄÜMïêâ(", §‡?ÈìU 3¼ê
Äܓ襩¼êI‡ÜҘm§ÒU3Äܓè¥ü$ sp 4§3¼ê
‡‰1L§¥•Ò¥˜‡½ £ ˜"XJù§ÛÜÒvþ˜ƒ
Ú sp ƒm £þÑ´3?Ȟ®§ÒØI‡v "´kžÿ\I
‡3$1žöŠÒµã 11.9 w« MIPS N©˜‡v5?nù«I
‡"
Ÿo¬—˜‡Ã{ýÿҍQº3, Šó¥§$– C Šó,
*Ð¥§Œ±Mïٌ3$1žCzÄCþ"Nõ C ?È쌱ÏLk
^Sï¼ê alloca() =ž©Ҙm "3ù«œ¹e§¼êÄܓèÓ^
14

,˜‡Mì s8£~^O¶Ò´ fp¤§r§˜ sp fm©Š"


Ϗ fp £Ò´ s8¤áu3M샘§¼êÄÜ7LÙ5Š§
ÒД·‚r s8 ^Š ˜‡f§SCþ"æ^v?ȼꥧ¤kÛÜ
ÒvÚ^ÑÏL fp§ùe?ÈìI‡ü$ sp 5‰$1žOŽÑŒC
þ©˜m§ÒŒ±†‰ "
5¿XJ¼êk˜‡i@N^^ Nõë걖uI‡3ÒþD4êâ§
@҇^† sp 'X"
ù‡‚€˜‡|©A:Ò´ØØ´v¼êN^ö§„´§N
^¼ê§ÑØr§Š˜‡AÏMì?n"N^¼ê5҇ fp§
Ϗ§´˜‡dN^¼êMì¶N^¼êŒ„ÒvÜ©wþ
TXd"
®?OÐöŒUWuwѧ^ alloca() Mï˜mž§ˆ£/Œ¢Sþ
' sp p˜:§Ï?ÈìE,¼êN^‡¦Œëê(3 ˜m"
ÛÜCþ˜mOŒÒvþk êâl sp §±–uÃ{^˜
^ü‡ MIPS load/store -–¯žÿ£ £þ› ±32-KB¤§k
óä3ù‡žÿæ^Äu fp Òv"
¢Sþ§alloca() k ¢y¿Ø3ÛÜÒþ©˜m§k K´X{¥¼ê£ù¿›X\
14

ØI‡ÏŒ£‡5Ï £; alloca()"¤´^Ҙm¢y alloca() ?Èì)¤“è


$1¯˜ "

293
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)

ã 11.9: ¦^ÕávMìÒv
11.2.10 ‡êؽëêÚ stdargs
XJ\‡½Â˜‡ëê‡êØ(½#¼ê§ž^óä stdarg.h ÷
£ANSI IO5½7Lk¤"T÷Jø ÷——ŒU„k¼ê—— va_start()!va_end()!va_arg()"
‡ )No^§w˜e¢y printf() ÷Ò µ
int printf(const char *format, ...)
{
va_list arg;
int n;

va_start(arg, format);
n = vfprintf(stdout, format, arg);
va_end(arg);

return n;
}

294
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^‡IO (ABI)
˜ ·‚N^ va_start()§·‚ÒŒ±JÑ·‚Ž‡ëê"¤±3
printf() ¢y‚ª=†“è¥m,‡/§\¬we¡“è^5)Û
e˜‡ëê§ùpb½Tëê´V°Ý2:a.µ
...
d = va_arg(ap, double);
...

û؇^®?Šóëê‡êØ(½¼ê——؊d 3Œ£‡5
¡Ú\Nõæ†"

295
1 12 Ù MIPS NÁ——NÁÚ¿
Û
\$¤!$õÑi\ª½öž¤a>f¬žÿ§r
˜ƒé A^vk zA5ÑK´k¿Â"
Ø´íº
^½|E{5`§Äk‡Älù  aªµ‘X1þÝ
\½|§d‚eü鯣'X–®²u)3 DVD ˜ìþ@¤"¬)
·±ÏC᧑ƒmužm‡ á"
ùÒk ˜‡gñ"˜‡pÝà~M‡XÚéØ|umuÚÿÁ"SoC 
¡5²LJø ˜‡)û{"Œõê SoC Œ±3ØO\¬¤cJ
e'ý½õUO\z©ƒA¬N+§Ï¬N+ê8̇Ɂu>´
OE,5Úy¡˜g¤õ(J5"XJ SoC ‡øAûU3Øòºx
=g‰ SoC ›EûcJe¹õ9ÏmuÜ6§@oŒ[Ñ´I["
¤±y“ MIPS CPU ˜EÑ5ґk˜½M‡^u9Ïmu"ØÓ
›Eû^ØӐ{5÷v¿I¦§ù˜5——éumu< Úmuóä
)û5`Ø3´——ù A5Ñ´ŒÀ§\XÚؘ½k"´C
Ac˜‡(½ª³´\\5õ9ÏmuÜ6"
mu< ÉÃ5guŒ±l¥¦‚XÚn‡ØӐ¡
&E§·‚Œ±Ünrù &E©“NÁ(debug)”!“‹l(trace)”Ú“¿
Û(profile)”n¡"
NÁ——XÚ(ƒG
3ņXÚóŠk'Ü6†Øžÿ§‡´kŸo{U ˜†
.§$–kžU. £˜^˜^-¤5 wľu) Ÿo¯§@Òk
^ "
ùÒ´^‡NÁìóŠ"‡3E,XÚ¥U^§NÁìI‡U –¯
^‡ “è!?›“è§ ‡UröéAå5"òNÁ¯‡Ú “èé
Aå5´˜‡Œ¯K§·‚ùpØ?ا´Ñù˜‡NÁìÃ{Ü7
33–ÿi\ªXÚp¡§¤±NÁìI‡,«ÌÅ-8IÅë"3 CPU
296
1 12 Ù MIPS NÁ——NÁÚ¿Û
g§NÁìI‡–¯§SSÚ CPU G§±9ÏL3·/Sü
NÁì^‡g€5››§S‰1Uå"
MIPS 5‰½Â ˜‡Xe¤ã CPU ¡S9ÏNÁü§¶ EJTAG"
´ MIPS CPU 3 EJTAG ƒcNÁA5§ƒ¤±„3ù ´Ï
§‚é, a.NÁ^‡^å5ÙGB§·‚¬Jù "
‹l——fâÑu) Ÿoº
¼˜ XÚXÛl“(”r†Ø1oNL§§éu )XÚ
$1 =˜Ú´ék^"‡XÚGŒJ±+n§¯céJ=
G­‡"é CPU ó§ wC‰1L-’½ék¿Â"
 CPU „ݯz¦$1A›·^-žÿ§‡v õG&E
¿ºXv žmªÝÚv õ[!!¿±v ¯„Ýr&ExÑ¡
±ÊŽ CPU ½ö¿”Ü©‹l&E§´˜‡ãŒ]Ô"
MIPS CPU ¥¦^XÚ‰ PDtrace§Ú EJTAG NÁ¬3˜å"

¿Û——˜ãžmSXÚ1ÚO&E
XJ`JøNÁì´Ï§S ØU3ÞM¥P4^‡z˜‡ŒU
[!¿Â{§@o¿Ûì3¿ÂҴϏ‡Ž–чfXÚ1
\(J"¬z§SO¢‚¦(ïXÚ¤ŒU§§ò§S l
CPU äNN‰1?Ö£ lm5——´éuk˜½E,ÝXÚ§ù
Ò¿›X§S éuUe˜‡UÜ´Ä—÷¿A„´™–§k
˜‡4 Vg"
3ŒºÝþJøXÚ1ÚžmÚO&E^‡óäÒ‰¿Ûì"
¿ÛìóŠ´ÏL•XÚJ§S±9é˜ãžmSA½¯‡?1Oê5
¤"
EJTAG Xڝ¹˜‡‰“PC ”ŒÀ‘§UJø˜ k^&E¶
´MIPS CPU „kA‡d8IÅþ^‡››5UOêì"ù Oêì9Ù
››Ñ± CP0 M쐪Jø§e¡k?˜Ú£ã"
mu< $1˜‡XÚ?1NÁ!‹l½¿Ûžÿ§Jø. &E
M‡ŒUUCXÚ1"ù:vkÐ?µ·‚F"9ÏmuõU¦ŒU
؇KXÚ1§=š»€5(non-intrusive)"
·‚c¡`L§SoC þ^u9Ïmu¬N+4àB¨§Œ±íd¼"J
±^$¤Jø´ SoC ÚmuXڃmëì§d§òNÁ&E‘£5©
Û"
3PªXÚ¥§Ï~^ G½öOXÚ I/O 5ë8I†Ú‰
ÌÅ"õžÿ9‹8IXÚ^‡ƒm'uëìځªXÚ¥
åŠ^ƒmE,Æ"
297
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û
ù«‰{¬KXÚ1µÐ´k‡üÕNÁë"nŽœ¹
e£ ~éXÚOÀ§¿ ïᘇIO±BuEó䤧NÁë
A†5g CPU"´‘k CPU  SoC Ï~ uXÚØ%µ¬N+
`B¨§´O\Ú ¤%éB"
ØL3ù:þ·‚é3$¶O<¯K‰·‚Jø ˜‡)û{">f
XÚÏ~´Å3˜å§ ÅL§"€Çép"Œõê>f‚´†3^
u¬ƒc‡?1gÄÿÁ"E,þÑý3 A‡Ú ^uÿÁ"2
À^ÿÁëIOÒ´ JTAG§ù MIPS ÀJE^ JTAG Ú 5ëmu
fXÚ§‡§‚3$1žvk^"ùÒ´NÁü‰ EJTAG Ï"
´NÁM‡E,Œ±^uDÚNÁì——˜«$138IXÚþæ^
,«DÚ?1Ï&NÁì"£~X¤€up?öŠXÚNÁìéŒU
ŒÜ©$1u8Iþ"ë„1 12.1.13 !k'5)§± )N4$1u
8IþNÁì¦^NÁü"
12.1 “EJTAG” ¡þNÁü
ü´ CPU S^uïNÁڋlóä] ˜‡tÑ8¤
EJTAG
8Ü"X·‚þ¡¤`§EJTAG ÏLE^z‡ SoC S®²Jø^u¡ÿÁ
 JTAG Ú é ˜‡ØKÿ‹ÌÅë{£¿dd 
1

¶¤"
ù˜‡NÁü‡¦kµ
• ÚÌÅÔnë——˜„´ÏL^˜ Ï^ä½öë‚NÁ
ÌÅ,«&"T SoC  JTAG Ú þ§Ï~¡Ù&
ì(probe)§½{¡&"
• ÌÅ/&“§››” CPU Uå"@´ÏL4 CPU l˜‡ dmseg S
«‰1“è¢y§3T« CPU ÖÑ´d&››"dmseg
´AÏSI dseg ˜Ü©§3NÁª¥‹m§X1 12.1.6 !¤
ã"
,&3‰XÚJøNÁ] ¡k§EJTAG ] Œ
±d$13/ CPU þX^‡NÁì¦^"·‚ ¡£Þ2ùù‡
¯K"
• NÁ;^É~"3 MIPS EJTAG ¥§ù´˜‡dAÏNÁªI“
Aχ?É~§\Œ±^ EJTAG NÁì5NÁ‡XÚ§$–§g
CÊÏÉ~?n§S"ë„1 12.1.4 !"
1 ,XJ\Gå§Jø˜‡ÕáuM‡ÿÁÚ  EJTAG ë¬4k^"

298
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û
• ˜½êþ EJTAG ä:§Œ±Õá?§5š/ŒD–êâM‡i›
ì " CPU ½öÖê➧½öÖ/ŒÚê↹Ä
2

ä:ƒ'§ešK—˜‡NÁÉ~"
ä:››M쌱kNõ‡§±–uJ±\? CP0 Mì8§¤±ÏL
;ìN dmseg£^u EJTAG Mìf«‰ drseg ¤"
• \Œ±l˜^NÁä:- sdbbp!˜‡ Ü&Ò DINT ½ö3
EJTAG &€= ,‡®›› žÿ˜‡NÁÉ~"
3

• ^u¿Û Ø´NÁžÿ§\Œ±^Tóä EJTAG ü±Ï5/


P¹c‰1-/Œ£PC 椧¿l EJTAG &¼ù &
Ò§ë„1 12.1.12 !"
3ù Ä:ƒþŒ±ïrŒNÁUå"
12.1.1 EJTAG {¤
£‡?nìœìž“£1980 cƒc¤§@žŒ±l˜‡3‚•ýì£ICE
——in-circuit emulator¤¼[âÝNÁ"ICE Ò´˜‡^5“ CPU 
‡§‘kãŒ;^‚C§wþ–˜æ¿÷>f‡e†"ICE Œ±– CPU
˜‰1-§ØӃ?´Œ±Êe5w"
ICE {žU k´Ï‡?nìš~[B ´€§¤±~~ÏL
˜‡¡+Œ Ø´†Åþ——ÒXÓ8U PC ‡?nìùϏ
é[B±–uجÅ̆þ"
‡4E, ICE >´$1Ú{ü CPU ˜¯o´éJ§‘X?n
ì„Ý5¯§œ¹C<"ICE Ýf˜m©ÒéB§y3B µ˜ d
‚þA{§NõmuìèÒ¬Ž{Ø^ ICE ?1NÁ"?\ 1980 c
“± §ù«œ¹Åì¤K ICE ½|"
¤± ICE ›EûI‡aqu EJTAG ÀÜ"\þ˜‡¡þNÁü §
r' ´»£ŒU› CPU „ݤuÛ܉Œ§¦Xڌ±„$
1"ICE ›EûÃN‰ë¤I‡&Ú$1^E,ÌÅ^‡"ù
:éЧ´¦‚- ˜‡¯Kµ¦‚‡oØØrù‡‡&9^‡ñ
 10 000 {§‡oUCJ|ª |õ"EâC€ØJ§J´S.þ
UC"ICE ›EûÁ㑱pd§Ò½|7m "
´ LSI úi1˜‡3¦‚¡þXÚ MIPS CPU ¥mM5/\? ¡þ
NÁü"3˜ ICE ›EûÏe§¦‚mu EJTAG 5‰§Ä‹8
U Øõ"´X8&¤Ø 1000 {§ Œ±\ÀJ?Û
^‡NÁìþóŠ"
^‡ó§“S.þ^“ä:”˜c5L«|±NÁ-§Ï~rM‡i›ì‰“* :§”ù
2

kÏu«©ü‡Vg"´¤k EJTAG © Ñ¡ä:§¤±·‚ùo"


½öX,‡Ó¯Û%`§3NÁXÚžÿØ%- e&
3

299
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û
12.1.2 N›› CPU
 CPU l dmseg «Ö-žÿ§&Ò¼››"ùfå5Ж
\ØØ– CPU ^‡xþ€5T«5‰1⌱§Ù¢Ø,"
•  ANÁìéēè§&¬^Ù JTAG 똘‡SÜI
“§òNÁÉ~\:£ 0xFF20 0200 ——TÐ u dmseg «"
&Œ±†)˜‡NÁä:½ö˜˜‡M‡* :–^‡-þ
"
• &Œ±ux˜‡ EJTAGBOOT ·-£e˜!2ù·-¤, e
g CPU E ƒ §CPU Òl dmseg ֍-"Ù¢k˜|A5Œ±4\
­#éÄ CPU ¿¼››§$–Œ±ÏL JTAG ëe1#^‡"
˜ &m©• CPU ux-§ÒŒ±4 CPU ‰?Û¯œ"AO´§Œ±
ux˜|-S5£l CPU Mì½öS¤ÖÑêâ¿ ²L dmseg ˜m
£&"
12.1.3 ÏL EJTAG NÁÏ&
\‰ÌÅÏL˜‡çÝf——&ë–ÿXÚ"¡ JTAG Ú 4
&U –¯ CPU SÜAÏMì"
JTAG IO´¡›Eûu²^5{z>´†ÿÁ§ŒõêE,¡
®² JTAG Ú Sü ˜m¶4ù Ú ÓžÑÖu^‡NÁ‡'#
Ú N´"3 1970 c“£JTAG )c“¤zO\˜‡¬N+ÑòwÍO\
¤"JTAG O´ ŒÝ~ÂìÜ6E,ݧÂìÄþ
Ò´˜‡£ Mì" 4

k˜‡››/êâÀÏÑ\‚!êâÑ\‚ÚêâÑт"·-èux
››M짌õê·-è==´ÀJØÓêâMì"JTAG ·-è¡
“-”§´²~ÚêâMì¶ip†¦^——‹^‡ó§“ùž
ÿù«{~~Úå· "
ù«š~{üM‡ÀJÒ´ JTAG Jø ˜«Ö EJTAG üS
ÜM쐪"EJTAG üJø eZ^-ø&^u?n CPU§L 12.1
édŠ ˜‡V)"
12.1.4 NÁª
NÁª´˜‡AÏ CPU G§é–É~ª£$uÉ~
ª¤"CPU 3NÁÉ~u)ƒ ?\NÁª"NÁÉ~Œ±d˜^ addbp 
éuØ )Öö§£ MìÒ´˜‡G1˜ °Ý;ì"˜ êâ‘Xž¨
4

?5ž§Ù§ Ñþ£˜ ±CÑ/"3M‡¥§£ Mì~~´¿1‚£Ò´`§Ü


G‡N3˜|‚þ¤"
300
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û
L 12.1: ^u EJTAG ü JTAG -
JTAG“-” £ã
IDCODE ÖÑ MIPS CPU ڇ——é^‡võ,§d?Ø
?˜Úù"
ImpCode ÖL«¢y = EJTAG À‘ "
EJTAG ADDRESS EJ-
£Ö/¤Ü3˜å§#N&AÚ31 12.1.6
TAG DATA
!¤ã dmseg «êâÖ Jø½öÂêâ"
EJTAG CONTROL &ÖI“Ú›› 8Ü"
EJTAG BOOT NOR- EJTAGBOOT -—eg CPU E žl&‰
MALBOOT 1¶d¡ ProbEn!ProbTrap Ú EjtagBrk  EJ-
TAG CONTROL ››§´\‡c[֍[
ÃþéÑäN[!"NORMALBOOT -¡E~
CPU éÄ"
FASTDATA ^5\„Ú&mõiêâDÑAϐ
ª"&  Ö  d EJTAG CONTROL(PrAcc) Ú EJ-
TAG DATA ¤ 33 Mì"
TCBCONTROLA –¯^5››“PDTrace”-‹lÑÑMì"ë„
TCBCONTROLB 12.3 !§´¿vk[0 ù Œ^ JTAG –¯M
TCBADDRESS ì"
-!-˜‡ EJTAG ä:Mì! Ü“NÁ¥ä”&Ò DINT ½öüÚ$
1£ ö'Aϧe¡ò{‡0 ¤Úu"NÁªG´Œ„§¿ Œ±
ÏL CP0 Mì Debug(DM) 5››——1 12.1.7 ![0 EJTAG 
CP0 Mì"NÁª£–É~ª˜¤Û¹BŽ¤k~5¥ä"NÁ
ª¥/ŒNk¤Cz§¦\Œ±–¯eã dseg «"NõÉ~3N
Áª¥Ñجu)¶êu)É~¬AÏ$1——ë„e˜!"
ëk·& CPU Œ±˜¤4NÁÉ~\: u dmseg «§$1
d&Jø‰-"XJvkë&§NÁÉ~\:Ò u ROM ¥£ë
„L 5.1§Ù¥‰Ñ MIPS ¤kÉ~\:"¤
NÁª¥É~
^‡NÁìéŒU?è¤;ÚuÉ~ª£~X3^‡¥u/Œ§
Ø´k/Œ½ TLB É~ºx¤"¤±3NÁª¥§Œ±Ün/Ñ3~
œ¹e¬ÚåÉ~éõ^‡µ¥ä!NÁÉ~£‰1 sdbbp ÚåÉ~Ø ¤
ÚNõÙ§^‡"
´kA‡u)3NÁª¥É~¬C¤i@NÁÉ~ ——é¦^
EJTAG &NÁìŒUkdŠ˜‡óä"

301
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û
3ù˜‡i@NÁÉ~¥§CPU a=NÁÉ~\:§E,±3
NÁª"Debug(DExcCode) P¹ i@É~ϧDEPC P¹ É
~ª“è­#m©/Œ"‡´NÁì?\NÁª vk鯘°
5 DEPC €§ù«‰{éNÁìÒÃ"´NÁìŒUѬ@‰œ
‡l˜‡i@NÁÉ~ˆ£§¿Ø´^ deret£§ŒU¬4\Ø·/òÑN
Áª¤¶ ´l DEPC ¥¼/Œ, ^˜^ jr -"
12.1.5 üÚ$1
üÚ$1 Debug(SSt) ˜ ¿ ^˜^ deret -4››lNÁª
ˆ£ž§d DERET ÀJ-ò3šNÁ‚¸e‰1 ¶, U^SÑe5

˜^-Ò¬u)˜gNÁÉ~"
Ϗk˜^-$1u~ª§ŒU—šNÁÉ~¶3ù«œ¹e§“U
^Se˜^-”Ò¬¤É~?n§S1˜^-§\¬˜‡üÚNÁ
É~§Ù DEPC •É~?n§S"
12.1.6 dmseg ;ìÈ諍
I‡^˜ ;ì˜m§NBٌþä:+nMì£é CP0 5
EJTAG
`õ ¤§„‡k&N^uÏ&˜m"ùã;ì˜m3 CPU ?
uNÁªžJ[/ŒNºÜNC§XL 12.2 ¤«"
3L¥§\Œ±wµ
• dseg: ‡NÁª;^S«§wþ­U CPU ?uNÁªžþ
ÜSؖ¯N«£kseg2¤"NÁ^‡Œ±ÏL˜ Debug(LSNM)
5Ö“î3e¡” kseg2 N/Œ——´NÁlÐöŠXÚA
¬;rùÜ©S«^uÙ§8"
• dmseg: ÖÑ´ÏL&¢yS«"´XJvk¹Ä&§
½öXJ DCR(PE) ˜"§@o–¯ùpÖÒÚÏ~ kseg2 Ó
?n"
• drseg: ´–¯NÁüÌMì|/"é drseg –¯¿Ølm
CPU"“drseg”¥Mì°Ý˜‡i§U^i°Ý£32 ¤\1Ú
;-–¯"
• fastdata: ´ dmseg ˜‡á§3ùp&NÖæ^˜‡Ǎ
p JTAG ¬ª&ÿƧü$ JTAG êâ6þ§#N¯êâ
DÑ"Ö¥ØùäN¢y[!"
5 XJ DERET •˜^©|-§©|-9ò´ø¥-Ѭ~‰1"

302
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û
L 12.2: EJTAG NÁ;«N£dseg¤
J[/Œ «/f« ˜/Mì J[/Œ
0xC000 0000 0xC000 0000

0xFF1F FFFF 0xFF1F FFFF


0xFF20 0000 fastdata 0xFF20 0000
0xFF20 000F fastdata 0xFF20 000F
0xFF20 0010 0xFF20 0010
0xFF20 0200 dmseg debug entry 0xFF20 0200

0xFF2F FFFF 0xFF20 0200


0xFF30 0000 DCR register 0xFF30 0000
0xFF30 1000 IBS register 0xFF30 1000
I-breakpoint #1 regs
0xFF30 1100 IBA1 0xFF30 1100
0xFF30 1108 IBM1 0xFF30 1108
0xFF30 1110 IBASID1 0xFF30 1110
0xFF30 1118 IBC1 0xFF30 1118
I-breakpoint #2 regs
0xFF30 1200 IBA2 0xFF30 1200
0xFF30 1208 IBM2 0xFF30 1208
0xFF30 1210 kseg2 IBASID2 0xFF30 1210
0xFF30 1218 IBC2 0xFF30 1218
dseg same for next two
...
0xFF30 2000 DBS register 0xFF30 2000
drseg D-breakpoint #1 regs
0xFF30 2100 DBA1 0xFF30 2100
0xFF30 2108 DBM1 0xFF30 2108
0xFF30 2110 DBASID1 0xFF30 2110
0xFF30 2118 DBC1 0xFF30 2118
0xFF30 2120 DBV1 0xFF30 2120
0xFF30 2124 DBVHi1 0xFF30 2124
D-breakpoint #2 regs
0xFF30 2200 DBA2 0xFF30 2200
0xFF30 2208 DBM2 0xFF30 2208
0xFF30 2210 DBASID2 0xFF30 2210
0xFF30 2218 DBC2 0xFF30 2218
0xFF30 2220 DBV2 0xFF30 2220
0xFF30 2224 DBVHi2 0xFF30 2224
0xFF30 2228 0xFF30 2228
0xFF3F FFFF 0xFF3F FFFF
0xFF40 0000 0xFF40 0000
303

0xFFFF FFFF 0xFFFF FFFF


12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û
• debug entry:Ò´NÁÉ~\:"Ϗ§ u dmseg§NÁ“èŒ
±3&ÿì;«¢y§#NNÁ˜‡vkNÁý3ÔnS
XÚ"XJvk&JøNÁÉ~?n§S——d&gC^
EJTAB CONTROL(ProbTrap) Ï^‡——NÁì\:ò¬
3 0xBFC0 0480£3šp„ ˜mÉ~\:NC¤"
12.1.7 EJTAG  CP0 Mì§cÙ´ Debug
3~œ¹e£äN`§Ò´Ø?uNÁªe¤§NÁü¥^‡˜Œ
„Ü©Ò´˜|n‡ CP0 Mìµ
• Debug k˜Ú›› §e¡[0 "

• DEPC gþgNÁÉ~±5­#m©/Œ£d deret -gĦ


^¤"
• DSAVE ´˜‡ CP0 Mì§==´Jø 32 Ö˜m"øNÁÉ~
¦^§±Bk˜‡Ï^M슧, 2^TMìŠÄŒÙ
§Mì"

ã 12.1: NÁMì¥É~Ï

ã 12.2: NÁMì——É~–I“
Debug ´E,ځk¿g"§½Â éõ §·‚r§©n|µã
12.1 ¥NÁÉ~Ï §ã 12.2 k'3–ÊÏÉ~£Ž‡u)´Ï
?uNÁª ØU¤&E§„kÙ{˜ƒ"“Ù{˜ƒ” a) ­‡
 §Xã 12.3 ¤«"

ã 12.3: EJTAG NÁM숇


ã 12.3 ¥£­‡¤µ
DBD: wŠ\NÁÉ~u)3˜‡©|ò´ø¥"dž DEPC •©|
-§Ï~Ò´­#m©(/"
304
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û
DM: NÁª——l^ru)NÁÉ~ž˜ §d deret E "ùp،
"
NoDCR: Ö ——XJ¢y dseg «K""XJT  1§@oؘÙ
.´@«a. EJTAG ü"
LSNM: XJ\Ž‡ dseg ž”§˜T  1§=¦3NÁªp1§±B
U–¯CXS«"ù¬¦ EJTAG ü››XڌܩØU^§
¤±ŒU3,‡A½ load/store c â^"
Doze: 3NÁÉ~ƒc§CPU ?u,«Ž>ª"

Halt: 3NÁÉ~ƒc§CPU ʎ ——ŒU3 wait -ƒ >š "

CountDM:  =NÁª¥ Count MìUY$1ž˜ 1"kžT Œ


§¤±\ÀJµÙ§žÿÖ §wŠ\ CPU No‰"
IEXI: ˜ 1 ží š°(É~""Žœ¹e?\NÁªž˜ 1§lmž˜"§
´Œ"˜ T ˜"§í´É~áu)µ3@ƒc§ÏL wã
12.2 ¥– Ҍ±wu) É~"

EJTAGver: Ö ——L²T¢yÎÜ5‰=‡‡"®Ü{Šµ
0 2.0 9@‡
1 2.5 ‡
2 2.6 ‡
3 3.1 ‡

DExcCode: \lNÁªpff?n?ۚNÁÉ~Ï——1˜g?
\NÁªž§T™½Â"ŒUŠÒ´ Cause(ExcCode) ½
Š§3L 3.2 ¥"
NoSSt: Ö ——XJvk¢yüÚöŠK 1"Ï~ÑküÚöŠ§¤±T
Ï~ 0"
SSt: T ˜ 1 K¦UüÚöŠ"

OffLine: ü‚§ CPU ~~Ø¢yT§ù«œ¹eÖя 0"


XJ¢y T §Ø NÁª± §ÑŒ±˜T  1 4 CPU £½ö
õ‚§ CPU ¥ CPU ‚§¤ÊŽ$1-"ùO8´#NNÁ
ì'4õ?nì/õ‚§XÚ¥˜Ü©?nì/‚§§ÓžE,4ù ?
nì/‚§33NÁª"U3NÁª¥˜"§¤±T  1 že‰1
deret§@oŸoÑجu)§Øš´-˜‡ Ü>uNÁ¥ä"

ã 12.1 ˆ‡µ
305
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û

ã 12.4: ;ìN DCR £NÁ››¤M숇


DDBSImpr, DDBLImpr: ©Oš°( store/load ä:——ë„1 12.1.11
!"DEPC ŒU•'>uä: store/load -˜^-"NÁ
ì½ö^r£½öö˜å¤ØئŒãå?n"
DINT: d EJTAG Ú þóÀ&ÒÚuNÁ¥ä"

DIB: - ˜^-ä:"

DDBS: - ˜‡°(;ä:"

DDBL: - ˜‡°(\1ä:"

DBp: - ?˜«a.NÁä:£~Úþ¡ƒ˜ÓžÑy¤"

DSS: üÚNÁÉ~"

“pending”I“£ã 12.2¤P¹ dNÁª¥$1-Úu´Ïš


°(¿ Debug(IEXI) ˜ vku)É~^‡"É~±–G§ù
±˜ §† Debug(IEXI) †˜"½ deret m˜"§džÉ
~®²G§éA– ˜""
†ØÓÉ~ÏéXü‡ µ
• IBusEP: žo‚ц"

• MCheckP: Åìu£Ï~´š{ TLB #¤"

• CacheEP: lp„ ÖžÛóè/ņèц"

• DBusEP: k ÜÖwo‚†"
3?ÛäN CPU þ§ù Ù¥, o´"§ÏéAÉ~o´°
(£°(É~o´á=?n¤"
12.1.8 DCR £NÁ››¤;ìNMì
Ø Mìƒ §„kõ EJTAG ››ÚI“ u˜‡
CP0 Debug
‰ DCR M짧ÏL;ìNNÁ;^ dmseg S« ˜ 0xFF30
0000§¤±3 CPU ?uNÁªžâU–¯"ˆ‡Xã 12.4"
DCR ¥NõÏL JTAG Œ–¯, Mì†&"
ù )µ
306
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û
ENM: £Ö¤w CPU —à£1 == Œ—à¤"
DB/IB: £Ö¤XJ EJTAG êâ/-M‡ä:Œ^K 1"éJn)Ÿ
o¬vk?Ûä: EJTAG ü"
PCS, PCR: XJ“PC ”A5Œ^§K PCS Öя 1"dž§PCR ´˜
‡n §½ÂªÇz 2 ‡±Ï˜g"œžë1
5+P CR

12.1.12 !"

INTE/NMIE: DCR(INTE) ˜"KBŽšNÁª¥ä£´˜‡ØÓu


ˆ«šNÁªŒ„¥ä¦U ¤"ù´ÄNÁìkžŽ‡$1S
Ø~§£½N‡éÑöŠXڃ'&E¤؎du¥ä ”››"
DCR(NMIE) ¶-šNÁª¥،¶-¥ä£éÐؤ"
E DCR(INTE,NMIE) я“1"”
NMIP: £Ö¤L«k‡ØŒ¶-¥ä3–§˜ lmNÁª Ò
¬£Šâþ¡ DCR(NMIE)¤A¥ä"
SRE: XJ¢y§T \"±“Ž^E "

PE: £Ö¤&››¦U ^‡Œ±Ö‡"˜ ž§NÁÉ~­


#•&›› dmseg S«"
12.1.9 EJTAG ä:M‡
EJTAG ä:ki›!êâÖM‡"XJ\˜ ˜‡ä:§@o
XJ–¯/Œš£ŒU´ê⚤ҬÚuNÁÉ~"
-Úêâä:´©m"EJTAG 5‰#Nvkä:M‡ü
£,ù{võŒ^?¤§´Ï~Ñk8‡ä:"ä:keA5µ
• =Š^uJ[/Œ Ø´Ôn/Œ"´\Œ±ÏL½‡š ASID
rä:›ü‡/Œ˜m"3öŠXÚ¦^õ‡/Œ˜m/§NÁ
ì‡ÚöŠXÚ܊âU‰1k^óŠ"
• ^˜‡Å /Œùè#N˜½§Ý š"

• ä:Œ±˜¤ŠâÖê⊠^‡>u"´êâ¯a^‡ÿÁ
ŒU—š°(É~——êâŒ^ušž§‡“Ž Y-)
®² "XJŽõ )°(ښ°(É~§ë„1 5.1 !"
k˜‡Û-Ú˜‡ê␛›Mì§N drseg «§=?u
NÁªž3L 12.2 ¥/ŒþŒ±–¯"¡Ù IBS Ú DBS§Xã 12.5 ¤
«"
ã 12.5 ¥Xeµ
307
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û

ã 12.5: IBS/DBS£EJTAG ä:G¤M숇


ASIDsup: eä:Œ±^ ASID š5«©ØÓ/Œ˜m/ŒK 1"éJ
Ž–?Ûy“NÁüvkù‡õU"
NoSVM, NoLVM: e\ØU^ load/store êâŠ5›ä:K 1"=3
DBS Mì¥k"

BCN: Œ^M‡ä:ê"-Úê␴©m"

BS1–0: L«®²šä: "NÁ^‡7L3iÿä: ˜Ø˜ "


TŒûu-½ê␘Jøä:‡ê"
z‡ EJTAG M‡ä:£“n” 0-3§ÀJ˜‡A½ä:¤ÏLo8‡©m
M옵
IBCn, DBCn: ã 12.6 ¤«ä:››Mì"

IBAn, DBAn: ä:/Œ"

IBAMn, DBAMn: ä:/Œ'ùè¶-"ù襓1”IPüØÑ'


/Œ §¤±°(šž˜TMì""
|©/4 IBAMm(0) éAuÑk”ý-/Œ 0§Œ±^5‹
l CPU ´Ä3$1 MIPS16 -§#N\û½,‡-ä:U3
MIPS16£½öš MIPS16¤ª¥u)"

IBASIDn, DBASIDn: ½˜‡ 8  ASID§Œ±Úc EntryHi(ASID)


'±LÈçÀä:§ùä:Uu)3 u(/Œ˜m£;
.éAu˜‡ Linux ?§¤§S¥"é ASID uŒ±©O^
IBCn(ASIDuse) Ú DBCn(ASIDuse) ¦U½öBŽ——ë„ã 12.6
9Ù`²"ù Mìz˜‡p 24 Ño´ 0"
DBVn, DBVHin: 3 load/store ä:¥‡šŠ"DBCHin ½Â 64
load/store š1 31–63 "ý 64 CPU  JTAG M‡ä:k 64
 DBVn M짤±ØI‡ DBVHin ——ƒ¤±JøTMì´
Ϗ, 32  CPU éuV°Ý?n죌U´2:ü¤¢y
64  load/store"
5¿§\Œ±ÏL˜i!Ï'¶- DBCn(BLM)  1 5BŽê
⚣±˜‡X/Œêâä:¤"
308
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û

ã 12.6: M‡ä:››£IBCn, DBCn¤M숇


y3·‚5wwã 12.6 ¥››Mì"
ˆ‡µ
ASIDuse: ˜ 1 žÿӞ' ASID Ú/Œ"
BAI7–0!NoSB!NoLB!BLM7–0 ==·^uêâä:µ

BAI7–0: Ñi!£byte (lane) access ignore¤——få5Í “"


Ù¢´˜‡/ŒLÈì"
\˜˜‡êâä:ž§\ŒUŽ‡3ƒAêâ?ۖ¯þÑ¥ä"
Ï~\¿ØŽ4ä:C¤6u–¯´˜‡i!!˜‡i$–•†é
ài^‡ä:µ´†˜ä:/ŒšÒ¬´@‡J"
 (\U Ó¼é,‡ ˜¤k–¯§\Œ±^/ŒùèBŽVi
±e/Œš§, ^ DBCn(BAI) IPViSÜa,i!µÐ
§´" L«a,i!§ 1  L«‡Ñi!£ùÒ
´ÏPζ5{¤"
DBCn(BAI) ^ 32 ½ 64 êâo‚Si!Ò?趤±‡%§
êâi!/ŒÚi!o‚?Ò'XɗàK"
NoSB, NoLB: ˜"©O¦U store/load ä:"
6

BLM7–0: êâ'ži!ùè"" “L'Ti!§1 “LÑTŠ"


˜T 1 ÒBŽêâš"
Ù{Óž·^u-Úêâä:µ
TE:  1 Š PDtrace -‹l>u진1 12.1.3 !"

BE:  1 -¹ä:"TE ž"±ÏMì‘Ř —Jb


ä:µØ‡#P駘 œ
12.1.10 n)ä:^‡
(½˜‡M‡ä:3Ÿožÿuÿä:^‡9>uÉ~§9NõØÓ
Ú˜"
3¤kœ¹e§XJ\®²?uNÁªÒØu)ä:. . . @o‡>uä:§
I‡÷ve¡Ü^‡µ
aú“1 L«¦U” \ÎÜÜ6˜ "ùp^ 0 L«¦UÐ?3u"Š“LÖžä:Ñu
6

)§'åä:“lØu)”·Ü‰%@Š"
309
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û
1.ä:››Mì¦U IBAn(BE)/DBAn(BE) ˜ "
2. §S!êâ)/ŒÚä:/ŒMì IBAn/DBAn ¥
ƒš§IBAn/DBAn ƒA/Œ¶-Mì ""
3. ‡o IBCn(ASIDuse)/DBCn(ASIDuse) "£ù·‚ÒØ^'
%š=‡/Œ˜m¤§‡oc$1§S/Œ˜m ID§= En-
tryHi(ASID) u IBASIDn/DBASIDn pŠ"

k'-ä:Òù §´éuêâä:§\I‡«©´Ö„´
§UŠâVi±e/Œ«©–¯µ
4. XJ´\1¿ DBCn(NoLB) "§½ö´;¿ DBCn(NoSB)
""
5. T\1½ö;- ViSÜéA DBCn(BAI) "˜‡i!"

XJ\¿ØŽ' load/store Š§@o\r DBCn(BLM) ¤ 1 Ò


1 "XJ\„Ž‡ÄŠ§@o„‡÷vêâ'^‡µ
6. \1½ö;êâUÑy3XÚo‚þ‚ª§† DBVHin ± DBVn
¥ 64 SN¥§@ 3 DBCn(BLM) ¥éA "z˜‡ 8 |
ƒš"
Òù "ƒE,§ÜÜ6"
12.1.11 š°(NÁä:
-ä:Úêâä:´Šâ/Œ^‡çÀ§>už DEPC •š
-"(ƒ`§ù«É~áu31 5.1 !?Ø¿Âe“°(É~”"
MIPS NX( CPU ŒõêÉ~Ñ´°("´Nõ MIPS CPU é
load/store ?1`z§#N CPU ˜†$1‡^ load êâžÿ§ùŠâê
âŠçÀêâä:Ò´Ø°("M‡iÿä:šž§=^-3
$1§NÁÉ~òu)3=^-£Ï~´-6p-¤þ"ù«œ
¹NÁ^‡7L¦þ{?n"
12.1.12 EJTAG  PC 
EJTAG5‰Ú&C‡¥k˜‡ékdŠ‚€§PC Jø
˜«ØK§Sª5Â83$1XÚ¹ÄÚO&E"ÏL w
DCR(PCS) ¥· Ҍ±éÑ\ CPU ´ÄJøù‡õU"
PC M‡±Ï5/wc PC Š§r@‡ŠP¹NÁ&Œ±u
¢/", Ò´d^‡E˜ãžmS†ã§U £3ÚO¿Â
þ¤4§S w CPU 3Ÿo/s¤ õž¨±Ï"ù‡õUØ=k^
310
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û
?§ Œ[ÑÙGµ±cÐõcXÚ^LÒ´Äu¥ä PC §ù«
ªé§S$1kK"¤±kNõóä£~X GNU  gprof¤Œ±†)ºù
aêâ"
 PC ˜? CPU ƒ §Ò¬ëY$1"$– CPU Ê3 wait 
-£s¤3–þžmE,ŒU´‡ÿþžm¤ž§Ø¬ÊŽ"3˜‡;
.¢yþ§\ŒU¬Àz 32 ‡ž¨±Ï˜g½ö霹eÀJz
4096 ‡±Ï˜g"Q,§ëY$1§E ±Ï"ŽŒŠ´‡Ð
¯"
3z‡:§3T±Ï¤-/Œ£eÍ-¤§Ke˜^ò
¤-/Œ¤˜3˜‡ JTAG Œ–¯Mì¥"ªÇd DCR
M쥘‡››"
M‡Ø=;-/Œ 32 § ;c ASID£ùŒ±)ºJ
[ PC¤„k˜‡[\ 1 “#” §&Œ±^§;éӘ‡­EO
ê"
12.1.13 Ã&ì¦^ EJTAG
EJTAG üŒ±d˜‡$138IXÚþDÚNÁì¦^§AO
´§Œ±^5ïöŠXÚØ%S˜NÁõU"´Ïu² EJTAG ̇´
 ‰&ì=&¦^§ù‰kA‡¯KI‡?nµ
• ?nNÁÉ~µvk\&¿¦Už§NÁÉ~\: uزp„
 kseg1  ROM « 0xBFC0 0480 /Œ£XJI‡u´Äk¦U
&§Œ±Ö DCR(PE)¤"\‡r“è˜T\:§, ò››=£
\NÁÉ~?n§S§TÉ~?nŒU‰? öŠXÚSØ"
• 3SØ¥ÏLN^?\NÁªµ\ØU†ƒ†NÁªµUÏL
NÁÉ~?\"´\I‡?\NÁªâUw dmseg ;«§±BŒ
±ä:››Mì˜aÀÜ"¤±éuX^‡NÁì§\I‡˜
«{5N^NÁªNÁì|±~§"
ùÒI‡“XÚN^”˜«NÁÉ~‡§æ^‡\ sdbbp -¢y"N
ÁÉ~?n§SI‡«©ù NÁìXÚN^ÚÙ§NÁÉ~——Œ
U‰{Ò´ÏLw DEPC ¥ˆ£/Œ5«©"NÁìXÚN^ë
ꌱ˜Ï^Mìp"
aq§\ØU†ƒ†ÑNÁª——‡lmNÁª§\I‡‰1
deret -"
3k œ¹e§\ŒUŽ‡3Ï~Ø%‰1NÁìŒÜ©µ¤±3
Ïä:š½NÁ- á6?\NÁªƒ §NÁª^‡Œ±?Ö
~ CP0 Mì±[˜‡aqDڐªÉ~"
311
12.2. “EJTAG” ƒcNÁ|±——ä:-Ú
1 12 ÙCP0MIPS
* NÁ: ——NÁÚ¿Û
• =·^uJ[/Œä:µ5¿£‹š EJTAG  CP0 * :ØÓ¤¤k
 EJTAG ä:ÑóŠuJ[/Œ§Œ±ÀJ\þ/Œ˜m ID (ASID) ?
1›"
• lÉ~ª½öÙ§“š{”/?nNÁä:µ¾˜wþ–´‡Œ¯
K"NÁä:´áuÉ~§´Ï§‚áu“‡?É~”§¤±¿ØUì
SØ٧ܩ5KÑý"Ù¢ùÚ·‚c¡?Ø´˜‡¯K"éŒ
U˜‡|^ EJTAG /ÅNÁì§SŒõêžÿ¿Ø$1uNÁÉ~
ª"¤±NÁÉ~?n§S=3G!, 3S/;ˆ£
/Œ!±9^˜‡< deret á\~pA?£Ø%¤Ïm§$
1uNÁ"
,kžÿ§NÁÉ~\:ŒU5gu,‡ˆx/——²wÒ
´5g®²$1uÊÏÉ~ª“è"ù«É~NÁìØØ4
%§˜„ØU{ü/N^Ï~Ø%~§"NÁìŠöI‡OŽ¦
‚3õŒ§Ýþ|±å²É~NÁ"
12.2 “EJTAG” ƒcNÁ|±——ä:-Ú
CP0 * :
NX(3 EJTAG NÁüÑyƒc®²3 Nõc§¤±„k
MIPS
˜ DÚNÁõU"ù ) break -§ù‡-´{ü—˜‡É~§
ӞPkéõ™)º §ŒdNÁ^‡DƒÙ¿Â"
´Nõ CPU Ӟ¢y õˆo‡M‡* :§dA‡ CP0 Mì
››"z‡* :½˜‡J[/Œ§Œ±^u3zg!;Ú\1öŠ¥
u§XJ/ŒšÒ¬ÚuÉ~"
¿š¤kNÁìÑ^M‡* :¶k ŒUØ^§,˜ ¦^
EJTAG õU"
† EJTAG ä:ƒ'§* :ØU?1 /Œšµl5Ø´êâ¯a
¶CP0 * :Œ±óŠu-½öê␣k I“Œ±››äN* :
áu@>¤", §* :>u ´ÚåÊÏÉ~§¤±ØU^uNÁÉ~
?n§S"
 CPU ®²?uÉ~Gž£ SR(EXL) ——½ö†Ø½NÁ
É~ ——®²˜ ¤§E,Œ±š* :^‡"dž?nÉ~¬—Ã^
·Ï§¤±É~í´ ¡"Ž‡u)É~¯¢P¹3 Cause(WP) §
CPU ˆ£~öŠž* :É~Ò¬u)"
* :MìXã 12.7 ¤«"
* :/Œ=‘oCVi£li!¤§¤±k/Œ 3–31 ë†
š"3 64 CPU þ§WatchLo O 64 ±BU ½Â˜‡J[/
312
12.3. PDTRACE 1 12 Ù MIPS NÁ——NÁÚ¿Û

ã 12.7: WatchLo Ú WatchHi M숇


Œ"
Ù§MìXeµ
WatchLo(I,R,W): ¦U* :u——e WatchLo(I) = 1 u§e
WatchLo(R) = 1 uÖ§e WatchLo(W) = 1 u\öŠ"ù
?¿|ÜÑ´Ü{"
WatchHi(M): ÖY ——e 1 L²–„k˜é* :Mì"

WatchHi(G): Û——T ˜ 1 KšžØÄ ASID§„e"

WatchHi(ASID): ˜T£WatchHi(G) "¤š/Œ˜m–¯"


¦^ MIPS TLB öŠXÚ3 EntryHi(ASID) p/Œ˜m§X1
6 Ù¤ã"

WatchHi(Mask): T 1  L« WatchLo(VAddr) ¥ƒA Œ±Ø


^n¬§#N\Ó¼éàl 8  2048 ƒm 2 ˜ŒS«–
¯"
WatchHi(I,R,W): * :É~ Öù éÑÉ~´du„´Ö½ö
öŠÚå"^‡‡˜Øù âU2g¦^§ù ¢yæ^
´“ 1 ˜ 0 ” ——Ò´`§é WatchHi(R) ˜"žÿ• WatchHi 
\˜‡ 1 þ 1 Š"ù‰Œ±4\òl WatchHi Ö5Š†2
£ҐB/¢y˜""
12.3 PDtrace
PDtrace ´£Ùc¡0 ¤ EJTAG NÁüN‡§Œ±‹l§S‰
1^u± ­"‰1‹lŒ±3¡S;쥽öæ^˜ чÛ
Ap„&-E⢞£˜&"
@‹lóäP¹‰1/Œ£PC¤§´ PDtrace XڏU‹lÖ/
Œ$–ÖêâŠ"
‹l‰1¿ØI‡éõêâ"b½©Û§SPkXÚ?›“è§
¤±^S‰1žI‡ CPU ^Sr õ¶‘^‡©|ž§I‡
^‡´Ä÷v"´éuMìa=ƒa-§‹lI‡P¹/
Œ"
313
12.4. 5UOêì 1 12 Ù MIPS NÁ——NÁÚ¿Û

ã 12.8: PerfCtl M숇


‹l&EP¹¡þ;ì,{ü¯$¶´du¢S¡þ‹l
ÀìÑé§Ï~UP¹§S$1˜ãžm"
r‹l&Ex&ž§ŒUkŒþ‹l;ì£A›$–Azîi
!¤"ù‡¦µCžkAŠÚ ë‹lêâ‚"‹lêâ)¤¯±–ë
„Ý‹Øþ£ù«ŒU5錤ž§\‡oü$ CPU „݆ë„Ý‹þ§
‡o¿ï˜ ‹lêâ"
EJTAG ä:E^uJø[âÝ‹l››§‘A½ä:žÄƒä
½ϋlêâ6"
Ak&øAûé PDtrace a,§¤±ùpØõù "ÙÃþŒ±
l MIPS úi£www.mips.com¤"
12.4 5UOêì
5UOêì3@p4^‡ÚM‡ó§“ 5UN`£ó NÁ¤
éэõk'XÚ1&E"z‡Oêì3\äN CPU À½¢yeZ¯
‡ƒ˜u)ž4O"
y“;. CPU Pkü‡5UOêì"Œõꌱé~„k^¯‡O
굞²žm±Ï!¤-!p„ ™·¥"%p‡P4˜:§CPU
O5ÒJ±›EÚy§O\5UOêìƒa“ Œ”õU?1Oê
¯‡§4ŒUÒ´@ N´Oꯇ"N´Oꯇ¿Ø˜½TÐ4^
‡ó§“wå5@og,§¤±‡±%>&Ú~¦Ý閯‡£ã"3
\ý(&´3é,‡¯‡?1Oêƒc§Ün‰{´3ɛ^‡eéOê
ì1?1¢"
z‡ 32 Oêìъk˜‡››Mì§Xã 12.8 ¤«§Ù¥µ
M: Y ¶e 1 L« ¡„k˜é5UOê웛/OêMì"

W: XJOêMì´ 64 K 1"˜„ØŒU"

Event: û½éŸo¯‡?1Oê——ù‡Lûu\ CPU§\I‡


փ'Ãþ"
IE: e˜ KOêì“ÄÑ”1 31 žÚu¥ä"ùŒ±^5¢y*ÐO
꧴õ/^u£‡¯k·ýOêì¤3¯‡u) ˜½gêƒ
Ï^‡"

314
12.4. 5UOêì 1 12 Ù MIPS NÁ——NÁÚ¿Û
U, S, K, EXL:©Oé^r!+n!Ø%ÚÉ~£= SR(EXL) ˜ ¤
¯‡?1Oê"\Œ±˜¤ù ?¿|Ü"

315
1 13 Ù UþKe‡~
~——GNU/Linux
Ÿo˜'uOŽÅNX(Ö§˜†ùXNX(§eض˜efë
YAÙSNÑ=ù,‡äNöŠXÚQºý4<k:¹ØXÞM§aú–Œ
´àч§„7¶UYÖe§\Ò¬uy§Ù¢AT`aúý–´“UþKe
‡~~!” ¨¶iÒ´B£Ž¤d(Linux)"
žf·úú5"CPU Ò´öŠXÚ^"˜‡ CPU “NX(”Ò´£
㘇k^ CPU 1§ ˜‡k^ CPU ´‡3öŠXÚ››e$
1§S"¦+$1u MIPS öŠXÚéõ§Linux duÙúm5 äkÕA
`³"?Û<ь±e1Ù “è§?Û<ь± )§´NóŠ"
?ÛöŠXÚÑØL´˜ §S8ܧ˜ h²§S——ƒéŒõê
^‡ ó——ÄuõcïÄJõÑgŽƒþEå5§S8Ü"öŠX
ÚAAO/­½£ØkŤÚS£Ø4, §SZ™²öŠXÚǯ
œ¤"
é“Linux”ù‡¶i(^{´^5==˜‡öŠXÚSاTöŠ
Xځm©d Linus Torvalds mu§Ù‘ {¤§No`Q§„Ò´{¤"X
ÚÙ{Ü©£‡'S،õ¤Œõê5gugd^‡Ä7¬£Free Software
Foundation¤3 GNU áe|„‘8"Œ[y3kž#P ù˜:§r‡X
Úщ“Linux”"
ùüÜ©@Ñ´ u3 1970 c“d¢¿mu Unix XÚ"N
´Ï¢¿ú§vkû’dŠ§3ž±¤Ãc~“m˜” ª•ˆ
‡ÆâÅ2©uÙ^‡"´§¿Ø´“m˜ è” ——Nõ§S 3Œ
Æp Unix óŠ§(Juy¦‚ z‡o¿” §‡o¢¿£9Ù
U«ö¤Pk"ù‡L§¤‘5 òª-u<‚5˜‡“ýgd”O
“¬"
 e' Ü©Ò´SØ"SØáuš~J§S§Ù¤±ö
 Ï u©z¡µöŠXÚSØú@áuÆâïĉƧ Æ
â.F"U ‡ Unix§ Ø´­#Mï Unix" Unix Œ6´–•u˜‡
.!¬zöŠXÚ§d²(©m܇ï ¤¶3ù‡Ä:þï
316
13.1. ÄVg 1 13 Ù UþKe‡~~——GNU/Linux
öŠXÚl5vkL2^r+N|±" 1

Linux ‘ѴϏ§´˜‡\5­¢^‘8"Linus ±9¦muº


ŠŽ‡˜‡U £Äk´3 x86 S¡XÚþ¤^ÀÜ" Linux S؆5g
ª¤gd^‡ BSD 4.4  “¿žÿ§BSD |±öjû@î‚
‘8|„+n7،"´ Linux «ˆ¤k'muº‚£§'
BSD ¦‚‡m˜õ"Linux uÐ4×„"kžÿ Linux ¯„uЏ´Ï
 Linux < š~WuB BSD “è"Øȱ Linux Ò‘Ñ §Ù|„+n
‘ƒUõ"
13.1 ÄVg
‡Žn),‡›¬§\I‡U éÐn)Ù+;[¦^˜ â
ŠA½¿Â"\AON´\®²´äkØÓ¿gâŠt
æ"Unix/Linux {¤ 6§/¤ éõäkAÏ¿Âc"
• ‚§µ·¤“‚§”Ï^½ÂÒ´“Uì§S ½gS$1
˜|OŽÅ-"”Linux SØk²(‚§Vg£éuz‡‚§§k˜
‡ struct thread_struct¤"Äþ´Ó˜‡Àܧ´U췽§
. ¥ä?n§S´˜‡TÐ/^ ¥ä‚§‚¸5$1AÏ
‚§"ü‡½ÂÑkdŠ§7‡ž·‚^“Linux ‚§”ù‡c\±«©"
Linux 9O‚§£8c·3‹iªÅþk 134 ‡‚§¤"Œõêù
‚§éAu˜‡¹Ä§S——´„kÐA‡^uAÏ8‚§=
$1uSا¿ k A^§SPkõ‡‚§"
SØÄ󊃘ҴNÝ ——egÀJ=‡ Linux ‚§$1"ë„
e©'uNÝìSN"
• ©‡µ˜¬k¶iêâ"3 GNU/Linux p§§SÚg?§± ­.
‹Ñ´ÏLÖ©‡¤"©‡Ò´\\êâ± U ÖÑÀ
Ü"´kë°Ä§SAÏ©‡µlÙ¥˜‡ÖKêâ5
u §é,˜‡\K\êâ)ºêiѪx(ì"Linux
Sؖ•u;õ#XÚN^§„Jø 4A^§S¼k'SØ&
EAÏ /proc ©‡"
• ^rÚXÚN^µLinux A^§S$1u^r§= MIPS CPU $A
?G"3^r§^‡ØU†–¯Sؤ?/Œ˜m§§Uό
¤k ˜ÑNSØÓ¿A^§S¦^/"3^r§\ØU$
1?nì" CPU ››-"
k <(¡ Windows/NT ——l Microsoft Windows Œõêy“‡——Pk‡SØ"
1

@N´ý§´3§r•Ú£­.´þ§w,” .z½ö¬zA5"

317
13.1. ÄVg 1 13 Ù UþKe‡~~——GNU/Linux
GNU/Linux$1u^rA^§S“è~~‰^r(userland)"
‡lSؼ?ÛÑÖ£~„Ò´Ö©‡¤§A^§Sч‰1XÚ
N^"XÚN^´A¿‡\É~§dSØÉ~?n§S)º"É~ž
ƒ†pA?ª"
ÏLXÚN^§Linux A^§S‚§Ú?upA?ªSØ£,3
ùp$1´&?“è¤U ^„$1"XÚN^(å §lÉ~“è
ˆ£9˜^ eret§T-(Ӟ¤ƒ†£^rڈ£^r“
è"
• ¥äþe©µLinux ¦þ;BŽ¥ä" Linux $1ž§3?˜ž§˜
‡ CPU þk˜‡¹Ä‚§µ ¤±¥ä3¤?ֈ£c§˜†/^w
2

þáuT‚§‚¸"¥ä?n§SN^“è?3¥ä‚¸§kNõ
¯œù«“èÑØU‰"~X§ØU‰?یUI‡–Ù§^‡¹Ä
¯œ"XJ\ Ñ\~§‡r¤k P¹˜‡©‡¥ §@o\Ø 3

Ul¥ä?n§S¥N^©‡ÑÑ"
‰ù˜:kÐ{µ~X§\Œ±4 ¥äSüˆ2˜‡‚§5
¼Â ¿P¹"
• ¥äÑÖ~§£ISR¤µ°Ä§S¥. ¥ä“èÏ~‰ ISR"
3 Linux ¥yŒ[±ù “è{áµXJkNõ󊇉§Œ±Ä
^e˜Ù0 ˜«“eŒÜ(bottom half)”"
• NÝ쵘‡SØ~§"öŠXڑo˜‡ÒX‚§£'`§vkϏ
™¤ I/O DÑ {l¤L§TLUì`k?üS"`k?´Ä§
±Ï5­#OŽ——̇´ yžm$1OŽØ¬LõÓ^
CPU ±–uÃ{A¯‡"A^§SŒ±ü$gC`k?ÌÄ?\
§´Ï~ØUJpgC`k?"
3?Û¥ä?nƒ §Ñ¬N^NÝì"XJNÝìuy,˜‡‚§A
T$1Ŭ§Òʎc‚§$1`‘ö"
P Linux SØØ´sÓª(preemptive)µ˜ ˜‡‚§3SØ$1§
Ò4§˜†$1‡ogž¦­#NݣϏ–,‡Àܤ§‡o›
›D£^r——k@ž§SØâ¬烆"
šsÓªSØN´?"\SؓèSŒU‡Ä3$1Œ˜
ž¥ä?n§S¿ ‹ä§´\§Ø¬3\$1Œ¥žÿ
Ù§Ì6SØ“è¿ ‹ä"´šsÓªSØ— LÝò´§ü$
A5"
2 ҎSØ3'Ū¥–§k˜‡3‰1 wait -‚§"
3 lSÝwNØ´˜‡ÐÌ¿§´E,. . .

318
13.1. ÄVg 1 13 Ù UþKe‡~~——GNU/Linux
\k˜‡ SMP SØ£džü‡ CPU Ӟ‰1Ә‡Sؤž§d¿
1‚§ƒpŠ^¤‘5ãŒgdÝÒԔ "‡4 SMP SØ^|$
1§I‡‹lAz‡ŒU‚§mƒpŠ^¿^·£?1o"SMP
££A3¤kœ¹e¤¤3/§TÐÒI‡#NNÝìʎ˜‡
3$1S؂§ $1,˜‡‚§µù‡‰“SØsÓ”"
y3SØ?§˜‡­‡Ôö‰8Ò´éѓèS¥@ 7LžB
ŽsÓ/"IPù«“èå©Ú(å÷½Â¬ŠâSؘ C
z§±B3ü?nìÚ SMP õ?nìXÚþÑU($1"
• ;ìN//Œ˜mµŒ^;ì/ŒäN Linux ‚§N"‚§
/Œ˜mÏL‚§• mm_struct 5½Â"
éu£‡ MIPS NX(þ Linux öŠXÚ£d {¡“Linux/MIPS”¤§
3 32 ?nìþ§/Œ˜mpŒÜ£1 31  1 /Œ¤U3SØ
AªeÖ"Sؓè/êâÏ~ u¡ kseg0 ùÜ©˜‡
á§ù¿›XSØ؝6u TLB /Œ=†"
/Œ˜m^rÜ©éuz‡^rkØÓN——k@ 3wª
õ‚§A^§S¥Š‚§â^r/Œ˜m£=§‚•Ó˜‡
mm_struct¤"¤k Linux ‚§ÑÓ˜‡SØ/ŒN"
DÚ$1uü‚§A^§S¥‚§3˜‡ØÓu¤kÙ§‚§/
Œ˜m$1§ù´Pª Unix ƒaXÚ¤¡“?§(process)"”
3?¿‰½žm§A^§S/Œ˜mŒÜ©¢SþŒUvkN§
$–3S¥ŠvkêâL«"ÁãùÜ©/Œ¬—˜‡ TLB
É~§É~döŠXÚ?n§É~?n§S\1"”êâ¿3ˆ£§S
c˜·N"ù,Ò´§J[;ì"
• ‚§|µ uӘ‡;ìN‚§8܉˜‡‚§|"˜‡‚
§|kü‡½õ¤ ž§ù ‚§ƒp܊5$1Ә‡§S"‚§|
3 Linux ¥ŒNƒuP Unix XÚ¥¤¢“?§”"
• p ;ìµ512 M ±þÔn;ì£Ø+ý´ŒÖS„´
;ìN I/O /Œ¤ØU†ÏL kseg0 £²Lp„ ¤Ú kseg1
£Ø²p„ ¤I–¯"3 32 CPU þ§512 M ±þÔn;ì´
Linux ¿Âþ“p S”§UÏL TLB N–¯"3 MIPS CPU þ§
\Œ±ÏL½ÂØO†Ñ“B#(wired)” TLB \§M[
ÈN"´ Linux ¦þ;¦^é¯Ò^] §¤±Ì6SØ
“è¥;¦^B# TLB \"éu Linux/MIPS§p SNÏL
=žMï TLB ‘\5Ä‘o"
• §S¥ÚA^§Sµéȱc§3 Unix ƒaXÚþ§SÑ´¬“

319
13.2. SØ© ( 1 13 Ù UþKe‡~~——GNU/Linux
è§$1ž7LÜ\1"ÏLé “è?1?È¿†˜ ¥¼êÊë3
˜å5ï§S"¥¼êÒ´dóäóJøýkïÐ?›“è"
´ù‰kü‡¯K"˜‡´¥“è~~'^§A^§S„Œ§¤k
§SNÈÑ)ä ",˜‡Ò´XJøAû? ¥¼ê¥˜‡"
€§Øšz‡^‡‘o< Ñ­#?ÈgC§S§ÄK\ØUlù‡?
¥¿©¼Ã"
O“{´§A^§SïžØ‘¥¼ê""”¥¶iP¹?A^
§S§ù\1쌱é7L¥¿3§S\1žÿòö¿3˜
å"‡T¥UYJøӼ꧘ƒÑvk¯K£k‡¥‡‹l
XÚò¬#N¥õUÅìüz§´@®‡Ñ·‚‰Œ¤"
ù‰‡GÑ:“d"3\1ž\‡lˆ‡¡ä£z‡¡äŒU´üՍ
#¤ó¤‡§S§ z‡Ü©(ƒ/Œ3?Ȟ´ØUýk
"\Ã{¯ký=‡ ˜Œ^u\1,‡äN¥"$1ž\1ìU
‰òz‡¥\1e˜‡Œ^˜m§ùë¥å© ˜ÑÃ{ý
ÿ"˜‡¥¼ê?›“è7L´ ˜Ã'“è(position independent
code) PIC ——Ø+ٓèÚêâ½ 3J[/Œ˜mŸo ˜ÑU
($1"
·‚ò31 16 Ù?Ø PIC “èÚA^§S/Œ˜mE"
13.2 SØ© (
l,«*:5w§SØÒ´ÏLÉ~?n§SN^~§8Ü"MIPS CPU
þÉ~u) ?\“É~ª”‚¸4rŒ mé´§S
éØÐ"¤±3SØz‡\§\‡k‡aq áéÄL§§džz
‡“ ”Ee˜ 7‡‚¸"d §\lSØòў§\±ƒ‡^S2g
²LÓ §3  eret -ˆ£^r§Sƒcá6/BLÉ~ª"
S؈«Øӂ¸Ñ´õ²L°%E^‡|¤§ù3˜½§Ý
þ‘Ö É~?n‚¸˜ ہ"4·‚Uì?\S؞g.•þ^S
ÑA:µ
13.2.1 É~ª¥ MIPS CPU
AÉ~ƒ §;X CPU á=˜ SR(EXL) ——?\É~ª"ØØ
Ù§ SR ˜XÛ§É~ªr› CPU ?\SØAª¿'4¥ä"„
k˜:§Ø ˜«4Aϐªƒ § CPU 3É~ª¥ØUAi@É
4

~§"
4 MIPS {¤þk ۓ‚€|^É~ª¥AÏÉ~1——´ Linux Ø^ù "

320
13.2. SØ© ( 1 13 Ù UþKe‡~~——GNU/Linux
É~?n§SÐA^-Ï~´ CPU Ï^M슧٥Š
ŒUéuÉ~u)ƒc^‡k­‡¿Â"§‚3¥äu)ž3$1
?§Ø%Òþ"MIPS 5‡¦Mì;öŠ–‡k^˜‡
Ï^Mì§ùÒ´Ÿo¶ k0 Ú k1 Mì3‰É~?n§S¦^
Ï"
É~?n§S‡, '  CP0 MìµSR 3É~?n§Se
˜Ú¬?U§´·‚ˆ£žA±‡ SR ŠÚf?\É~žƒÓ"
˜ ¤ù˜Ú§·‚ÒŒ±ÏL?U SR lmÉ~ª§´·‚,'4¥
ä"
– x86 ƒa CISC CPU vkÉ~ª¶MIPS É~ª¥óŠ
3 x86 ¥dM‡¤£¢Sþ´w؄‡“褤"x86 ˆ¥ä½g€?
n§SžÿM쮲 "
$1u MIPS É~ª^‡Œ±wŠ)¤ ˜‡J[ŧdTJ[Å5
KI3;É~ƒ ¥ä^r§SG§±9KI 5ˆ£
eret -ŠOž¡Eù G"§S éu3É~ª¥1‡AO>&"
É~ªÄþ uyS؂§S^‡£››ƒ §¤±É~“è
U4>&/†SØÙ{Ü©p"
3¢yXÚN^É~ù‡A~¥§ŠØI‡ýÏ^M죐‡
É~?n§SØ\ s0–s8 “(saved)”Mì=Œ¤"3XÚN^½?ÛÙ
§š¥äÉ~¥§\Œ±†N^$1u‚§‚¸“è"
k AO{üÉ~?n§SlØlmÉ~ª"ù«“è$–Ø7
M죐‡;¦^õêMì¤"˜‡~fÒ´1 14.4.8 !¤ã“TLB ­
W”É~?n§S"
kŒU——,y3é„ ——4˜‡¥ä?n§Sá6$1uÉ~
?§¤óŠ ˆ£"´ù¥ä?n§S3öŠXÚ?Ø´ý
Œ„§7L‡3,˜:Úu˜‡ Linux Œ£O¥ä§±B4p ^‡?nÙ
êâ"
13.2.2 '4Ü©½Ü¥ä MIPS CPU
X·‚3e˜Ù¤w§¥ä~§òÑÉ~ª „UY$1ž–
'4Ü©¥ä"
'4¤k¥ä$1´˜‡[B´kyü CPU ،sӐ{£^
‡?u¥ä'4Ïms¤žmû½3€œ/e¥äò´§z‡k¢
žå°Ä§Sчrù:Ä?¤",3k1‡ CPU œ¹e
'4¤k¥ä¿ØU“Ž­\"
{ü!á ISR Œ±ÀJØ­#¦U¥ä ˜†$1(å——Linux
Œ±|±ù˜:§¡ƒ¯„¥ä?n§S"5þ ISR ž˜ SA_INTERRUPT
Œ±ù‡1"´Œõê ISR ‡3¦Up`k?¥äœ¹e$1˜ã
321
13.2. SØ© ( 1 13 Ù UþKe‡~~——GNU/Linux
žm"
kŒU˜Ài@¥äO¥ä¥ä"Á48£¿›XæÒÄ
Ñ¿ªØŒ;$¤Ø¬u)§Ï Linux y3z‡ØÓ¥ä`k?
õUk˜‡¥ä?Ò"z?êâ7LŒ¥äi@&
Eج‡Ñ˜‡‚§Ø%Ҙm"
13.2.3 ¥ä‚¸
¥äu) §=¦3¥ä?n§S­##NŒõê¥ä¿ ïáå 
 C $1‚¸ƒ §¥ä“è,‡É›§Ï§/^ Ћä‚
§G£9ÙØ%Ò¤"
,?1¥äÑÖ´O<󊧆¥äu)ž3‰1‚§ƒm¿v
kk7,éX"¥ä/^ ‹äɳ‚§Ø%Ò¿ M)3T‚§
‚¸¥$1"^‡?u¥ä‚¸§ “ŽØ7‡$§¥ä‚¸“è1
‡É›"
Sؤ˜‡' ?ÖÒ´NÝì§d§û½e˜gA$1=‡‚§"
NÝ촘‡~§§d‚§N^¶k œ¹ed?u¥ä‚¸‚§N^"˜
¥ä?n§S¥ä‚¸Ü©Œ±ˆù˜Ú§4M‡cI¦÷v§Ò
Œ±£~~¤Nݘ‡‚§¤¥ä?nóŠ§ùg´3‚§‚¸e"
13.2.4 3‚§‚¸¥‰1SØ
3‚§‚¸e?\Sا‡o´A^§SÌĉ1 XÚN^§‡o´Ù
Ä/N^ J[;ìÉ~] £Ù$ ‰1 XÚN^½öu) VM É
~¤§‡o´du­#NÝ(J——ù‡L5q´du¥ä½ö,˜‡‚§Ï
–¯‡ Ì榭#NÝÚå"
XÚN^´˜«“‘kSuf§SN^"” ´Ù§É
~——AO´J[;ì‘oÉ~——Äþ´˜§,A^§S3u
)É~ƒcØù«AÏXÚN^´Ø´˜½¬u)"
¿šz‡‚§Ñ´A^§S‚§"ØNXuA½A^§SAς§Œ±
^53Ø%?§‚¸e+nÚÙ§SØõUNÝóŠ"
‚§‚¸´SØ“~”§NõõÅÑs3 yŒõêS؉1žm
?uù‡ª"'X§¥ä?n§S¥NÝóŠè(work queue)£ë„1
14.1 !¤“eŒÜ”“è§Ò?u‚§‚¸"

322
1 14 Ù ^M‡NÓóŠ
4·‰\ù˜‡¯. . .
§Ù¢AT`´4·‰\ùÐA‡¯§ÐÐùù MIPS M‡´NJø
|± Linux SØ. A5"
• ¥ä)·Úžmµ,¬M‡• CPU «¿I‡ìž¬u)ŸoºX
J¥äNÝ“è3,˜ã“è,‡Œ.öŠ‰1Œ´žòًä§
ùž¥äkŒU—˜ì<¶kud§k7‡;€s˜!ùù‚§!
.«Úf5"
• XÚN^žu)Ÿoµ^rA^§SN^SØ~§ž¬u)Ÿo§N
yS5º
• Linux/MIPS ¥/Œ´N=†µ˜ùJ[;±9 MIPS M‡N
ÑÖ Linux ;ì/ŒN¯§`5Ò{ "
14.1 ¥ä?nL§Úžm
˜ƒÑm©uy¢­.¥u),‡¯µN\Ue þ˜‡ "
››ìM‡êâ -¹¥ä&Ò"Òùþ´ ——N÷å²
L CPU ÜA?M‡§äN²L= M‡œ¹ˆØƒÓ§Ø´·‚y3a
,——˜†§±-¹ CPU ¥ä&҃˜/ªÑy§~„Ò´
Init0-5* ƒ˜"
CPU M‡3z‡ž¨±ÏÓÎù Ñ\"Linux SØkžÿBŽ¥ä§
Ø~„¶õœ/e CPU ь±Â¥ä"CPU AÒ´3eg
žÿɘ‡¥äÉ~"
kžéJù‡L§kõ¯"˜‡ 500-MHz  MIPS CPU§-˜‡¥
䞧3 3  4 ‡±ÏSÑÉ~?n§S£XJ up„ S¤1˜^
-µù´ 8 B¦"k². §S 3?ÛXÚ¥ÑØU"k 8 B¦
žò§¤±e¡·‚?ؘe.´Ÿo ´ "
 CPU lÉ~\:-žÿ§Óž˜ É~G SR(EXL)§
ùò¦ CPU Ñ Y¥ä¿?\SØA?"››ò=Ï^É~\:µ
323
14.1. ¥ä?nL§Úžm 1 14 Ù ^M‡NÓóŠ
u 0x8000 0180"
1

Ï^É~?n§Su Cause MìAO´ Cause(ExcCode) µ"


ŠL«ù´˜‡¥äÉ~"Cause(IP7–2) L«=‡¥äÑ\‚´¹Ä
§SR(IM7–2) L«A= ¥ä"A–k˜‡¹Ä!¦U¥ä¶^
‡OŽ˜‡éAu¹Ä¥ä‚?Òê§Ò´ Linux  irq Ò" 2

3N^\˜„“èƒc§ÌÉ~?n§S‡¤kêMìŠ 3

——§‚áufâ‹ä‚§§3ò5,‡/#NT‚§UY$1ƒc7
L¡E"ù Š3¥äu)ž$1‚§Ø%Òp§¿ƒA˜Ò"
k '  CP0 M슏‡¶) SR!EPC Ú Cause"
SR(EXL) ˜ Ïm§·‚¿vkýOÐN^ÌSØ~§"3ù«G
§·‚ØUÉ, É~ §'X`§·‚ØØ%7m?ÛN/Œ"
4

@oy3·‚®² M쿘Рҧ·‚Œ±?U SR§˜"


SR(EXL) Ӟ˜" SR(IE) ±2gu)É~——.¾·‚A¥ä&
ÒE,¹ÄX"
y3·‚˜ƒÒX§Œ±N^ do_IRQ()"ù´˜‡,6uäNÅì
´^ C ~§§äk˜‡ƒIO6§"˜‡¿÷MìŠ(NŠ
ëêD4‰ do_IRQ()"T¼êóŠÒ´kÀJ/BŽA½¥ä§¿ •I‡
(@¥ä+nM‡Ï`T¥ä®²?n"
b½k˜‡ ISR 5þ ù‡ irq Ò§do_IRQ() N^ handle_IRQ_event()"
ØAžm'4Ü¥ä$1¶ ¡k ¥äŒUI‡¯„A"
´·‚y3?u˜‡«§ùp˜ƒÑûu·‚?n¥ä5Ÿ"
XJ®T?n§Sš~{áp£SA_INTERRUPT ˜ ¤§·‚Œ±±
Ü¥ä'4˜†‰1e¶XJs¤žm§@o·‚˜„‡­#¦U¥
ä——do_IRQ() ®²'4 ·‚3?n¥ä"
Ә‡ irq ÒþŒ±5þõ‡¥ä?n§S¶ùžgN^z˜‡"
˜ ¥ä?n§S(å§handle_IRQ_event() 2gBŽ¥ä, ˆ££ù
Ò´ do_IRQ() Ï"¤"²L˜ †äNÅìƒ'nóŠƒ §N^
ret_from_intr() ˜n¥äÉ~"
3 l¥äˆ£ƒc§·‚u3 ISR Ïm´Äu) ‡¦­#NÝ
¯‡"Linux k‡ÛI“ needs_resched ^uù‡8¶ƒ'“èØ´
@o{ü§ÏlØ%¥ä£Ø%sÓ¤‚§¥­#N݌U—¯K"Ù
¢§XJ¥ä‚§±Ø%A?$1——l SR(KSU) ŠŒ±w
——Û preempt_count š"ž·‚ÒØ^­#NÝ"
,vk@o{ü¶y3k MIPS CPU Jø;^¥äÉ~\:§k $–Šâ´=‡
1

¥ä&Ò = ØÓ\:"´·‚Ä{üœ/——NõöŠXڏ´ù"
3Nõœ¹e§É~?n§SŒ±ŠâäNXÚ ÜMì¼k'¥äÒ?˜Ú&E"
2

, MIPS CPU éé. ¥ä?n§SŒ±^1 5.8.6 !¤ãKfMì;ù‡m"


3

ù¿šØŒ;"MIPS NX(k˜ °%O/Œ±#N3›^‡ei@É


4

~"´ Linux ¿™¦^"

324
14.1. ¥ä?nL§Úžm 1 14 Ù ^M‡NÓóŠ
XJXÚ¿ØNÝ,˜‡‚§§·‚´el¥äˆ£"·‚¡E¤
kMìŠ"AO´§·‚‡r SR ¡Efu)É~ Š§ùq­
#ˆ£É~ª§2¡E EPC§§p¡X­#m©/Œ", ‡$1
˜^ MIPS eret -"
XJXÚ(¢NÝ , ˜‡‚§§@o¥ä‚§Ò±GÊ3@
p§3l¥äˆ£>~{ؽ"¥äɳ‚§2gÀJ$1ž§Ò¬˜
íÀÑ5§£¥äž3‰¯œ"
k °Ä§S´l˜:êâ, xþ˜?¶Ù§
ŒU‡3¥äž‰Nõ?n"´ ISR ØA3¥ä‚¸¥$1È"=¦
3·‚­#¦UÙ§¥äƒ §°Ä§S®Ã^‡ CPU '5§v
k‰öŠXÚNÝìâ–ÙüÑŬ"3 ISR ¥‰1óŠXJk‡L
A›^-/§Ðr¥ä?n˜†í´NÝ쌱(½´Äk­‡
¯œ‡‰ƒ "
Linux DÚþr ISR ©¤“þŒÜ§”3¥äž$1§Ú“eŒÜ§”í´­
#N݃ $1" y3 Linux SØk‡XÚ‰softirq §Œ±Sü$1 32 ‡
5

õUƒ˜¶A‡‡¦š~pk§‚gC softirq eŒÜ§´Œõê


Ó˜‡3 softirq ƒþï\(¹XÚ§¡ tasklet "
öÑ´^ÅìÃ'“è¢y§Ñ´3ý ISR ˆ£ƒ ¦¯Sü
9Ï¥ä?n§S$1{"
tasklet ª´d¥ä?n§SN^§ØU‰1?یU—Ã'¥
äɳ‚§ZšöŠ"tasklet “èØU‰?ÛI‡–¯œ"?nù«¯
œok؎˜«{"ISR Œ±r °Ä§S?֘ óŠè(work
queue) ¥"óŠèk˜‡~5S؂§Ñ֧ټꌱ‰1?ÛöŠ§
)ŒU—‚§ZšöŠ"
Q,ù˜ƒÑ´ÅìÃ'§·‚ùpÒ؍[ù ¶3©z Love 2004 ¥
k;€Øã"
14.1.1 p5U¥ä?nÚ Linux
†@ ”þ?öŠXڃ'§Linux ISR ¥kƒ˜Ü© m
"Linux Ã^‡¤kMì¿?1A?¼êN^£~X§3 do_IRQ()
¥ l¥ä››ì?n¤"kŒU3 MIPS ¥ä?n§S¥ØlmÉ~ª£=
± SR(EXL) ˜ ¤¤k^óŠ——´DÚ Linux ¿Ø†|±ù
«‰{"c[O MIPS öŠXڦܥä'4žmõØ
‡LA^-´kŒU§´ Linux 6u'4 CPU þÜ¥ä5;3
Ø·/u)¥ä"
5¶iŒUN´· "Linux ±ck˜‡fXÚ¡Š“eŒÜ£bottom half¤”Ù¼ê¶iÑ
±“bh”‹Þ§´ù®²Lž§ l 2.6 SØ¥K "ùp·‚E,^“eŒÜ”£Ñ¥ä
?n§Sƒ óŠ"

325
14.2. ‚§!.«Úf5 1 14 Ù ^M‡NÓóŠ
¡k˜ <ãåU? Linux é¥äA5",ü$€œ¹e¥
äò´——lM‡¥ä&ÒÑy?\ ISR ƒmžm——魇§ùØ´
ÜóŠ"‡JpA5§XÚéuÑ\ÑÑk'‚§Nݏ‡¯"
Ù¥˜‡‘8£“$ò´Ö¶”‘8¤´ì?§8I´ÏLéSØ\£/s
ӛ›Å›?1F%±Y°z5U?²þ5U"Ù¥˜ $ò´óŠ®²?
\ Ì6 2.6+ Linux SØ"
Ù{‘8£ˆ«“¢ž”Linux¤K-?§Ï~´r Linux OS e˜4§
ŠwØ¥ä"¥äd˜«¢žöŠXÚ3/e?n§r‡ Linux ==Š
¢žöŠXÚ˜‡‚§" Linux BŽ¥äž§¿vkýBŽM‡¥ä¶
´Ø4 RTOS NÝ Linux ISR"
ŠÑ´§ùü«{´pÖ¿——kndϦöo"
14.2 ‚§!.«Úf5
‚§7L¿£§3öŠêâkŒUÙ§¿u¹Ä¤5
Linux
¿"¢yõ?ÖöŠXÚ-̇(Jƒ˜Ò´éÑ¿o¤kù«S"¿
u¹ÄŒU5guµ
• ,˜‡ CPU $1“赐Ñy3ýõ?nìXÚ¥

• ¥ä‚¸e$1“赊¥ä J $13Ә‡ CPU þ“è

• sÓT‚§,˜‡‚§$1“èµù:‡©§ù´d,‡OS
؂§3Nݣæ´,‡¥ä(J¤¥Â} ·‚‚§ $1“
è"
˜XéêâöŠÜ¤ƒ U±ê☗§´3öŠ¥m
¬ž/)˜ ؘ—!Ù§^‡ØUS)º½ööŠGžÿ§Ò
ѯK "^‡I‡´kUåIP˜‡êâ=†fµ ÜÀãw
êâU´²{ ‡Cz½öŠvkCz"Linux Jø þ{üf
öŠµXJ,‡NX(Jø ˜ AO¤ ¢yś§ù föŠŒ±æ
^éTNX(AÏ¢yª"XJ‡rE,öŠt¤f5§Linux K
¦^£" £Ò´öŠ˜¬êâ³y§‡–¯êâ¤k^‡Ñƒp܊§
6

˜gk˜‡‚§Œ±öŠêâ"?Û¿–¯ö3Áã¼£žÿÑ
–c‚§(å"
Ž‡3êâþ‰1˜‡f5öŠS“è㡏.«"¤±·‚
‡‰Ò´4¤kŽ–¯¿ê₧ù‰µ
acquire_lock(contended_data_marker)
£´˜„¿Âþ&Òþ˜«4{üA~——´l Linux z½Â{ü§
6

˜m©N´n)"
326
14.2. ‚§!.«Úf5 1 14 Ù ^M‡NÓóŠ
/* do your staff in the critical region */
release_lock(contended_data_marker)

zgN^ù‡“èžÿ§Ø+.´N¢y§o´‡k˜ žms3
£¼Úº˜öŠ¥"ý‘¿ž§ˆ¼:‚§uy£®²
^ 7L–§,˜‡ˆº˜:‚§7LŽ{D4ўE`y3Œ±U
Y "
®¿ö$1u, ˜‡ CPU þ .«kA^-ž§Œ
±46žÉ ¼ö3/£^–˜†wX^‡)Ø"ù¡£^£
(spinlock) §Linux é SMP XÚJø ù«£"
¿öŒU´Ó˜‡ CPU þ, ‚§ž§ØŒ±^£^–£3–
‚§£^–Ïm§±k£‚§Ã{ÏL­#N݉1Ŭ§Ï vk
Ŭ‰1.±º˜£§ù·‚Ñ€\ k£¤"¤±\I‡˜‡\­þ?
£§‚§¼£”}žIPgCcØU‰1¿N^öŠXÚNÝì"„
k§release_lock() ~§7LKISüwÙ§–£‚§Œ±2Á˜e"
¥ŽÚˆ2 Linux ‚§“è؝6u CPU"´ÿÁ£G¿3Ï~v
k¿^‡e˜£Ċk6u˜^f5 test-and-set£ÿÁ-˜¤ö
Š§Ù MIPS ¢y^ eãE|"
3¿öŒU?u¥ä‚¸/£ l¥ä\:N^!¿ /^
, ‘ÅÀJ¥ä‚§‚¸5ù‰¤§Linux 6u3.«‰1Ï
mBŽƒ'¥ä‰{"Q,éJ¶-˜‡¥ä§@~~¿›X3.«N
C¶-Ü¥ä"Xc¡J§¥ä‚¸¥N^“èÉNõå±;
ŒU‘5æ†"¯¢þ§<‚5ÒÏ"¥ä?n§S‹SØÙ{Ü©ƒ
mk{ü ½p"
MIPS NX(‘ Ÿo5Ï¢y{üföŠÚ£Qº

14.2.1 MIPS NX(ÚföŠ


Pk˜éë£\1/^‡;-"\^§‚5¢y3˜‡Cþþ?
MIPS
¿Ö-U- RMW öŠS£Ò^ ll ÖÚ sc Ò1¤"TSØ´f5
"´TSeØUy(¢´f$1§;öŠÒŸoØ‰§sc ˆ£
˜‡^‡Œ±ÿÁŠ"XJÿÁL² sc ”}§^‡Œ±­Á˜e RMW S
† ¤õ"
ù -̇´õ?nìXÚu²§^5“yf5 RMW ö
Š"éõ?nìXÚù´˜‡éÐÀJ§Ï; XډŒSf¯Ö
m"3˜‡Œ.õ?nìXÚþ§ (–¯vk>9oêâ§ù
«f¯ÖŒU¬ÊŽ¤k–öŠ"
MIPS ¢yƒ{ü"ll z‡ CPU ˜˜‡ë£ ¿ £éuõ?
nìÚM‡õ‚§XÚ¤P¹\1/Œ§ù CPU Œ±i›éT/Œ–
327
14.2. ‚§!.«Úf5 1 14 Ù ^M‡NÓóŠ
¯"sc ¤õ^‡——‰1;öŠ¿ˆ£ 1 ——񫑣 ,˜ "XJ
iÿTCþ£ŒU¤˜ Ã'^‡#§CPU Ò7LéT ˜""3õ?n
ìXÚ¥§ ܖ¯iÿ´ÏL±p„ ˜—5fM‡Ü6¢y"
3ü CPU þ§?ÛÉ~Ѭ»€ë£ " 7

Linux  atomic_inc(&mycount) ^T-¢yé?¿.Cþf4



atomic_inc:
ll v0, 0(a0) #a0 has pointer to ’mycount’
addu v0, 1
sc v0, 0(a0)
beq v0, zero, atomic_inc
nop
jr ra
nop

XJ\lù‡~§òѧ(JÒ´‰ mycount \ 1§¿ TöS——


y——vk?Û SMP ܊ CPU!/#NÙ§^‡$1¥ä½ö$1
u˜‡M‡õ‚§Åìþ,˜‡‚§¤Z6"XJëYAg ܽ¥
äK 4T~§þ˜ãžm´ŒU"´——Ϗ3 ll Ú sc ƒmS
éá——‡´ëÁng„ؤõŒU5´4"
lþ¡SN\NŒ±wѧll/sc ÿÁØ·ÜuÙ¥\1Ú;lé
E,öŠ"XJȧ¤kë£Ñ¬‹»"
14.2.2 Linux £^£
£^£^˜‡f test-and-set öŠ¢y{ü!íd\£Š§
3õ‡ CPU ƒm?1o"N^ ll/sc p£^£äNíü3
‰ÖöŠ˜‡öS"
†föŠØÓ´§£^£3ü?nì£=ü‚§ü?nì¤XÚþ
Ävk^?"
{¤þ§Linux SØ3|±SØsӃcÒ¢y SMP S5"“SØs
Ó”Ñy3¥ä—$1uØ%‚§NÝÑ $1,˜‡‚§žÿ"
Œ± Linux XÚ§Ù¥Ø%‚§$1‡ožm¡^!‡og
>š£–,‡¯‡¤!‡oÁ㈣^r"Ù¢ 2.6 ‡ƒcIO Linux
SØÒ´ù‰§ ,'˜‡$1X ?Ö“ Windows XÚ
Ažmá"´XJU(¢ySØsÓ§A5¬Ð"
3Ï 2.6 ‡SØ´þ§George Anzinger * A¤kI‡^‡
ouSØsÓ.«ÑI‡É SMP ¿u5Ko§¤±ùü‡
«®²d£^£©m "£^£´÷§¤±éü?nXڌ±BŽ§£?Ȥ
7 3Œõê¢y¥§ë£ ¢Sþél¥äˆ£7، eret -˜""

328
14.3. XÚN^žu)Ÿo 1 14 Ù ^M‡NÓóŠ
˜1¤"eï 2.6+ S؞½Â CONFIG_PREEMPT ˜À‘§£^£„^B¼
 3¼Úº˜öŠƒmBŽsÓBŠ^"
Ð §ÄþÒù "“A¤k”´‡ˆx^c"´óœ¹e§,
ãêâöŠŸþ´ SMP S£²w~fÒ´3όˆ CPU Akêâ
ž¤¤±¿ØI‡£^£§(I‡“ŽsӧϏӘ CPU þÙ§Sؓ
èŒU3–¯Ó˜êâ"\\SØsÓ ± 2.6 SØ­½E,I‡ƒõF
%“èÎnڍõF%NÁ"
14.3 XÚN^žu)Ÿo
XÚN^“==´”SØ¢yø^r§S^~§"k XÚN^´ˆ
£SØ ¡Ø&E£'XU°(žm¤"
kü‡Ï—œ¹‡'þ¡E,"1˜‡†S5k'——<‚@
SØ3¡ék†½ö¿A^§S“èžAE,´èF"
1‡φ­½5k'"Linux SØAU $1;€§)¤§S§
´AU $1±cÓ½öoNNX()¤A^§S"XÚ
N^˜ ½Â§‡íØÒ²LNõØ!óŠÚ–⌱"
·‚k£S5"Q,XÚN^$1uØ%§Ø%\Ò7LÉ
››"éu MIPS NX(§ù´ÏL syscall -d^‡>uÉ~5¢y
§?\SØÉ~?n§Sž§CPU  Cause(ExcCode) Mìk˜‡A
Ï“è£8 = “sys”¤". É~?n§Sò¬ŠâTŠû½e˜ÚZ
Ÿo§¿ƒ†SØXÚN^?n§S"
@´ü‡\:µA^§S˜˜‡êiëêÀJAz‡XÚN^õU
¥=˜‡"XÚN^Š6uNX(µMIPS þé,‡õUXÚN^Ҍ
UØÓu x86 þéӘõUXÚN^Ò"
XÚN^ëꦌU3Mì¥D4§ùk|u;^r˜mÚSؘm
ƒmØ7‡êâ€"3 32 MIPS XÚ¥µ
• XÚN^Ҙ? v0"

• ëêD4Uì“o32”ABI ‡¦"Œõêžmùu`§õŒko‡ëê3
Mì a0–a3 ¥D4¶(¢k )œœ¹'Aϧù ˜3 11.2.1
!ù" 8

,SØæ^aq o32 ª½ÂXÚN^¥ëêD4§@¿Ø´`^


r˜m§S7L‡^ o32"ûÐ?§¢‚Š{‡¦^r˜méöŠX
ÚXÚN^o´ÏL C $1¥½ödśD4§ùI‡‘o˜
NõëêD4 œœ/ÑØKSاϏSØ¿Ø?n2:Š§ØÏLDŠN^5
8

?n(Nëê½öˆ£(N(J"

329
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ
?XÚN^"¥Œ±l?Û ABI =†¤aq o32 XÚN^IO§
3 64 MIPS Linux þ$1 32 ^‡žÒ´ù‰"
• XÚN^ˆ£ŠÏ~ u v0"´ pipe(2) XÚN^ˆ£˜‡dü‡
32 ©‡£ãΤê|§^ v0 Ú v1 ——Nk˜U¬d, ˜
‡XÚN^¤ÓõU" 9

˜ƒkŒU”}XÚN^3 a3 ¥ˆ£˜‡G£0 L«ûЧš"L«


ц¤"
•  ÚN^½±˜—§XÚN^± o32 ‡¦3¼êN^ž@
MìŠØC"
ySØéXÚN^¢yS5I‡· ‰"ê|eI!! À
«ÝÑ7L?1u"¿š#N¤kA^§S¤–§XÚN^“è
37‡ž£Œõêžÿ§±‡?^r root $1§SŒ±‰?Û¯œ¤‡u
N^ö“U(capabilities)"”
$1XÚN^Sؓè?u?§‚¸——Sؓ聰t‚¸"XÚ
N^“茱‰1?Û3u) I/O ¯‡ž‡¦‚§Zš¯œ§½ö–¯I‡
†?SJ[/Œ"
?1êâDў§\‡6uA^§SJø§ TŒU´Ã
Š"XJ·‚^ ͧҬÚu˜‡É~§kŒU—SØ$——@´
ØUÉ"
¤±l^r˜m€Ñ\êâ½ö•^r˜m€ÑÑê⌱ÏL;€
^uT^å¼ê copy_to_user()/copy_from_user() S¤"XJ^rý
D4 ˜‡€/Œ§ò¬—SØÉ~"Sؑo˜‡‰1ˆx?֞Œ&
?¼ê Lµcopy_to_user() Ú copy_from_user() uL¥"É~?
10

n§SwÉ~­#m©/Œ uù ¼êƒ˜ž§Òˆ£˜‡°%E
†Ø?n§S"A^§SÒ¬ux˜‡o°îx&Ò§´SØS,Í"
lXÚN^ˆ£´ÏL syscall É~?n§S(— eret -ˆ£"­
‡˜:´ƒ†£^rڈ£^r-˜m‡Óž‰1"
14.4 MIPS/Linux XÚ/Œ=†
3·‚m© )N¢yƒc§ké‡óŠk‡NÓ+"
ã 14.1 ´˜‡ 32 MIPS/Linux XÚþ‚§;ìN«¿ã" 11

ù‡N7L†M‡Nƒ˜—§¤±^rŒ–¯;«7, ueŒÜ"
AP4e¡A:µ
·fSؑo< édɝÓ(/L«“·‚±k‡é£Øš L·‚™N¤"”
9

Ù¢´˜‡-/Œ‰ŒL"
10
11
64 MIPS/Linux XÚNÄuÓn§´duM‡NE,——ë„ã 2.2
——Ï ƒé憘:"

330
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ

ã 14.1: Linux ‚§;ìN


• SØlŸo/m©$1µMIPS Linux SØ“èï3 kseg0 «$
1¶J[/Œl 0x8000 0000 •þ"ù‡‰Œ/Œ==´˜‡ÔnS
$ 512 MB I§ÃI TLB +n"
• É~\:µ8cŽŒõê MIPS CPU ¥§ùÑdM‡z kseg0
.ÜNC"# CPU Œ±Jø EBase Mì§éÉ~\­#½
£ë„1 3.3.8 !¤§Ì‡´4õ‡S CPU U^ØÓÉ~?
n§S Ø^¤å‰AÏ;ìÈè"3 Linux SØ¥§ÒŽkõ‡
CPU Ñ$1Ә‡É~?n“觤±ù‡A53 Linux ¥ØŒŒU
^"
• ^r§SlŸo/m©$1µMIPS Linux A^§S£$1u$A?
“^r”¤J[/Œl 0  0x7FFF FFFF"T«/Œ3^rŒ±–
¯§‡²L TLB /Œ=†"
A^§ŞSïžgC"/Œm©$1"جý"——lJ
["/Œm©˜üØ‰/ŒN§ùèã¦^˜Ò¬ŠS
+n†ØÓ¼"A^§S¥¼êÜ©§3\1½öžÿ4O\
331
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ
1^r˜m"Œ±ù‰´Ï¥¼êï ˜Ã'a.£ë„1 16
Ù¤§UŠâ¢S\1/Œ˜mgÄN"
• ^ræÚÒµA^§SÒЩ˜^rŒ±–¯˜m£ 2 G J[
˜m¤ºÜ¿ •eO"öŠXÚiÿ鮩$ҘmNC
™N;얯ž§¬gÄNõ±÷vÒO"
Ӟ§#¥½ö†^ malloc() ©^rêâ9Ù “l^r
˜m.ܕþO"‡ù ˜moÚ؇L 2 GB§Ÿo¯ÑvkµØ
Œ.ÑÖì± §ù‡›Äؤ¯K"
• 512 MB ±S;쵌±ÏL kseg0 ²Lp„ –¯½öÏL kseg1
Ø^p„ –¯"{¤þ§Linux SØb½gCŒ±†–¯Åì
ÜÔnS"éu^ 512 MB ½öÔnS‰Œ. MIPS X
Ú§ù´é¶3ù«œ¹e§ÜSь±3 kseg0 £^p„ ¤Ú
kseg1 £Ø^p„ ¤«–¯"

• 512 MB ±þ“p ;씵y3 512 MB =¦éui\ªXڏ®²


Ø "Linux k˜‡ÕáuM‡NX(“p ;ì” Vg——‡
^AÏ!6uM‡NX(ª?nÔn;ì§éu 32
Linux/MIPS XÚ§512 MB ±þÔnSÒ´p ;ì"·‚‡–
¯ž§I‡Mï·/Œ=†ê⑿ =žE› TLB"
@Ï MIPS CPU J¦3 Unix óŠÕÚÑÖì¥A^§¤± MIPS ;
ì+nM‡O¤U  BSD Unix Jø;ì+nM‡"BSD Unix
XÚ´1˜‡3 DEC VAX .ÅþJøý©J[; Unix öŠX
Ú"VAX 3éõ¡¤ d Ú£OŽÅ. 32 ©=†J[;NX
(;‰¶N3 MIPS pk˜ VAX ;ì+n|„K¿ØÛ%"
´ù´˜‡ RISC§MIPS M‡‰‡õ"AO´§VAX£½ö x86 ¤^‡
“è)ûéõ¯K3 MIPS XÚ¥Ñ3‰ ^‡‰"
3ù˜Ù§·‚l MIPS M‡m©/m©§kʇÄ Unix ƒ
aöŠXÚ9ÙJ[;XÚI¦¶´ùg·‚öŠXÚ´ Linux"
·‚òw MIPS M‡Ÿþ´éù«I¦˜«Ün£A"–uý
[!§žë1 6 Ù"
14.4.1 Ÿo‡‰;ì/Œ=†
;ì/Œ=†M‡£ Ï^§·‚¡Ù MMU§=;ì+nü
memory management unit ¤ÑÖA‡ØÓ8Iµ 12

12 Ä MMU é Linux °þ§3vk MMU œ¹eŒ±ŒNŒ±óŠ


§ý4<k:،gÆ——@´, ˜£¯ "
Linux(uCLinux)

332
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ
• ÛõÚoµ^rA?§SU–¯§S/Œ u kuseg ;«
£$§S/Œ¤êâ"ù˜‡§SUˆöŠXÚ#NS«"
d §Œ±üՍ½z‡¡Œ½o¶öŠXÚ$–Œ±ÊŽ˜
‡¿ CXgC“è§S"
• ‰§S©ëY;˜mµk MMU§öŠXڌ±lÔnþ©Ñ
¡EëY§S˜m§#N·‚l˜‡{ü½Œ À³¥
©;ì"
• *Ð/Œ‰Œµk CPU ØU†–¯§‚ÜÔn;ì‰
Œ"MIPS32 CPU ¦+´ý 32 NX(§é/ŒNSü
¦š=†/Œ˜mI kseg0 Ú kseg1 £Ø6 MMU LŠ/Œ=
†¤NÔn;ì$ 512 MB"XJ\I‡Œ‰Œ;ìN§
Ò7L²L MMU"
• ¦;ìN·A\§Sµk MMU§\§SŒ±¦^·ÜgC
/Œ"3ŒöŠXÚp§ŒUӘ‡§SkNõ€Ӟ$1§4ù
€Ñ^Ó§S/Œ‡N´õ"
• UINµ§S$1žÒЖI‡¤kS] Ñ®²© ˜§
´öŠXÚ¢Sþ3ý^žâ©"–¯™©/Œ«ò)˜
‡É~§, döŠXÚ?n¶öŠXÚ\1·êâ;ì 4§
SUY$1"
nØþ£kž3OŽÅ‰Öþ¤`§UINk^´Ïù#N\
$1˜‡ÔnS˜ØeŒ§S"XJ\kéõ˜sžm{§ù{(
¢Ø†§y¢¥XJ˜‡§SýI‡^‡L¢SS˜m§Ò¬Ø
ärgCêâ£ÑS§±–u$1š~š~ú"
´UINE,›©k^§ÏŒ§S¿÷ Œþ–3g‰1¥
ج$1)œ“è"N\§SS˜ké\8U^Øê₪
|±¶N§Skéõ†Ø?n“觴ù †Ø4u)"3UI
NXÚ¥§vk^§S¬lØI‡Ö?S"ùéĄݏ¯
§^B?Ð "yF%^r"
• ­½ µ§S\:Úýk(²êâ/Œ3§S?È)¤ž´½
——,ù˜^éu@ ^u Linux ܐ¥ÚŒõêA^§S‡
^ ˜Ã'“è5`Òؤá "MMU #N§S3ÔnS?¿
/ŒþÑU$1"
Linux ;ì+n§S󊢟Ҵ‰z‡§SÑJøgC;˜
m"
333
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ
Ð §Linux A‡Vg´©mµ‚§´NÝü§ /Œ˜m£;ì
N¤´oü"˜‡‚§|¥Nõ‚§Œ±˜‡/Œ˜m";ì=
†XÚa,w,´/Œ˜m Ø´‚§"Linux ¢y´¤k‚§Ñ²
§¤k‚§ÑPkS+nêâ("$1uӘ‡/Œ˜m‚§§¢
Sþù êâ(ŒÜ©"
´Òy3 ó§XJ·‚Äz‡‚§˜‡/Œ˜mœ/Ò'{
ü§·‚Œ±^PVg“?§”Ӟö"
XJ;ì+nóŠØц§z‡?§·$ÒÕáuÙ§?§£öŠXÚ
ogC¤µ˜‡?§ŒU$½1ØàجK‡XÚ"éuŒÆp
ˆX$1Æ)§SOŽÅ§ùw,´˜‡ék^5Ÿ§´=¦î‚
û’‚¸I‡3|±²LÿÁuL^‡Óž§|±Á5½ö.
^‡"
MMU Ø1´ Œ.!J[;XÚ¶=¦i\ªXڏUl
­½ ڍpS©¥ÉÃ"?ێ‡3Ù¥ØӞm$1ØÓ§S
XÚѬuy§XJŒ±r§S/ŒVgN‘B˜‡Œ^Ôn/Œ˜
m§˜ƒÑ‡N´õ"
õ?ÖÚØÓ?Ö/Œ˜m©lL^uŒ.OŽÅ§ 5[£‡
<OŽÅÚ.ÑÖìþ§X83ž¤a>f¥OŽÅþFìÊ
9 "
, §éš Linux i\ªöŠXÚ¦^Õá/Œ˜m"ùŒUØ´
ϏTA5vk^?§ ´dui\ª CPU 9ٌ^öŠXÚ"y˜—A
5"ŒUϏ˜ ‰XÚ\þÕá/Œ˜m§ÒCu­#u² Linux
”¿Âœ
ùé MIPS NX(5`´˜‡¿ Я"1986 c {zóŠÕ CPU
ØØ?1{Oéu 21 ­VÐÏi\ªXÚ´‡ãŒãL"=¦
A^§S§¯„)ä“è¤(6§I‡^¦¤k®E|+n^‡
E,5¶± MIPS k°Äu^‡(¹{4ÙkŒUJøI‡Ü
ÀÜ"Acc§éJ`ѽ ui\ª½| CPU ‚û\þ MMU¶y3£2006
c¤Linux ®²Ã?Ø3 "
14.4.2 Ä?§ÙÛÚo
löŠXÚÝ5w§$à;˜m(kuseg) ´‡“âÝ”§3Ù¥^r§
SŒ±‘B "XJdu§S”›¿” gCÜêâ§ùØ'O<¯"
lA^§SÝ5w§T«Œ±gd¦^5ï?¿E,hkêâ(
±¤óŠ"
3^r«S§SâÝp¡§öŠXÚUI‡£‘XҕeO Û¹¤=
žJøõҘm"ӞJø˜‡XÚN^¼õŒ^˜m§lýk
(²êâp/Œm©•þO——XÚ< ¡ƒæ"æŒø malloc()
334
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ
ƒa•§SJø S˜m¥¼ê¦^"
æÚÒ˜møAü éuXÚ;ì·Ý!|§ŒU;Lõ
XÚN^½öÉ~"´3z‡XÚN^½É~u)ž§öŠXÚѬ
˜‡Å¬5››A^§SSžÑ"öŠXڌ±¢–›±yA^§S
جϏÓ^Sõ %Ù§' ¹Ä"
Linux ‚§3öŠXÚØ%±gC°§‚§3SØp$1u?§‚
¸£'XXÚN^¤ž§Ù¢´N^˜‡°%?~§"
öŠXÚgC“èÚêâ,ØU4^r˜m§S–¯"3˜ XÚþ§
ù´ÏLrXژ˜‡Õá/Œ˜m‰¶3 MIPS þ§öŠXÚ
Ó˜‡/Œ˜m§ CPU $13^r§SA?ž§éù /Œ–¯´š
{§¬>u˜‡É~"
5¿,z‡?§^r˜mNgChký¢;§A˜m
´"¤k?§wöŠXړèÚêâÑ uӘ‡/Œ——öŠX
ÚSØ´˜‡õ‚§pސkü˜/Œ˜mXÚ——´z‡?§^r
˜m/Œ–¯gCüÕ˜m"Œ±&?$1u?§‚¸SØ~§¬S/
NöŠ§´ŠØ7&?A^§S"
·‚JÒЩzŒ#Np^r/Œµ@‰Œ±|±¦^Œþ
;ì§S"Ù(J—¦^/ŒªÝ錣¥mk˜‡ãŒ˜É¤§ù
´ù«/ŒN˜‡A§3?1=†ž7L‡Ä"
Linux rA^§S“èNé§SÖ§ù“茱ØÓ/Œ˜
m‚§S——.¾§Nõ?§$1Ә‡§Sœ¹é~„"
NõXÚØ=‡A^§S§ ÏL¥N^–¯A^§S
¬£¥¤"Linux ^¥‰ù:§·‚ ¡2Xù@‡¯"
14.4.3 ?§/Œý¢;ìN
|±ù‡.I‡= śº
·‚Ž‡U $1Ә‡§Sõ‡€§ˆ‡§S€Ð¦^ØÓ
êâ€"ù3§S‰1L§¥§§S\1žA^§S/ŒŠâöŠXÚ
ýk½YNÔn/Œ"
,4öŠXÚ3·‚l˜‡?§‚¸ƒ†,˜‡žÿ::aa?
©n/Œ=†&E´ŒU§ù¬š~$" “ƒ´§·‚‰z‡
¹Ä‚§;ìN˜‡ 8 ꧡ/Œ˜m ID ½ ASID"M‡uy
˜‡/Œ=†‘žÿ§Ï阇šc ASID 9/Œ=†‘§ ùM 13

‡Œ±NBØӘm=† جt·"y3NÝØÓ/Œ˜m‚§ž^
‡‡‰ÜÒ´\1˜‡# ASID  EntryHi(ASID)"
Nś#NöŠXÚ«©^r˜mØÓÜ©"A^§S˜mk
Ü©£Ï~´“èÜ©¤Œ±NÖ¶k Ü©3e؉N§3–¯žg
13 ¢Sþ§·‚Œ±wk =†‘Œ±† ASID Ã'§=“Û”"
335
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ
€§ù¿›X”››§SŒU¬@:ʎ"
?§/Œ˜mSØÜ©d¤k?§"SØïžÒ´ 3A½
/Œ$1§¤±ÄþØI‡(¹Nś§Œ±|^ kseg0 «§r;ìN
] 3‰A^§S¦^"k Ä)¤SØ«´lN;ì£~X§
^uNB°Ä§SS،\1¬Ñ´N¤B/ïå5"
14.4.4 ©N
é/ŒNQ²}ÁLNõ%Y"† 1980 c“¥Ïc §ó’.
„3Ž’½k'½Œ©Ð)ûY".¾½ŒvkÄ
A^§S1½I¦§ vk=«gº•e©Û¬u²ù‡{"
´XJ§SŽ‡Ÿo£žŽ‡;¬Œ¤§M‡Ò‰Ÿo§Œ^
;ìé¯ÒC¤º€”“”¡"·‚ Ú .>ž§¦‚ÕӐ^
´ /Óf§ ¦‚OŽÅŒU^½Œ"
5¤k¢SXÚѱ ——½Œ;¬——ü NS"
Œo´ 2 ˜"ŒUI‡õ+n£Œ=†L!˜‡§SI
‡õ=†¤¶ŒŒUÇØt§Ïéõê⏇Ә‡"
4 K Œ¤ Linux þÓâýé`³ò©(J" 14

æ^ 4 KB Œ§§S/J[/ŒŒ±ù{üy©µ
nn nn 11 0
Virtual page adddress(VPN) Adddress within page

S/Œ ØI‡‰=†§¤±;ì+nM‡I‡r/Œp £DÚ


þ¡J[Ò§= VPN(virtual page number)¤=†¤Ôn/Œp £Ôn
vÒ§= PFN(physical frame number) ——v<PЏŸov‰ PPN¤"
14.4.5 ·‚ýŽ‡Ÿo
Nś7L#N§S¦^gC?§//Œ˜mäN/Œ§¿r§p
/=†¤ýÔn/Œ5–¯;ì"
˜«Ð{´á˜‡L£=L¤‡J[/Œ˜mz˜Ñ3˜
‘§T‘¹(Ôn/Œ"ùw,´‡ƒŒêâ(§ ‡Ì
;ìp¡"´kü‡Œ¯K"
1˜‡Ò´·‚y3zg load/store I‡–¯üg;ì§ùw,´‡5
UàÃ"\ŒUý„ ù‡¯K‰Yµ·‚Œ±^˜‡p„ À;ì5
;/Œ=†ê⑧k3™·¥ù‡p„ žâé73SL"Q
,z‡‘“L 4 KB ;˜m§·‚Œ±^˜‡·Ýp„ Ҍ±
M‡éuŒv¯K§16 KB ´e˜‡|±Œ§éuNõy“XÚ5`
14 MIPS

ŒU´˜‡Ðò©"´ 4 KB 4Ê9§ÙKòNõ§S¶¤±·‚
E,ÄþÑ^ 4 KB"
336
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ
˜‡÷¿p·¥Ç"£3ù«Yu²žÿ§;ìp„ „Øõ„§k
ž‰“ À Àì(lookaside buffer)§”¤±;ì=†p„ Ò¤ =†
À Àì§= TLB¶ù‡ ¶¡˜†6D e5"¤
1‡¯K´LŒ¶éu 32 A^§S§/Œ˜m© 4 KB §
k˜z‡êâL‘§–‡^ 4 MB ˜m"·‚ýŽ{4L˜:§ÄK
ҐØe$1§S˜m "
·‚r)ûù‡¯K?Øí ¡§´J˜eéýk§S^ 32
ό 4GB ˜m"õꥧS3§‚gC§S/Œ˜mSÜk㌘
ɧXJ·‚U u²˜«Y§;;@ éAu˜É“Ÿovk”=
†L‘§@o¯œŒU‡Ðõ "
·‚y3®²¯‡ DEC Ù VAX .ÅO;ì=†XÚ §§
é‘ NX(kX4ŒK"V‡Xã 14.2 ¤«"

ã 14.2: Ž‡;ì/Œ=†XÚ
M‡óŠÚ½Xeµ
• J[/Œ©üÜ©§$k Ü©£Ï~´$ 12 ¤Ø‰=††D
4——ù=†o´±£Ï~ 4 K¤ü ?1"
• pk §= VPN§†c‚§ ASID ©3˜å/¤˜‡˜

337
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ
/Œ"
• ·‚3 TLB£/Œ=†p„ ì¤w´ÄkT=†‘"XJk§
҉ÑÔn/Œp §·‚Ò ‡^/Œ"
TLB ´‡;^;짌±^ˆ«{kš/Œ"ŒUk˜‡Û
I“ wŠ§Ñ, ‘ ASID§ù TLB ‘Œ±^5N,‡‰Œ
J[/Œz‡‚§¤ú^"
aq§VPN Œ±Ú—Ü© VPN /ŒØ놚˜ ¶- 3
˜å§#N TLB ‘NŒ‰ŒJ[/Œ"
ùü‡A53 MIPS MMU ¥Ñk£3˜ éP MIPS CPU ¥vk
ŒCŒ¤"
• Ï~k  £I“¤ † PFN ˜3˜å^5››–¯——²
wÒ´§#NÖØ#N"·‚ò3e˜!?Ø MIPS NX(I
“ "
• XJ TLB vkš‘§XÚ7L£^73̐L&E¤éѽöM
﷐L‘§\1? TLB , 2g$1=†L§"
3 VAX .Åp§ù‡L§d‡“è››§3§S w5´gÄ"
XJ\3;ì¥ï (‚ªL¿4M‡•§§¤k;ì
=†ÒUóŠ"
14.4.6 MIPS Oå
MIPSOöŽ‡éј«{^¦þM‡JøÚ VAX ÓõU"
‡“è›› TLB W¿´ØŒÉ§¤±¦‚rÑ Œÿ˜Ú§rùÜ©
óŠ‰^‡¤"
@Ò¿›XØ k‡Mì;c ASID ƒ §MMU M‡´˜‡{ü
p„!½Œ=†L ®"XÚ^‡Œ±r£Ï~(^¤MMU M‡
wŠ73S‡Lê☇p„ §¤±rM‡L¡ TLB ´k
¿Â"´ TLB M‡¥vkŠp„ M‡§Ø ˜:~ µ‰Ñ˜
‡Ã{=†/Œž§TLB >u˜‡AÏÉ~£TLB ­W¤5N^^‡~§"
 Ï^‡JpǧTLB O!ƒ'››Mì±9­WÉ~[!Ñ
‡°%Ä"
MIPS TLB o´3¡þ¢y"=¦éup„ Ú^§;ì/Œ=†
Ú½´7L§¤±Äþ?uÅì' ´»þ"ù¿›X TLB Nþ7,
§cÙ´3@ϧ¤±7L‚O|©5‘ÖÙNþØv"
TLB ÄþÒ´˜‡ƒé;ì"ƒé;ìz˜‘Ñd˜‡'
iÚê⍤¶\‰Ñ' i§M‡lT' iš‘ˆ£êâ"ƒé
338
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ
;ì(¢š~Ч´ÙM‡¤ép"MIPS TLB k 32  64 ‡ê⑶ù
«Nþ;3ŒNO¥Ø¬E,"
“¤k CPU Ñ^ù˜« TLB§Ù¥z‡êâ‘Ñ\§Œ±Nü
‡ëY VPN ü‡pƒÕáÔn/Œ"ù˜éê⑦ TLB IO
\þÜ6ÒU4N;ì˜m\§ ØI‡ČÌÝ?U TLB 
+n"
¡¬w§r TLB `¤´ƒé¶ù«`{rN TLB ¤k'
iÑý¿1/†Ñ\Š?1'" 15

ã 14.3: TLB ‘ˆ‡


ã 14.3 ‰Ñ TLB êâ‘«¿ã"Òy3 󧷂b½Œ 4
KB"TLB ' i——Ñ\Š——dn‡|¤µ

• VPN2: ÒÒ´J[/ŒpS ——\KS/Œ 12 e


Ü©"VPN2 ¥“2”rNz‡J[‘kVÑэl N 8 KB /
Œ"J[/Œ 12 ÀJ˜éÔn/Œ‘¥1˜‡½1‡"
• PageMask: ››J[/ŒõÜ©Ú VPN ƒ'§õÜ©D4Ô
n/Œ¶~š Œ±NŒ;«"“1” L«уA/Œ
"k MIPS CPU Œ±˜¤z‘õN 16 MB"Ñ ¥
pk ^5ÀJÛó‘"
• ASID: IPT‘/Œ=†áuA½/Œ˜m§¤±U3‰Ñ/Œ‚
§ EntryHi(ASID) ˜uTŠžâ놚"
G XJ 1 K'4 ASID š§¦T=†‘·^u¤k/Œ˜
m£l ùÜ©/ŒN3¤k/Œ˜mƒm¤"ASID k 8 µÙG
öŠXÚÖöŒU¬¿£=¦´ 256 ŠŒ. Unix XÚþӞ¹Ä
?§êþ„´ "´§‡‰ù‡‚¸e“¹Ä”Dƒ
AÏ)º“ŒU3 TLB ¥k/Œ=†‘§” 256 „Ž´˜‡Ünþ"
öŠXÚ^‡7‡žØأ ASID§ùò93 TLB ¥é@ l¹
ÄGü??§/Œ=†‘?1Œ˜W"ùŒ´‡¯åØ?й§
´¯åØ?йöŠXÚØØZõ ¶256 ‘ATv±y TLB
˜WgêجõE¤5U¯K"
rÏ^äk 32 ‘!z‘¹˜éJ[/Œ TLB `¤´˜‡ 32 ´|ƒé!z|ü‡êâ
15

‘p„ §,wk:ÆÄí§(¢v†"
339
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ
l?§Ýù§{ü´ G 3SؐL¥ÚÑэ˜3˜
å"´\‰/Œ=†ž§G qáuÑ\"3 MIPS32/64 CPU p§ü
‡ÑÑàŠ?1“†”öŠ )¤‡^Š§´‡k¿Â(J§\
7LyüŒ G ˜˜"
TLB ÑÑà‰ÑÔnÒÚþ´ ^I“ µ

• ÔnvÒ(PFN): ù´ƒØ$ £XJ“L 4 KB Ò´$ 12 ¤


Ôn/Œ"
• ›› (D):  1 #NéT\"“D”´ÏT ¡“dirty” ¶
Ϟëe!SN"
• k (V): eT "KT‘ØŒ^"ùwþДvkŸo¿Â"Q,
ØU^§Ÿo‡rù«P¹\1? TLB Qºùkü‡Ï"1˜‡´Ï
z˜‘=†˜éJ[/Œ§ŒU‡Ù¥˜‡",˜‡´­W TLB 
^‡ `z„ݧ ؎uA~"XJ§S3U ¦^73S
L¤•ƒc„I‡?˜Ú?n§Œ±373SL‘ I
PُÃ"3 TLB ­Wƒ §ù¬—,˜«g€5N^AÏ?n§
ØI‡zg^‡­Wžÿъuÿ"
• p„ ›› (C): ù‡ 3 ć8´«©ŒŠp„ 
£cachable¤Ú؊p„ £uncached¤«"
´@„e8‡Š§^uü‡k:p؃N8µ3;ì
õ?nìXÚ¥§ØÓŠ^5‰Ñ;ì´ÄJ«£džM‡
I‡¦åy‡Åìþˆ‡p„ ê☗5¤"3“i\ª”CPU
¥§ØÓŠÀJØÓÛÜp„ +nüѵ'Xß„´£"
äNžë\ CPU Ãþ"
/Œ=†y3{ü §·‚Œ±rþ¡£ã[ÐmXeµ
• CPU )¤˜‡§S/ŒµùŒU´½êâÖöŠ—— Ù§S
/Œ¿Ø u MIPS /Œ˜mAÏšN«"
$ 13 ´©m§e VPN2 Úc ASID£EntryHi(ASID)¤Ü3
˜å§3 TLB ¥?1é"隄Ɉ‡ TLB ‘ PageMask
Ú G K"
• TLB š' iµXJvkƒš' i§Ò>u˜‡ TLB ­WÉ~"
´XJkš§ÒÀJT‘"J[/Œ 12 ^5ÀJ‡^=Œ¡Ô
n/Œ"
5g TLB  PFN ʧS/Œ$ þ¤˜‡Ôn/Œ"
340
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ
/Œkíº‡ w V Ú D "XJØk§½ö D ´" Áã

;§CPU Ò¬>uÉ~"†¤k/Œ=†g€˜§BadVAddr Mì
¬WþƒA§S/Œ¶†¤k TLB É~˜§TLB  EntryHi M
ì¬ý\1ƒA/Œ VPN"
B|Mì Context£64 CPU K XContext¤ BadVPN2 ò
¬£Ü©¤ý\1·‚3 TLB É~­WÏm™U=†J[/ŒeZ
"´ MIPS32/64 5‰éuù /Œ3OÉ~¥1vk²(
`²"3Ù§É~¥j±^ BadVAddr ŒU´‡Ð{"
• ´Äp„ ºXJ C ˜ §CPU 3p„ ¥éÔn ˜êâ
€¶XJvké§Òl;ì¥Ñê⧿3p„ ¥3e˜‡
€" C ˜"ž§CPU QØéØW¿p„ "
, §TLB ¥ê⑇ê#N\=†ƒéþ§S/Œ——Az
KB"ùéuŒõêXÚ5`Ø "TLB Ao´^Š˜‡d^‡‘op
„ § SNÒ´ uS'ÙgNþŒõ/Œ=†êâL"
§S/Œ3 TLB ¥é”}ž§Òu)˜g TLB ­Wg€" XÚ^ 16

‡‡¤XeóŠµ
• kwwkvk(/Œ=†êâ¶XJvk§Tg€òN^?n/Œ†
Ø^‡"
• XJk(/Œ=†§XÚòE˜‡¢yT=† TLB ‘"

• XJ TLB ®²÷ £¢S$1XÚ¥A[´÷¤§d^‡ÀJ˜


‘Œ±¿ï"
• ^‡ò#/Œ=†‘\ TLB"

ë„1 14.4.8 !± )3 Linux ¥äN‰{"


14.4.7 ‹l?U£[“Dirty” ¤
‰A^§SJø;쐦^öŠXÚ~~Ž‡‹lgþgöŠX
Ú£l^½ö䤽öT€±5T´ÄŠ ?U"™?U
£=“À(clean)”¤Œ±†¿ï§Ï2g‡^žŒ±éN´l©‡XÚ
¡E"
^öŠXÚ1{5`§?UL‰“9(dirty)”§öŠXÚ7Lc[
?n§˜†A^§S(å½ö9Ï ;ì “Àz"”  9
Ïù«öŠ§CISC CPU Ï^‰{´373SL¥‘o˜‡ §^±
ùľA¡Š´“”TLB ”(miss)”£=fu)¤„´“TLB ­W(refill)”£=·‚ò‡‰
16

¤º™ù·‚ŒU3 MIPS © ¥öÑ^"


341
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ
L«u) éTöŠ"MIPS CPU =¦3 TLB ê⥏Ø|±ù‡A
5"L¥ D £Œl EntryHi Mì餴#N §,´^5IP
Ö"
¤±æ^ XeE|µ
• ŒÄg\1?Sž§òِL‘ D ˜"£L«Ö¤"

• ÁãéT\ž§Ò¬u)g€¶XÚ^‡ò@Ñù´˜‡Ü{
öŠ|^ù‡¯‡373SL¥˜˜‡“modified(?U
L)” ——ϏT ?u EntryLo(D)  ˜§¦ò5öŠŒ±Ø
u)É~ ~?1"
• \‡˜ TLB ‘¥ D §ùöŠŒ±?1£´u TLB ‘
O†´‘Å،ýÿ§±dŠP4?UG‰{´vk^¤"
14.4.8 SØé TLB ­WÉ~ÑÖL§
MIPS  TLB ­WÉ~o´kgCÕg\:£–3 CPU ÿ™?u
É~ªžXd¶3 Linux ¥?uÉ~ªžu) TLB ­WÉ~´˜‡—·
†§Ïd؃Ĥ"
É~~§N^ž§M‡®r EntryHi(VPN2) ˜fâ™U=†/
ŒÒµEntryHi ˜¤TÐÒ´MïƒA/ŒN# TLB ‘¤I‡
‚ª"
M‡‡˜˜ Ù§/Œƒ'§´ù ·‚˜ÆÑØ^"
AO§·‚Ø^1 6.2.4 !0 ^ Context éу'L‘B
´^“MIPS IO”‰{"MIPS IO‰{‡¦3 kseg2 £¶Âþé
¤‚5L£¢SþجýÓ^õ˜m§Ï kseg2 «/Œ‡?1N§
L¥Œ‰Œ˜ÉجNý¢;ì¤"´ù҇¦z‡‚§|kˆ
gØÓSØN§Linux ؎‡ù«(J"
“O‰{´§Linux  TLB ­WL|„¤˜‡n?L£©O¡“
Û?(global)”!“¥m?(middle)”Ú“PTE”¤"´|©¦^ C Šó÷Œ±
Ø^Uēè 4¥m?ØÑy——ü?(éu 32 MIPS v " 17

ù\Œ±÷Xóé?Û\Ž‡ TLB ‘êâ——XJTêâ3


{§Xã 14.4 ¤«"
ù«(éuSØ;ì¦^ƒé'!Žµ˜‡Œ: 50 MB J[/
Œ˜m Linux §SŒk 12 K ‡ 4 KB Œ§zI‡oi! PTEµ
ùI‡ 48 KB ½ö 12 ‡"ù´˜‡ÅO§Ï/Œ˜mSܬk˜É"
´ÜnŒ‚§|NÒI‡Ó^ 15 †m"SØ£kseg2¤NÓ^
‡õ §´ÏSØNé¤k;ìNÑÏ^§¤±k˜| PTE"
17 ´éu 64 MIPS þ*ÐJ[;ì˜m§¤kn?Ñ´7L"

342
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ

ã 14.4: Linux ü?L£32 MIPS O¤


Œõê 32 CPU Ôn/Œ˜m› 32 µdž§3 EntryLo0–1 M
ì¥k8‡p ™^"Linux £Âù ^5P¹'uL‘˜ ^‡G
"
ù(¿›Xéù 32  TLB ­W?n§SI‡‰üg¢ÚOŽÚng
–"@,'© MIPS Y£Ù¥¢ÚOŽd Context M줧
˜ÖÒ´l LÖ¤þ-S‡§´„؆"
\ŒU5¿ùpQ㐴é,aA½ MIPS CPU"z‡ Linux X
ÚSØÑØÓíº,Ø´µ´3c Linux/MIPS SØp§, '
~§——) TLB ™·¥É~?n§S——´dL°ÄSØ^‡3éÄL
§¥)¤?›“è§éäN CPU Š à~"
Š~f§e¡‰Ñ˜‡Äu 32 MIPS 24-K ØXÚgÄ)¤
TLB ™·¥?n§S"

tlb_refill:
# (1) get base of PGD into k1
lui k1, %hi(pgd_current)

# get miss virtual address (VA)


mfc0 k0, c0_badbaddr # (2) moved up to save a cycle
lw k1, %lo(pgd_current) (k1)

343
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ
srl k0, k0, 24
sll k0, k0, 2 # (3) shift and mask VA for PGD index
addu k1, k1, k0 # got a pointer to the correct PGD entry

# get VA again, this time from Context register


mfc0 k0, c0_context # (4) moved up to save a cycle
lw k1, 0(k1) # OK, read the PTE pointer

srl k0, k0, 1 # (5) Context register designed for 2x64-bit,


# entry, ours are half that size
andi k0, k0, 0xff8 # (6) mask out higher VPE entry

# load the TLB entries


lw k0, 0(k1) # (7) will lost a cycle here
lw k1, 4(k1)

srl k0, k0, 0x6 # (8) shift-out software-only bits


mtc0 k0, c0_entrylo0
srl k1, k1, 0x6 # same for other half
mtc0 k1, c0_entrylo1

ehb # (9) wait for CP0 values to be ready


tlbwr # (10) write into TLB (somewhere)
eret # (11) back to user

TLB ­W“è`²
(1) 3É~?n§S¥§^‡½#N·‚À¦^ü‡Mì£k0–1¤"Ù§
¤kMìф3XA^§Sê⧷‚ØU-"
(2,4,5) T“èϏ˜‡-SÚ,˜‡O t'JÖ"ù‰´
ǵ24-K CPU ÖI‡ÄŒMìJc˜‡±ÏOЧ¤±XJ
\3þ˜^-OŽÄŒÒ¬—˜‡±ÏÊî"3 (2) Ú (4) ?·‚
é ˜‡vk6-?1O§3 (5) ?Òvk"
(3) lã 14.4 Œ„§·‚^J[/Œp ڙ·¥=†/Œ£ u Bad-
VAddr¤Š PGD ¢Ú"Ϗ PGD 3z˜‘¥Ñk£o‡i!¤§
·‚I‡r¢ÚŠ†£ i! £þ"\ØU{üm£ 22 §Ï
\ŒU)¤˜‡vkiéà§ùé MIPS i\1öŠ´š{
"
(4) ë„ (2,4,5)"

344
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ
(5) kü‡M쌱^§·‚Ã{kJ[/Œ"¤±y32g¼
ي§´ùg´l Context MìÖ§Ù¥k·‚I‡“VPN2”
$ "éu 64 CPU ——I‡±ü‡ 64 ‘5W¿˜é
EntryLo0–1 ——(JffЧVPN2 þ£ 4 )¤˜‡d 16 i!‘
¤L¢Ú"´ MIPS32 þ Linux/MIPS  PTE L¥z‘´ 8 ‡
i!§¤±·‚„‡m£˜ "
(6) Ϗ؎‡Context p §¤±·‚òÙ¶-Ñ"=¦3Òƒþ
 ¿šo´"µSMP Linux XÚ^=dÊÏÖ ¤
Context(PTEBase) §3pÞ˜˜‡ CPU ID"

(7) ë„ (2,4,5)"

(8) 3ùaPk 32 Ôn/Œ˜mXÚþ§EntryLo Mìk 26 ‡k¿


 "Linux rÙ{ 6 ‡^Š^‡I“§·‚ÏL£ K ùA "
(9) ù^‰1‘x“o-y Y-ò´–é CP0  EntryLo0–1 M
ì\öŠ)ƒ "3Nõ CPU þ§l mtc0 -• CP0 Mì
\öŠ36Y‚ Ïâ)"
(10) tlwr ò˜‡ TLB ‘\ TLB ˜‡“‘Å” ˜"¯¢þ§§l
Random ¼¢Ú§TMì3ˆ‡ TLB ˜ƒmëŶO꧴
TLB ™·¥u)žmv ‘ŧ¢SJéÐ"
5¿ TLB SN9o‡ CP0 Mìµ·‚ff\1 EntryLo0–
1§EntryHi d TLB ™·¥É~M‡gʧPageMask d Linux/MIPS
SؑoéAu 4 KB ~ê"
(11) eret r·‚‘£;É TLB ™·¥-§ù£‰ATИ:"5¿
eret „´˜‡ CP0 ‘x“o-§¤±† tlbwr ¤ƒ â#Néˆ
£^r-"
14.4.9 TLB ‘o±95¿¯‘
MIPS TLB ´˜ /Œ=†êâ‘8Ü"z˜‘´du­W?n
§S1Äâ?\ TLB",Œõꑏ±ÓªCX"´kžÿSØ
Ž‡UC,‡L‘§ùžŠ¢ TLB ¥€Ò魇 "
éuü‡‘§·‚Œ±^J[/Œ+©‘ ASID é TLB§‰1
tlbp: XJ@pkš‘§·‚Œ±^˜‡Ã=†CXT=†‘"
, §kžÿ\ŒU‡Œ5Ċ"ASID ś#N TLB NB 256 ‡Ø
Ó;ìN‘§´ Linux XÚ3éÄÚ'ŃmÏ~$1?§ê‡õ
u 256 ‡"¤±kžÿ‡˜Ø˜Œ1/Œ=†‘§Ï‡£Â ASID ^u#?
§§ùP/Œ=†Ò† "
345
14.4. MIPS/LINUX XÚ/Œ=† 1 14 Ù ^M‡NÓóŠ
‰ù˜:vk{'{"\gH{¤k TLB ‘£¢ÚŠ3
Index Mìp¡¤§rz˜‘Ö~5M쥧u EntryHi(ASID) †
ASID Š§Š¢†‡£Â ASID Šƒšz˜‘"

14.4.10 ;ì/Œ=†Ú 64 
 MIPS NX(u²žÿ§32 CPU ®²Ñy ˜ãžm §ž
Œ§Sê⮲¯O 100 MB ——/Œ˜me 6 †m" Ïd 18

kv nd‡°%¦^ 32 ˜m§Ø‡Ï[B©ã ~˜m¶ùÒ´


Ÿo£±^rA$1¤A^§SgC3 31 ό˜m"
 MIPS III -8u 1991 cÚ? 64 M잧˜Ý+ku‡’.§
X·‚3 2.7 !?اMIPS ŒU' 32 /ŒýwÑØv‡@o8c"
Mì°Ý\‡‰/Œ˜mO\A‡ Ҍ±y™5 ^ ¶­‡
´ÄöŠXÚêâ(d3 ¿5O Ø´k/|^Ü/Œ˜
m"
duÄ 64 ;ìNé¢S/Œ˜m›3˜ãžmS„Ø
¬ˆ¶nØþ#NŒN^rÚÙ§˜m3Ø^­#|„œ¹eÒU
˜†O 61 "´8cŽ§40 ^rJ[˜m®²é¿v "Œ
õêÙ§ 64 Linux XÚæ^ 8 KB §´ 8 KB 3 MIPS ¥éæ
†"MIPS TLB ü‡=†‘Œ±N‡o 4 KB ‡o 16 KB Œ§Ø
UN 8 KB "ù 64 MIPS SØ^ 4 KB §r 16 KB Š3
]c™5˜‡Ø†À‘"
XJ\£Þw˜eã 14.4 2Ž–˜e3 PGD Ú PTE ƒm˜|¥
m£PMD¤L§ÒUé”t/3n?L¥)Û 40 J[/Œ"·‚r[!3
‰@ ¿Ö è9%Öö"

18 {¤þ§A^§Sé;ì˜mI¦wþŒzcO 3
4
"
346
1 15 Ù SØ¥'u MIPS
Linux
;€¯K
LinuxS،ܩѴ^Œ£‡ C §ŒÜ©“èØ^?˜Ú?
nҌ±†£‡– MIPS ùa˜ßNX(þ"3þ˜Ù·‚w ˜
Œ7XÉ~?nÚ;ì+nÅìƒ'“è"Ùw˜eÙ§I‡AÏ
 MIPS “è/"
cü!9Œõê MIPS CPU 3?§B5ÚM‡{ü5ƒmïµÄ
k§MIPS p„ ~~‡^^‡+n§Ùg§MIPS CP0£CPU ››¤öŠ
kžI‡†Ä6Y‚J"·‚e5òé¯w˜Hk' MIPS õ?n
ì£SMP¤Linux XÚI‡ )£" ˜!y˜úN^DÛª®?Š
ó“è\„˜‡¦^ªÇépSØ~§"
15.1 †+np„ 
3 x86 CPU ¥§Ò´ Linux Ñ)Œ/§p„ Ä´ØŒ„§
dM‡‘o˜ƒ§ÒЖ3†ÚS‹˜"
MIPS XÚØ´ù§Ù¥Nõ MIPS Øp„ vk?Ûa.
“˜—5”M‡"Linux 7L?nÐA‡¡¯K"
15.1.1 DMA 
DMA ››ì†£¦p„ SNLž¤½öÖ£ŒU†Lÿ™
£p„ êâ¤;ì"3˜ XÚþ——AO´ x86 PC þ——DMA ›
›ì¬{rk'êâDÑ&EwŠM‡p„ ››ì§p„ ››ì
7‡žgĊ¢½ö£p„ SN§¦‡L§´ß²§Ò– CPU
3†Ö;ì˜"ù˜‡XÚ¡“I/O-p„ ˜—5(I/O-cache
coherent)”½ö{¡“I/O ˜—5(I/O coherent)"”
ék MIPS XÚ´ I/O-cache ˜—"Œõê˜/e§DMA DÑ3vk
wp„ Ü6œ¹eÒm© §°Ä§S7L+np„ ±y
ج¦^p„ ½;ì¥Lžêâ"
347
15.1. †+np„  1 15 Ù Linux SØ¥'u MIPS ;€¯K
k‡ DMA API •°Ä§SÑÑ+n DMA êâ6~§£Ù¥
Linux
Nõ~§3 I/O-cache ˜—XÚ¥˜¤"\Œ±3‘ Linux SØ èJø
) Documentation/DMA-API.txt 3S© ¥wù ~§"¢Sþ§XJ
\3?½£‡°Ä§S§ÒAwwù © "
°Ä§Sž¦© À«ž§Œ±ÀJµ
• “’˜—5”;ìµd Linux y“˜—5”;ì† I/O ƒm˜—5§Œ
U‡Gј 5U“d"3 MIPS CPU þŒU¢yÒ´Ø^p„
§ùžGÑ5U“d´ØŒÑ"´˜— À«´?nE,
››ì=Ó^þS››êâ(Zª"
• ¦^š˜—;ìŠ À«µQ,˜—;«3Nõ MIPS XÚþئ
^p„ §ùéuŒ DMA À«ŒU—é 5U"
¤±éuŒõê~5 DMA§T API Jø ¶i– dma_map_xx() ˜
aN^"§‚Jø·Üu DMA  À«§´T À«Ø´ I/O ˜—§
ؚXÚU ±$¤¢yÏ^ I/O ˜—5"
SØ;쩧S( À« u DMA Œ±ˆ;«§ mØ
Ó À«¦§‚جÓ˜‡p„ 1§¿± DMA ››ìŒ±¦
^/ªJø˜‡/Œ"
Ϗ¦^ š˜— À«§ÒJø ˜ öŠ À«N^§±93
DMA c ‰1p„ Š¢½£öŠN^µ‰ dma_sync_xx()§API
p„)3ŸožÿNN^ù ¼ê`²"
éu¢y ýp„ ˜—5M‡§“sync”¼ê˜"
ù˜ã API © ^ck Øþ"k˜‡4^ API *Чټê
¶¹“nocoherent£š˜—¤”ù‡c§´\ØA^§§Øš\X
Ú¢3é%"˜‡~5 MIPS XÚ§=¦Ø´ I/O ˜—§U
A4^ IO API °Ä§S~óŠ"
UìöŠXÚIO§ù Ñ´š~{ü†"´Nõ°Ä§Smu<
óŠÑ´3^M‡+np„ Åìþ‰§¦‚XÚþ‘sync”¼ê
k˜‡˜Šf"XJ#P 3·/N^( sync ¼ê§¦‚^‡^
å5E,v¯Kµ†\rù ^‡£‡˜I‡†+np„  MIPS
Åìþžâ¬Ñ¯K"¤±lÙ§/<5°Ä§S“è‡%"‰™5
CPU \þp„ +nM‡§k`ÑåndÒ´ 4^‡£‡óŠ\
^|"
XJ\k,w˜ú Linux ¢y§ )˜eNl MIPS -Ñuï
p„ ÓÚ¼ê§4.6 !Œ±Š˜‡ë"

348
15.1. †+np„  1 15 Ù Linux SØ¥'u MIPS ;€¯K
15.1.2 Ä)¤‘ ‡‰1-
gC)¤-§S)¤-ŒU´33êâp„ p „vk
\;쥧ŒU4T-¤3-p„ ¥SN֏ Lžê
â"
ùØ´SØAk¯Kµ¯¢þ§3˜ \„Šó)ºì“=ž(just-in-
time)”€ÈìƒaA^§S¥-Ŭõ"?ØN±Œ£‡ª)
ûda¯K‡Ñ Ö‰Œ§´ MIPS þ?ۉ{ò5ÑATïá3
synci -Ä:þ"ù´nŽœ/µsynci 3 MIPS32/64 5‰ 2003 c
1‡¥â½Â§NõvkT- CPU E,3^"3ù« CPU þ§˜½k‡
AÏXÚN^5|^A- cache ‰17‡ D-cache £Ú I-cache Š
¢öŠ"synci -[!Œ±31 8.5.11 !Œ±é"
15.1.3 p„ /;ìN¯K
J[p„ £ý¢3p„ §´æ^ J[¢ÚÚI\¤Ð–´
˜gÛ©¤‡§Ï‡p„ éL§Œ±@:m©¿ ÚÄu
/Œ=†¿1?1"
˜ ;ìNkCz§{üJ[p„ Ò7L˜˜§Øšp„ é
ÄKù«“dJ±=É"XJ\^ ASID *ÐJ[/Œ§ÒŒ±«©ØÓ?§
/Œ=†"
öŠXÚ§S ŸoJ[p„ ´‡ Ì¿µJ[p„ ¯
KÒ´p„ ¥êâ)ό±ªLCz"˜„ ó§J[p„ 
3z‡/ŒN¢Ž ч­#u"ù‰¤ép§¤±öŠXÚó§“
Ž¦{~#§Ï ¦K ˜ )œ„œ/§(JÒÚ\ ^‡"€"
3 4 Linux U ¤õ$1J[p„ XÚ ?1Œÿ}Á¥§
Š•p„ k¯KNX(?1£‡óŠ˜Ü©§SØJø ˜X
5KÚ¼êN^"ù ¼ê¶iѱ flush_cache_xx() ‹Þ§3SØ©
Documentation/cachetlb.txt ¥k£ã"·ØU^“flush”ù‡c£ãp
„ öŠµù‡c®²^5L« õ¿g"‡%5¿§3 Linux SØ¥
˜g“cache flush”´ í؆Lž;ìNk'p„ ‘ ‰1
, öŠ"3˜‡Üp„ Ñæ^Ôn¢ÚÚÔnI\XÚ¥§ù
N^ŸoÑØ^‰"
3$´§J[ D-cache 3 MIPS CPU þé„"k #C CPU ‘kJ
[ I-cache: ¢y © ¥£ã“flush”õU§@ÒATv¯K"´æ^Ô
nI\ ^J[¢Ú L1 p„ 3 MIPS CPU þé~„"§‚)û !
¤ã¯K§´— , ˜‡¡“p„ ­K” ¯K——žXÖ
e˜!"

349
15.1. †+np„  1 15 Ù Linux SØ¥'u MIPS ;€¯K
15.1.4 p„ ­K
·‚y3-À܈³5Œ"MIPS CPU Oö1˜1@£Œ±r
p„ æ^J[/ŒŠ¢ÚÐ?†æ^Ôn/ŒŠI\Ð?(Ü
˜å"ùŒU—p„ ­K——[)ºžë1 4.12 !"
R4000 CPU ´1˜‡æ^J[¢Úp„ "UìkŽ§CPU o
´‘k L2 p„ £L2 p„ ;ìØ3¡þ§´p„ ››ì8
¤ CPU p¤§^ L2 p„ uÿ L1 p„ ­K"XJ\\1˜1ê
↮² u L1 ¥˜1u)­K§CPU Ò¬)É~§Œ±^ù‡É~5‰
1˜nóŠ"
´ÏLÑ L2 p„ ¡±9†§ëÚ )˜«Ó^¡È
!¤$ R4000 CNp¾årŒ "“ UNIX XÚQ²±˜
«½ØCª¦^J[;ì§ùÒ¿›XŒ±ÏL››;ì©5;
­K"y3£LÞ5w§·‚@£)­KáuM‡"€§ÏLc[
;ì+n5;­K´ ŽÑù‡"€"´ù«‰{k§±–u<‚
5#P ù:§ ù‡"€üC¤ ˜‡AÚ"
Äþkü«?np„ ­K{"
1˜«´Áãy,‡ž§¤kÚ^TJ[/ŒÑäkÓ
“Ú”£Ò´`§J[/ŒŒ±ØÓ§´§‚ƒmƒ 7L´p„ 
z|Nþê¤"3“ÓÚ”¥ügŒ„?¿êâѬ;3p„ Ó
˜¢Ú ˜ (?n"y˜‡3¤k^r˜mNÑáuÓÚ´
ŒU——õSNë„1 10.3.4 !"
´†Pª BSD XÚØÓ§Linux Jø˜ A5¦y(Ú
C،U"ù)@ ӘQk^r˜mNqkSؘmNœ/£3
MIPS SØþ§Nõœ¹eSØ“N”´˜‡ kseg0 /Œ¤"¤± MIPS £‡I
‡kAÏ“èuÿù«œ/§¿˜nK?ÛP­KN"
p„ /TLB © £=þ!J Documentation/cachetlb.txt¤‰
˜‡]c}Á§Áãrp„ ­K¤˜„J[p„ “,˜«w
G”?n"§Jø ˜ 5¿¯‘§Ì‡´N˜SØ5¦þ?nÚ§N
?nSØ/^r˜m­K"
Œ7p„ ­K?óŠ[ج(å"Lù c§<‚Ï"
Linux Jøõ-Ä<%õU"§S ££ SX?­KŒU»€Ü{“
è/§´‘X#õU\\öŠXÚ§q¬Ñ#¯K"·Ž CPU O
öy3@£ ‚^‡ŽÑ­K¬E¤Nõ‘o¯Kµ5õ# CPU –
 D-cache vk­K¯K"
MIPS Q²´˜‡ékKåNX(§¤±Ù¿ö§¢/ìˆ §
†Ø¶ (JQ§Ù§NX(pk p„ ­K"
1

1 XJ•´ýªÁ«/ª{§@o•˜‡NX(†Ø’½ƒuó”Â~"

350
15.2. CP0 6Y‚‘x 1 15 Ù Linux SØ¥'u MIPS ;€¯K
15.2 CP0 6Y‚‘x
X·‚3þ¡~f¥¤w§6u, CP0 MìŠ CP0 öŠI
‡c[?nµ6Y‚éuù öŠXÚ;^öŠØo´Ûõ"öŠXÚ
,´¤k CP0 öŠu)/"
3˜‡y“ CPU £ÎÜ MIPS32/64 1‡5‰¤þ§Œ±^1 3.4 !
‘x“o-£eret!jalr.hb Ú jr.hb¤"
3P˜: CPU þ§kÉ~\Ú eret -UyJø CP0 ‘x“
o"¤±\˜ã6u CP0 -(¤“螧\ŒUI‡\þ²
LOŽÑ5˜½êþ˜öŠ-£\ CPU ŒUF"\^ssop Ø´{
ü nop ——ù‡Ãþ¤"
P  CPU ÃþA£ã£äN CPU ¤?¿‘xŒ±Yžm§4\
U OŽ7LLõ^-žmƒ ⌱yS"
15.3 õ?nìXÚÚp„ ˜—5
3 1990 c“§MIPS CPU  SGI ÚÙ§úi^5ïEp„ ˜—5
õ?nìXÚ"(ƒ`§SGI ¿Ø´ù‡+mÿö§ MIPS R4000 ´1˜
‡l˜m©OÒéùaXÚO‡?nì§SGI Œ. MIPS õ?nì
ÑÖì/‡?OŽÅÑ´4¤õ¬"
´§ù Eâ¥é´;€é MIPS §¤±·‚´{üJ˜e"
·‚ùp£ãõ?nìXÚ´˜«¤k CPU ѐӘ;짖
éu̇Ö;ìÓ˜Ôn/Œ˜m——=´˜‡“SMP”XÚ£é¡
õ?nìXÚ——¡´“é¡ (symmetric)”´¤k CPU Ú;ì'X
ј§$1ž/ ²¤"
éu SMP XÚÄÀöŠXÚ(AT´ˆ CPU pƒŠ$1Ә‡
Linux SØ"ù˜‡ Linux SØ´3õ‡ CPU þӞ‰1 NLwª
¿1§S"SMP ‡NÝì?˜‡N^§ CPU éÜ·eg$1
óŠ§3Œ^ CPU ƒm¥k/‚§"ùél x86 S¡þÑ)öŠX
ÚSØ5`´˜‡ãŒ,?§´õ‡ CPU ¿1$1¥y¯KÚü‡õ?
Ö CPU ¥y¯Kš~ƒq"
2£M‡";쌱E¤¤k CPU ˜‡Œ¬§½öE¤©
Ùª§Ù¥˜‡ CPU ,‡;«'O CPU ‡“C”"´¤kõ?n
ìXÚÑk˜‡¯K§Ò´;ì5U';^$µÏoN‘°3ˆ
‡ CPU ƒm©§´——Ï~­‡´——+n;ìÜ6‰ë‚
\\ ò´l \Œ ;ìžò"XJvkŒNþp„ §5Uò¬$
4Œù"
p„ ¯K´§CPU ,éõžmÑ´Õá$1§§‚‡‚
351
15.3. õ?nìXÚÚp„ ˜—5
1 15 Ù Linux SØ¥'u MIPS ;€¯K
;ìpƒŠÚÏ&"nŽœ¹e§CPU ˆgp„ ´ß²µz
‡ÖöŠA† CPU †3;ìþöŠ)ƒÓ(J£´
¯¤——ù«p„ ¡“˜—"”´éu{üp„ £´Nõ
MIPS CPU AÚ¤§Ø¬u)ù«œ¹——p„ ¥Pkê†CPU
wØÙ§ CPU é;ì‰?U§CPU ŒU?U§‚gCp„ ¥ê
‧ vk£;ì4Ù§ CPU kwŬ"
\I‡p„ ´ù§ÚÏ~ª˜°Sêâ§O
CPU Ž‡–¯Ó˜êâžUgÄ£O¿?nù«œ¹£õêžÿ‡%%/Š
¢/°Ò1 ¤"Ϗéu“èÚ^ƒé§ù‰nj±é
p"
‡t˜ÙäNNo‰s¤˜:žm"8cíÑXÚ´ùµ;ì
±éAp„ 1£Ï~ 32 i!¤ü ?1+n"z‡p„ 1
‡´Öêâ§ÒŒ±E›?¿êþp„ p¶´˜‡ CPU 3
p„ 18,˜‡p„ ;^"
‡L5§3z‡ CPU p¢y´z‡73p„ 1‘o˜‡²(½
ÂG"o‚Æ|„ªz‡p„ 1½˜‡GŧG=†
d/ CPU ÖÚp„ ƒmuxžE>u"˜—Xڌ±ÏLqÞ
#NG?1©a§) Nõ⊧X MESI!MOSI!MOESI£©O5 u
G¶¡ modified!owned!exclusive!shared Ú invalid¤"˜„5`{ü
Æ—¤þ,"
1˜‡¢SXÚæ^2Âo‚ë¤kp„ Ú̧Ù`:´Ü
ë†öь±£Óž! ±ÓgS——uyù‰4Œ/{z ¯K¤w
¤k¯Ö"p„ mŒõêÏ&Œ±ÏL4p„ “if” p„ 
ÚSm­WÚ£öŠ5ˆ"ùÒ´Ÿo˜—p„ kž‰“if
p„ "”
üo‚XÚØ´*Ðõ‡ CPU ½öépªÇ"y“XÚ¦^\E
,p„ ƒm!p„ ÚSƒmëä¶ù¿›X\ØU6i
f§ XÚ¥vk˜‡/4\Œ±éÑØӞ¦u)gS"œ¹‡E,
õ. . .
3ÖŠ 2006 c±5§ù«Eâ3[£XÚ§ù XÚ
¥3 u˜‡¡þXÚ SoC õ‡?nìƒm;ì"¡?õ?
n£CMP ——Chip-level multiprocessing¤'\Ž–káÚå§Ï3Ø^
épž¨ªÇeO\ OŽUå"®˜¢^ SoC OÚÿÁ{Ø
UGépªÇ—— §3?ۜ¹e§$1u 3 GHz!õш 70 W ¿‡
)ûÑ9¯K?nì3ž¤a¥Äþvk¢^dŠ"éJ3 SoC þ›
Eü‡ifo‚ƒaÀÜ"3“£2006 c¤ SoC ¥§8có²EâY
²´æ^5 CPU 8+§d˜¬†ù CPU ;—ÍÜ3˜åÜ65‘
op„ ˜—5§¢yü‡››:"™5 SoC ŒU¬^˜ tÍÜ
352
15.3. õ?nìXÚÚp„ ˜—5
1 15 Ù Linux SØ¥'u MIPS ;€¯K
CPU ä§ùÒI‡E,p„ ˜—5Æ"
‡4p„ ˜— SMP M‡U󊧄Up/óŠš~(J"3ù
ãåL§¥§) ƒõXÛâU‰ÐƒD²N¬"3†–
Linux SØùaèF!õ CPU A^‹ƒc§ù À܊0 ˜e"e
¡´˜ ~„Þ^¯Kµ
• ÀJØI‡˜—5+nµp„ ˜—5dgC?n§´XJöŠ
Xڌ±wŠM‡@ Ø^½Ø‡˜—5+n§@o5U¬Ð"
ÖØI‡+n——§‚5gS§p„ Œ±ŠâI‡E›?¿õ
°",vk¡´Öµo¬k,‡žÿ3,‡/\êâ"
´ Linux ¥§-v CÖ§ŠAÏ?n"SØgC-3
?Ûp„ ƒc®²S\§¤±vk¯K"A^§S-Ï~
´l©‡Ö\§3Ö\©‡ù˜:§‡Š¢¤kp„ €¶´
L ù:± vk¯K"
Nõêâáuü‡‚§"?§Òo´Xd§ü‚§A^§S¤k^r
˜mê⏴Xd"Ø3´§,3?¿˜‡žm:k˜‡ CPU é
ü‚§?§a,§´A^§S3­#NݞŒUl˜‡ CPU [£
,˜‡ CPU þ£XJŽ‡õ?nìXÚóŠЧ҇é[£‰˜
å¤"éu®ü‚§ê␘t˜—5+n§3‚§[£ž´I
‡‰˜ N´Ñ†Ãó˜np„ óŠ§ù‰Ð?´ÄŠ§
„´˜‡I‡ä¯K"
• f5!.«Úõ?n죵XJØ5¿yêâÖ31 14.2 !¿Â
ef5§@oõ‡ CPU $1Ә“è¿éêâ(–¯?1
û SMP XÚ´Ã{óŠ"
MIPS NX( ll/sc £ë£\1Ú^‡;¤-´ïföŠÚ£
ÄŠ§ÙOŒ±éÐ/*ÐŒ5õ?nì"
• ;얯^SØ(½Ú;ì“oµ3p„ ˜—õ?nìþ§
?˜‡ CPU \;ì/Œž§,˜‡3ÖӘ/Œ CPU ¬
w£N˜:¤êâ# "´˜ \lmŒ7ü‡Ï^o‚
ïXÚ§éJyÖU±ƒégS"ŒõêžÿgSŒUvk'
X——$1uØÓ CPU þ‚§‡ØØ¡éØÙ§‚§?Ð
¯¢"´^;ì3‚§mÏ&^‡o´š~yf"
31 10.4 !?ØLù‡¯K§T!£ã MIPS  sync -Š;ì
“oõU"
sync -„k, ˜¡"3Nõ CPU p§§„kéäN CPU 
½rŠÂ§'X“ÜêâÑ®lmXڝ§”½ö“˜†·
‡Ö菘"” I‡Ö\ CPU ÃþéÑ5"
353
15.4. ' ~§ÃóN` 1 15 Ù Linux SØ¥'u MIPS ;€¯K
15.4 ' ~§ÃóN`
Šé¯/w˜ `z Linux “è§5aú˜eéäNNX(½ö
CPU 5U`zdŠ.kõŒ"
clear_page() ~§3 Linux Sئ^éõ"ÜW÷"¡Ò´†
÷vA^§Sêâ˜m“™Ð©z”Ü©I‡§ ^Š˜«˜Øþ‡§
S¡±“l˜‡§S,˜‡§Sƒmó,&E¦£ù«¦Š‡S
üѤ"
ùp¢y clear_page() æB A‡gŽ"§Ðm̂——zĝ˜Ø
˜‡p„ 1£3ùp´ 32 i!§8 ‡i¤"
T~§^ MIPS Ak pref -±–p„ "XJýýI
‡l;ìÖêâ§'å CPU ‰1„Ý@òs¤éžmµ¤k·‚‡Jc
éÈ҉ý"3ùp§“éȔҴ 512 i!§16 ‡p„ 1"
´XJ CPU Œ±n)ýJ«§Ò^;€“ý”‡§Œ±Ã
IÖ??Ûêâ #p„ 1£§S ‡y­‡p„ 
1¤——ë„1 8.5.8 !"
e¡´T¼ê§O\ 5º"P4 PAGE_SIZE Ï~´ 4096"
#define PREF_AHEAD 512

clear_page:
# the first loop (main_loop) stops short so as not to prefetch off
# end of page
addiu a2, a0, PAGE_SIZE - PREF_AHEAD

main_loop:
# the prefetch. Bring in cache line, but with luck we won’t read
# memory. But if all this CPU offers is a simple prefetch, that
# should work too.
pref Pref_PrepareForStore, PREF_AHEAD(a0)

# now we’re going to do eight stores


sw zero, 0(a0)
sw zero, 4(a0)
sw zero, 8(a0)
sw zero, 12(a0)
addiu a0, a0, 32 # some CPUs choke on too many writes at
# full-speed, so increment the loop pointer
# in the middle to give it a break.
sw zero, -16(a0)
sw zero, -12(a0)

354
15.4. ' ~§ÃóN` 1 15 Ù Linux SØ¥'u MIPS ;€¯K
sw zero, -8(a0)
bne a2, a0, main_loop
sw zero, -4(a0) # last store in the branch delay slot

# the second (end) loop does the rest, and has no prefetch which
# would overrun

addiu a2, a0, PREF_AHEAD


end_loop:
sw zero, 0(a0)
sw zero, 4(a0)
sw zero, 8(a0)
sw zero, 12(a0)
addiu a0, a0, 32
sw zero, -16(a0)
sw zero, -12(a0)
sw zero, -8(a0)
bne a2, a0, end_loop
sw zero, -4(a0)

jr ra
nop

355
1 16 Ù Linux A^§S“
è!PIC!¥
$1A^^‡ GNU/Linux ‚§Œ±Ün/¡§S"ŒõêùaA^3
\1žòƒcƒpÕáÜ©©3˜å§ù‡L§k6u˜«ƒ-?a.
 ˜Ã'“è£position-independent code§=·‚IK¥ PIC¤"3·‚m
©ù‡K8ƒc§‡5¿´ Linux SØ¿vkr›\^?ÛA½ª?È
ÚïA^§S?›“èµSØéu^r˜m¯œAvk‰?Ûb½"
;. GNU/Linux §S)ŒþÕá?È¥“è§ù ¥“è3õ
‡£$1ƒÓ½öØÓ§S¤?§m"4A^§S“̧S”3§S$
1žÄó¥“è§ Ø´3?Ȟò¥“èï?/¤˜‡Õá
¬?›©‡§ù«‰{äkéõ`³µùp`ü:§Äó4Œ/~
§S?›“è3^ÚS¥Ó^˜m§„¿›X?¥¥"€‡
Jø˜‡#¥©‡ÒŒ± "
^þ§SÚ¥ u8I©‡¥§Ù¥¹ýk?ÈÐ?›“è!Ð
©zêâژ ò§SÚ¥©˜åž7‡+n&E£)ÎÒLÚ­
½ &E¤"
ã 16.1 ´˜‡;.A^§SJ[;N”«¿ã"
§Sdõ‡OÕáóü ¤——̧S˜‡§z‡^¥ˆ˜
1

‡"
z‡óü\1?eZS¬£ã(segment)¤¥§Ù¥NõÑkd8I
©‡¬£«(section)¤JøЩêâ"´k S¬——AO´NBæÒ
@ S¬——´d\1§SMï"
3 Linux p§3¹Ó˜óüˆ‡¹Ä§Sƒm£U¤§S
“è"놐§SˆgŒ±PkØÓ;ìN¶Ø+“è uJ
[;ìŸo/§“ègSN”Ñ7LU ~óŠ"†é{`§“
éu¤Äó§Sü‡?›©‡„vk˜—{"·‚¡ƒ“óü(link
1

ÀÜQ²¡Äé–£DSO(dynamic shared object)¤!8I!½¬"ù†


unit)”
C++ 閣object¤vk'X¶“¬”ù‡c®²^5L«?Èì3˜gï¥)¤ÀÜ"¤
±!·‚¦^ù‡¥ác“óü”±J2\ù‡?›“è´3ó ã)¤À
Ü"¥óü©‡Ï~^“.so” ML«"

356
1 16 Ù Linux A^§S“è!PIC!¥

stack

GOT
initialized data

Link Unit
data

code

GOT
initialized data
Link Unit

data

code

GOT
initialized data
Link Unit

data

code

ã 16.1: Linux §SSN”


è7L´ ˜Ã'“è= PIC"=³©|ÚN^-æ^ƒé PC όù˜:
Òr“衏“ ˜Ã'”y–¿Ø¾„"´ Linux PIC “è ˜Ã'5
‡'ù”.õ§ÏØ1“èëê⏌± u?Û/"Ø+óü
だu;ìŸo/§¤k“èÚêâÚ^Ñ7LUYk"
‘ƒ 5Ò´§˜‡óü“èl,˜‡óü¥N^˜‡¼
ê½öÚ^˜¬ê➧¼ê½êâ/Œ£c¢SŠ¤7Ld3$1§
SOŽÑ5"ù҇k GOT(global offset table Û £L)"
zã“èÑk˜‡ GOT§38I©‡¥½Â"3Ä\1ì¤\1
ž§GOT ¹˜‡ §•Tóü“è^z‡ ܼê½êâ(
2

"óü8I“èéù Ü/Œ˜Ã¤µ§k˜‡ÎÒL§ÏLÎ
2ù«`{Lu{z "‡#Nóü“èN^ ܼê½Ú^ Üêâ§ÒŒ±r?Û
ÀÜј? GOT"

357
16.1. óüN¤˜‡§S 1 16 Ù Linux A^§S“è!PIC!¥
ÒÚ¢ÚmN‹l GOT \"\~~¬wù«`{§` GOT z‡
ÜÎÒ3˜‡\‘——ù‡`{v†§3\w\1?S?›
“èžN´Úå(¾"Ä\1ìÖü‡óü8I©‡§§‚©
˜m§, ÏLšÎÒ5é( Ü/Œ˜? GOT"
·‚fâ`L§SØ¿Ø'%A^§S´N璘¢þÄ\1ì¿
Ø´Sؘܩ"§g´˜‡óü§Ì§SҖÚ^٧ĥ˜
Ú^Ä\1ì" PIC ¥A^§SéĞk$1Äóì§òJ[
Å VM N”Ù{Ü©©˜å§, âN^A^§S main()"
16.1 óüN¤˜‡§S
r˜‡#óüÊܧSpÞkn«ªµ
• §S\1ž‘\µz‡óü§ļS£Œ‰1©‡¤m©§¹˜
‡3N^ main() ƒc‡\1?J[;ìÙ§óüL"ù¿
Ø´`§S¢SþÖ\ ;ì§$–Ø´`®²˜ J[;ìN
µù„´˜‡J[;öŠXÚ§§S“èÚêâŒÜ©†¦^
žâ¬Ñy"
• ÄgÚ^~§ž\1µÄ\1ìí´é, óü\1£“Bé
?(late binding)”¤§ù«‰{cJ´óü´˜‡X{¥§Ù
d¼êN^¤§vk ܌„êâ"
\1ì´ù‰µ˜†Bé?óüƒ' GOT \§dó
ü£NÄ\1쥘‡¼ê——T¼êKI\1"”óü!
? GOT ¿ £%/¤ò››ˆ£#\1óü¼ê"38
I©‡¥‡I£ÑBé?óü"
• †\1µ^ dl_open() ¼êéÑ¥óü§, Êë?§S§¿ï
˜‡SN)•#§S‡ÑѼê3Sêâ("
ù˜‡óü󊐪閘‡ C++ 閣¼ê4<£Žå
C++ {¤——ùÒ´¯Ÿoóükž‰Äé–
Ï"
Œõêžÿ§\1ØÓóügS¿Ø­‡µ\1gS¬K;ìÙ
Û§´z‡óüØ+3Ÿo/ÑUóŠ"
´kŒUïÑù§S§Ù¥ØÓóüJø ÓÎÒ" 3

u)ù«œ¹ž§Äk\1óü“‘Ñ”§JøCþ"
kžù´‡†Ø§¬—ó”}§´k ÎÒA¿I£Œkõ‡‘kS›½
3

£\1ž1˜‡½Â‘Ѥ"

358
16.2. Û £þL£GOT¤|„ 1 16 Ù Linux A^§S“è!PIC!¥
16.2 Û £þL£GOT¤|„
§SïL§£·´?ÈÚ)¤§Sžó¤z‡óü–½
˜‡ GOT§,‡L˜‡´Ü{" z‡¼êŒ±égC GOT§ 4

Ϗ GOT  ˜l¼ê\: £þ´®£P4§óüŠ˜‡


N1\S§¤±SÜ £þ†?Ȟ˜¤"
GOT z‡\Ñ´——u——•˜ãêâ½ö“è\: ý 5

鍧d¦^T GOT óü¥¼ê£†½öÛ¹/¤½Â ܍


"GOT ‘6uóü3§S/Œ˜mS©Ù§dÄ\1ì3óü
\1žOŽ"
Ϗóü“è£ÚÖêâ¤?›N”3 Linux ƒaöŠX
Ú¥´ý§·‚ØU3\1žé“è?1?۝6u/ŒN?"
 GOT Káuêâ˜Ü©§ z‡§SgCÑk˜°€"GOT ¥
é¦^óüz‡§SŒ±ˆØƒÓ"
GOT –¯éª„§¤±3 PIC “襧?Èì/óì3ܤ“èž±
gp M썕z‡¼ê GOT"æ^Mì gp ŠLČ´‡Ø†À
J§Ïù«^{aquæ^ƒé GP όêâŽ{§ ö¦ gp ¤ 
3Mì"Pªƒéu GP όêâÚ PIC ŸþÒ´ØoN§¤±Ø
¬kŒÀâ"
GOT 7L3z‡¼êm©žOŽÑ5¿\1 gp Mì"ù:Ø
ÐЍ——éu PIC “è§?Ȟ·‚Ø GOT ¬3=p"´ GOT ´Ó
˜óü˜Ü©§¤±l¼êg\ GOT  £þ3?Ȟ´®
"
XJ˜‡§¼ê“”gC^/ŒN^L§@où‡OŽÒ¬N´ §
ϏҬk˜‡M쮲¹ T¼ê/Œ§OŽ•gC GOT 
žÒŽ:¯"Linux/MIPS ½‡¦¤k PIC N^æ^ t9 5NBN^¼ê
/Œ"
, ¼êÄÜҌ±üڣؘ½´ü‡-¤ŽÑ GPµ
entrypoint:
addu gp, t9, GOT - entrypoint

^ GOT \–¯ØÓóüêâ“è==AT=‡ GOT ø¥


鍵3óüó˜åžÿ© GOT ø§´;3 GOT ¥
†§S\1ž3Ù§óüC\ â(½"¤±?Èì7L)¤‰
1V­mό“è§\1• Üêâ"
4¦^õ‡ GOT ——Ï~´z‡ C ¬˜‡——´?n‡L 128 KB  GOT Œóü
ÄÀ{£XJ GOT ‡Lù‡›§?ÈìÚ®?ìØØ)¤“èSl GOT u¢
¤"
53,«›œ¹e§?ÈìŒU“”ü‡ê⑃målµ@«œ¹éü‡êâ^Ә
‡ GOT \"

359
16.2. Û £þL£GOT¤|„ 1 16 Ù Linux A^§S“è!PIC!¥
load:
lw t1, gp(MYSYMBOL_INDEX)
lw t1, (t1)

store:
lw t1, gp(MYSYMBOL_INDEX)
sw t2, (t1)

call:
lw t9, gp(MYFUNCTION_INDEX)
jalr t9

“è'^½/Œ“èú§´¥`³õ§v±-ž
PIC
dGÑ“d"·‚3ÙmÞžÿJ PIC ü:`³§@´
Jå\?˜Ú ),"ù `³Ò´˜„Bé?‘5;.`³"„Œ
±эõ`³§)µ
• ?›“èµXþ¤ã§\XÚ?›“èØI‡E› C ¥¼
ê" ŒE,¥~¦{üA^§Sƒ/„"
• ?˜‡¥¥"€Ò? ¤k6A^§SµXÚ¥E,˜
“è u¥¥§¤±=¦ü‡XڌUSC ØÓA^§S8ܧ4
¥±†ü‡?›©‡ƒÓ±Ï#E,kÐ?"
• Jø¢3V\ #À‘µ\Ž‡=,‡¥¼ê½öSؼê
ž§\Œ±Jø˜‡æ^#A5­#¢yoN¥"
• ¥3A^§SÚS؃mJø ˜‡ l µù4A^§SÚS،±ˆ
güÕüz"
 §Ä¥“è'·ó C/C++ Jø ˜«p?mu‚¸"
Ø ÏL GOT ‰ˆ« ÜN^ÚêâÚ^¤‘5‰1žmmƒ §Ä
ó¥„k˜‡Ø|σ"k Ä\1§A^§SڥҀ\š~E,
6'Xƒm Åؘµù¦SC#^‡žN´Ñ¯K§íØXÚ¥
Î^‡ÒN´Ñ¯K"˜‡èFÄ¥u¢Ú‡I£XÚ´7،"
@Ï Windows XÚQ²É϶èÍ“DLL /—”(6§Ò´ÏØÓ
A^§SéӘ‡¥‡¦pØoN"
y“XÚ£Windows Ú Linux ƒa¤qE ˜‡U ­è‹l6
'X6êâ¥XÚ"Äó“脬˜†3e§l;˜m²
LÝ5`§§éu‘kŒþA^^‡?Ûi\ªXÚÑ魇"

360
N¹ A MIPS õ‚§
õ‚§M‡´ 2004–2005 cm9OŽÅ.“e˜‡­Œâ»(NBT
"  2006 cØ2@µJ[zwþД¤ Tc
——Next Big Thing) ”
Ý NBT§TEâþgQ3 1975–1980 cm¼dÏJ"õ‚§Š9Œ,
®²L §õ‚§Eâ­‡5E,ØQ~ò"
¤±·‚Áã½Â˜eŸo´õ‚§§, ¯§kŸok^"·‚^“õ
‚§(multithreading)”žØ\ëiΧ^ “MT”“L MIPS32/64 NX(
*УMIPS ASE¤"
A.1 Ÿo´õ‚§º
‚§Ò´Uì§S ¿ã^S‰1-S"
ù‡½Âwþýk:{ü§%4“‚§”¤ ˜‡ŒUƒ5ÃÀ
Ü£÷Xf§SN^ä ´ˆ«ª,´»§Ì‚¥„¬ki@̂¤"´
˜‡DÚ CPU ?n¥äžÿ§@ÒشӘ‡‚§ £–§3¥ä?
n§Sˆ£ƒcØ´¤"öŠXÚ¡ƒ“?§”!“?Ö”!“Š’”ÀÜÑ
´ØÓ‚§"
\Ž‡õu˜‡‚§žÿâI‡½Â‚§£ÄK‚§Ò´ CPU 3$
1§S¤"N´wяŸo3kNõØÓ^rÑ:XŽ‡$1¦‚§S
©žOŽÅþ§\Ž‡õ‡‚§"
kž\Ž‡OŽÅ$1ü‡§S§´7LNA5I¦"k ¯
KPkS3Ÿþ¿u5"£nØþ¤\Œ±˜‡§S§A^,«õ´À
JN^5–eZ¯‡!éѯ‡¿ N^ƒA‚§~§"½ö\Œ±u
²˜‡¿u§SOŠó"
´†¿u§SéJ§l5vk˜«¿uŠóý2A^"3
1970 c“§'uO!?ÚÿÁ?n¿u¯‡§S¢^5ïĈ¤ ˜
‡(Ø"ïÄöªÊ33æ^ÏL{ü½ pƒKõ‡{ü‚
§gŽþ"
éuù ´Aæ^ÄužED4„´Äu{üaq&ÒþÅ
› u ˜|É~-ü}èúSÔµy3ˆ@®˜ï Ô§(Û´Œ
361
A.2. Ÿo‡^ MTº N¹ A MIPS õ‚§
[I"y“öŠXڝ¹ NõØÓÏ&ś§,ØÓ§S ŒU
S.uæ^ØÓf8"
‚§ù‡cŠ«Ou“?§”ù‡âŠÑy§´ 4‚§Ø2kÙ§
KúµUNIX ?§z‡ÑPkgC/Œ˜m§´‚§KŒ±/Œ˜
m"POSIX IO 1003.1£¡“PThreads”¤wª“èÚê₧í
˜|´LªöŠXÚ?§§PThreads ®²y“öŠXÚ2
É"
A.1.1 Ӟ$1ü‡‚§I‡= ] º
,ü‡ CPU Œ±‰"´ù‡‡¦Ð”õ µ·‚Ž¯´
I‡Ÿoº
ÏLw£$1u˜‡DÚ CPU þ¤õ‚§öŠXڏz‡‚§±
&E§Œ±éù‡¯K‰YéÐJ«"‚§Ø3$1ž§ w‚§§Œ
±é˜‡ PC£‚§egm©ž‡‰1/Œ¤Ú¤k§S Œ„Ï
^MìŠ"éu MIPS þ^rA?§S§Ò´Ï^MìÚ¦{ì
hi/lo \\ì"öŠXÚI‡±kc3$1@‡‚§I£Î§±9c
´Ä±kSØA?£‰1XÚN^žÒ¬ù¤I“"‘oõ‡/Œ˜m
 MIPS öŠXڏ¬I‡ ASID Š§Ï=†/ŒžM‡‡^"
ÄþÒù µPC!Ï^Mì!‚§I£Î!Ø%!ASID"öŠXÚ
¡ƒ‚§‚¸§3œ¹e§z‡‚§7LgCkù Mìڍ€"
\„Œ±l, ˜‡Ý5w"bX\Ž‡,< ï\õ‚§M‡§
‡´\M‡U $1yk^‡@òék`Ñå"V?nì x86 PC M
‡£cÙ´†Ù;—ƒ' x86 .ÑÖìM‡¤®²Ñ5ÐAc §Microsoft
Windows!Linux!±9Ù§ Unix ®²N|^@«M‡ "¤± Intel
3Ù“‡‚§”CPU ¥íÑõ‚§Uåžÿ§§Or M‡U妐k˜
‡õ‚§ CPU XÚU Ø^?UҌ±$1V CPU XÚï^‡"‡
3 MIPS þ¢yù˜:§\I‡z‡“J[?nì”üÕJøˆ‡Mì€
"
@´ü«ØÓõ‚§{"MIPS Aæ^=˜«º3·‚£‰ù‡¯K
ƒc§4·‚kÖS˜eŸoŠù‰"
A.2 Ÿo‡^ MTº
cmDÚ CPU E “;죞ò¤ý9(memory wall)"”
2005–2006
$1˜^-s¤žmü$„Ý®²'–žmü$„ݯ éõ"¯
õQºIntel  32 x86 CPU ®²l 1985 c 16 MHz  2005 cŒ 3
GHz ——20 c¯ 200 "3Әžm§;얯žmeü §´==

362
A.3. MIPS N¢yõ‚§º N¹ A MIPS õ‚§
o§l 1985 c 180 B¦y3 50 B¦" 1

oÑ`§ù¿›X3 1985 cÖ˜gS4 CPU ‡Êeo‡±Ï§


y3‡4 CPU Êe 150 ‡±Ï"p„ Ú4ˆ£êâƒc¦þJc‰1
CPU OE␡ŒÌÝU?ùX ù‡¯K§´?˜ÚJ,˜m4
k"Ϗ‡–;ìêâ 4 CPU ‡L˜Œžm3˜=§ù«œ¹
®²i˜„."
i\ª?nìج$1u 3 GHz @oļ´§‚p„ Ú CPU 
OÑ{ü"“i\ªXÚ§ Øõ4 CPU k 50% žm3–"
õ‚§M‡éi\ªXÚk^„k, ˜‡Ï"XJ\k˜ ‡¦ép
 I/O ÑÖI¦§^˜‡;€‚§5ÑÖù‡I¦U¢y¯A"\Œ
±rl I/O XÚÖê₧“ʘ”3@p§êâ˜OÐT‚§Òaå5
óŠ"vk¥äm§ ——­‡´——vkd3öŠXÚm"X
` I/O ‚§7L$1IOöŠXړèº
¤±`õ‚§´‡Ð¯œ"·‚TN‰Qºda¤´ÄØ†Qº†Ï
~i\ªXژ§K¤Œσ´¡¡ÈÚõÑ"
A.3 MIPS N¢yõ‚§º
RISC CPU UrüÑû½3‰^‡KI§ Ø´‰M‡"RISC K
–•u(¹Ï^)ûY"ù¦ MIPS MT k±eA‡A:µ
• pƒŒ„‚§Mìµù‰ öŠXÚéõ‚§››"mftr Ú
mttr ´A-£“†‚§MìDxê┤#NöŠXÚ^‡Ýº
)ØÓ TC Mì"ù´¤kª‚§Ð©zڑoÄ:"
• éЏü‚§µù:„Ì Ú^‡ ÉK"öŠXÚ½öÚ
^‡3OÐ Œ±ˆ2õ‚§"
• ӞJøü«/ªõ‚§µm‚§Ú™Ú“J[ CPU”Œ
±·Üš"Ä MT A5Ò´‚§Ú™§¡Š TC£5 u Thread
Context¤"XJ·‚ÒÊ33ù˜Ú§CPU ¥Ø †‚§‚¸ Ù§
¤kÀÜÑ´"
Ù¢§·‚#N MT CPU E›˜‡ MIPS32/64 oN CPU ¤I‡˜
ƒ"ù aq CPU Mì|ÚÙ§] z˜‡‰ VPEµ˜‡½õ
‡ TC Ú VPE ƒ'駿§‚MìÚ] §VPE ¥ TC ¤
˜‡“J[?nü(virtual processing element)§”ùÒ´ VPE 5
{"˜‡ CPU Œ±¢yõ‡ VPE ±)¤wþ”õ‡ CPU ÀÜ"
1;쑰þ,„LJ¯õ"X¤`“saŒ±ï‘°"‡Ž ážò§ØšÂ
ïþ2"” ——Eâ҃uùé{¥a"

363
A.3. MIPS N¢yõ‚§º N¹ A MIPS õ‚§
MIPS úi1˜‡ MT ¬§34-K CPU§õŒ±kʇ TC 3ü‡ VPE
ƒm?¿©"
VPE mŒ±éõÀܧ,z‡ VPE l^‡þdu˜‡ MIPS32
CPUµùØ´ýV CPU§´wþé–"p„ !Ì6Y‚!›
›Ü6!ŽâÜ6üÚXڝѴ"TLB 3ØÓ VPE mŒ±
^M‡ m§½ö£ TLB ‡9éöŠXÚNõÛÜ?
U¤"
Åì$1z‡-Ñk˜‡ TC Ò§^5ÀJäN‚¸"T-–¯
, Gžÿ——~XÖÏ^Mìžÿ——Ò^Ù TC Ò5*Ю²
½Â3-SMìҍ"˜^-ŠâØÓ TC Òw´˜|ØÓ
Mì8µš~{ü´(k"
duþ¡J TC/VPE E|§MIPS MT Ø´@o{ü"ù^-ŒU
´ TC #5 £l1Ê|Ï^Mì8–¯ê⤽ö VPE #1£l1˜|¼
CP0 Mì¤"ù‡Av¯K",E,´§4@ ØU{ü8M
ì CPU ] óŠ"´@®²ØáuNX(§ ´áuäN¢y ¶ù
á\7LÖ CPU Ãþ"
MT 5‰vkM55½§´¢S MT CPU I‡U¯„ƒ†‚§§ÄK
‚§ƒ†›”žmŒU¬¯Kd3óéþO\"Ù§ÀÜј§Ï~
Ð3¦ŒU[âÝþ·Ü‚§µ3üu CPU ¥§ùu`‡õ‡‚§O
Чz‡ž¨±ÏlØӂ§ˆu˜^-"
A.3.1 MT #O CP0 Mì
ù M쌱©n|µJø‰z‡ TC !Jø‰z‡ VPE !„k
A‡´Jø‰z‡ CPU" ˜‡´Jø CPU ] ˜ü£õ‡ TC? õ
‡ VPEº¤M짌±¶ùpØ?˜Ú`²"
z‡ TC Mì)µ
• TCHalt: ˜ Mì§\ 1 48IÊÅ"8I TC ÊŞ§ÙG´
­½§Œ±S\§Mì"
• TCRestart: ‚§“PC” ——‚§ÊŽž§ùÒ´eg$1ž1˜^-
/Œ"‚§Ø´ÊŽGž§vkõ¿Â"
• TCStatus: ˆ TC “¢3”——SØ/^rG!ASID!±9-8À
‘I“£'X¦U2:I“¤"k˜‡I“L²‚§ÊŽ-
u©|ò´ø£3ù«œ¹e§TCRestart •c¡©|-¤"
• TCBind: ¹†T TC 'é VPE  ID£3 34-K x CPU ¥Œ¤§±
9T TC  ID§ ö´Ö"
364
A.3. MIPS N¢yõ‚§º N¹ A MIPS õ‚§
˜‡X{d^‡ÖMì§;.^{´˜A½öŠ
• TCContext:
XÚ‚§ ID"
ˆ VPE Mì VPEControl ^uöŠXÚ$1L§¥Œ±ÜnUC
››§ VPEConf0–1 ˜4ŒU´˜g˜ Ò2ØC "
A.3.2 É~Ú¥ä
ü‚§ MIPS NX( CPU É~Ï~é6Y‚´4什5§~
^¢y{¿ï Nõ‰1G£6Y‚˜˜§ý-¿ï¤"MIPS MT
ÅìþÉ~u)3‚§‚¸¥——Ù§‚§£–@ 3O VPE þ‚
§¤Œ"Øɋ6UY$1"¤±Œ±ýO·‚3õ‚§Åìþ­#½Â‚
§ž¬k(J"
%¥‡P4öŠXÚ´˜‡§S£Ù¢´˜|‚§¤"äN=‡ TC ‰1=
˜Ü©ŒU'X،"X·‚3N¹mÞw§z‡É~?n§Sg
Ò¤˜‡‚§"¤±‡$1˜‡É~?n§S§·‚I‡/^˜‡ TC 5¥ä
Ù5‚§¿$1ù‡É~?n‚§"
É~©ü«a."¥ä´ÉÚ——§‚u)φäN-Ã'"
´ŒõêÙ§É~´ÓÚ——§‚†A½-ƒéX"·‚kww ˜«
a."
ÓÚÉ~?n§Sd—É~- TC $1"TC á=ʎ~‚§þ
óŠ§m©l·É~?n§Sэ-‰1"
MIPS MT ASE 5½˜ TC ?\É~G§Ó˜ VPE S¤kÙ§ TC ˜
Æ6Ê"†É~?n§SlmÉ~ª§Ù§ TC -⌱‰1µÒ´`§
‡˜† SR(EXL) É~?n§S(— eret -˜"§½öÏÉ~?
n§S©|öŠXÚɁ›“èÜ© ˜""É~?n§S¦þ~
s¤3É~žm5Ò´ûЉ{§ŒõêöŠXÚÑ´ù‰"
´XJ\A^§SI‡Œz¿u5§\AāzÉ~——\
Œ±^˜‡3 ITC –¯½ö yield ^‡þ{l‚§",SüÉ~?n§
S£¦ŒU@/¤7‡G±BòÑÉ~ª"
A.3.3 MIPS MT Ú¥ä
3 MIPS NX(¥§¥ä+nÏL CP0 Mì£äNÒ´ Cause Ú SR¤
?1"ù Mìz‡ VPE Ø´z‡ TC E›˜°§¤±¥ä¶-ÚD4
dz‡ VPE +n"$–MقëØ¥ä&ҏ´dz‡ VPE ?n"
z‡¥äÑ\ŒUë˜‡ VPE þ§ŒUëÜ VPE þ§¤±=
‡ VPE Â¥ä9XÚM‡Ù‚ª§ŒUÚ^‡˜k'"XJ
\Ø\¶-/r˜‡¥äëõ‡ VPE þ§?¿A‡ VPE ьUA¥ä
É~——\ŒVØF"u)ù«œ¹§¤±‡oO낇oO¦U, ¥ä"
365
A.4. MT 3¢S¥A^ N¹ A MIPS õ‚§
¥äÉ~Œ±d† VPE ƒé?ی^ TC A"
MIPS NX(®²Jø õ«ª5áý¥äÉ~"É~ª!Ü¥ä
¦UI“£ŒU"¤Úü‡¥ä¶- §= SR(EXL)!SR(IE)!SR(IM)
——ùpÑØ´Ü——ь±“ŽT VPE þ‚§u)¥ä"
MIPS MT 5‰O\ q˜‡ØA¥änd"y3\Œ±˜˜‡#
z‡ TC  CP0 Mì TCStatus(IXMT) £¥ä¸¤§TŒ±“ŽA
½ TC ^u¥äÉ~"
A.3.4 ‚§`k?J«
k A^§Smu< éuŒ±›› CPU ‘° •˜‡‚§ Ø´,˜
‡‚§UåL«a,"MIPS MT 5‰Jø ù‡A5§¦+¿vk`²N
¢y"˜‡NÝüÑ+nì£policy manager§~ я PM¤´ CPU Ü
˜¬Ü6§Œ±éäNA^½›"PM z‡ TC )¤˜‡ 2 `k?"3
Øp¡§o´`k‰1Œ$1p`k? TC§ Ø´Œ$1$`k? TC"
y3Ò5µØmu< æ^ù‡Y¤õ5„žL@"
A.3.5 ^rÄ‚§Mï——fork -
õ‚§M‡„k˜‡ék¿g„vkû^z&¢A^§Ò´Jø,
˜«uy9|^G1Ž{¿15{"~X§˜‡Ì‚Œ±ÏLü‡‚§
©O$1ÙÛêÚóêĝ5`z"
XJù‡3‘oöŠXÚ|±e¤§Ò‡¦k˜‡š~pÅ
›=Iu#‚§"MIPS MT  fork -Jø ù˜«Å›"
ù fork d,s,t ¤ ˜^^r?-"XJ˜ƒ~§T-3OÒX
TC þm©˜‡#‚§§l s ¤•-?m©‰1"f‚§ d ¼IŠ‚
§ t Š"
öŠXÚÏL‘o˜‡©|ÒX´d ˜s TC À³£ÏL˜‡I
“ TCStatus(DA) 5£O¤"#‚§¤A^§S?Ö §ÒªŽ‰1§
¿^˜^ yield $0 -r TC „‰ À³" 2

fork ´˜‡cÇ5A5µ3ÖŠž§„vköŠXÚ|±ù TC
À³"˜3@p´ 4 MIPS MT NX(U ‘Xõ‚§VgDÂÓ
âk| ˜"
A.4 MT 3¢S¥A^
y3,„@§´<‚^õ‚§§äN^ MIPS MT 3‰ ŸoQº
2 ‰ yield  MìöŠê˜‡š"ŠK^uØÓ8"

366
A.4. MT 3¢S¥A^ N¹ A MIPS õ‚§
/`§<‚3&¢½ömukü«ØÓXÚ"˜«´Ï¦?U
IO SMP öŠXړ裏Né?U¤§±·Üu•ƒéDÚõ‚§
óŠJø MT M‡õ‚§pǶ,˜«Ï¦3öŠXÚ“ƒe”#A
^Jø˜‡. !‡¯„A“¢ž”‚¸"
A.4.1 SMP Linux
£‡˜‡ SMP Linux ¹ü‡½õ‡ƒu SMP XÚ CPU  TC 
MT CPU þ´kŒU"XJ\k˜‡®²^ Linux ¢y PThread ‚§
API £¡ NPTL¤A^§S§@o\rTA^§S˜ù Linux þ$1
ÒU|^õ‚§õU "
SMP XÚI‡3 CPU móŠ£Ú&Òþ§éu MIPS XÚ§ù ´Ä
uë£\1/^‡;-é£1 8.5.2 !0 ll/sc¤ï"¤±Øš MT
CPU 3 TC m± ll/sc ŠÂØC§ÄKØU^ù‡{µMT CPU (¢
y 3 TC mùü^-5ŠÂØCœ34-K xM‡‹lz‡ TC ux
ll ¤^/Œ§XJÙ§ TC ;öŠ?U Ó˜‡Vi/ŒÒ@´
»€ 룧ù± ll/sc ŠÂØC"XJ, +n^‡+ TC ¿\
TCRestart Mì‰1­#NÝ{§ë£ ¬‹»"
XJ TC uØÓ VPE§@o SMP £‡ÒéN´§Ï˜‡ VPE ¥
ü‡ TC OҔ´˜‡Õá CPU"´ MIPS úiy² Œ±3
Ә‡ VPE ¥^ØÓ TC"ùpk˜:Jݧ´wþج—õ5
U›”"
, 魇˜:‡5¿§k˜Ü©A^§S⬆ÉÃ"\I‡˜
‡¦^ Linux ‚¸!|^ ‚§A^§S§ 3ŒõêžmØ=kü‡‚§
3$1§„‡¦3ü‡‚§mÄþ²þ/© CPU ] "
A.4.2 ^ MT ¢yp„A§SO
MT k1öæ^,˜«{´^;^ TC JøCM‡Uå§Ù
AžmŒ±ÕáuöŠXÚSu)$1uO VPE þ,˜‡ TC ¥?Û
¯‡"ù˜‡XÚkF"3ü‡¡ÑˆZ(Jµéup “èJø
B?§‚¸§éu¯‡¯„A4. M‡C{ü"
ù«XÚþ$ “è4I‡pÓÚś"'å?nì‰1„ݧ
=¦´ I/O Ö„ݏú”´Ú÷1"MIPS MT ½Â ü«Å›µ&Ò4
†(yield-on-signal)ڀ›;(gated storage)"
þ¡J` yield -äkV­A^µ§Ø´^5Jø† fork ƒ‡^
r?‚§ªŽž§T-Jø ˜«4‚§–M‡¯‡ª"M‡¯‡
Šâ CPU  Ü&Òk55½Â"
34-K CPU Œ±?¿ 15 ‡ Ü&Ò"yield -˜†¤ÀJÙ

367
A.4. MT 3¢S¥A^ N¹ A MIPS õ‚§
¥˜‡&Òk§ÀJ=˜‡&Òûu˜‡Ñ\ëêM슧TMì
Š)º˜‡ 15  •þµ “1”L«AƒA?ÒÑ\&Ò"Ù¥
˜‡&Òkž§3˜^ yield -þÿ. ‚§á=m©‰1"
´\ŒUŽ‡˜‡„UDÑêâ¿ 3^‡‚§ƒmŒ^ÓÚś"
XJ´ù«œ¹§€›;ìÒ þ^| "MIPS MT ½Â€›;ì
˜‡AÏÔn/Œ«§3٥֍-¬—{l"Ö€›;ì
‚§3TÖöŠþ{l§˜†êâ¤õDÑ."„Œ±r1ªŽ™¤
öŠ£4z‡–‚§Â˜‡É~¤"
3p„êâ6ŒU¬†Ø½êâ¬(—^‡¥äM‡¥§€›
;ì'·Ü"
34-K CPU Oژ‡¡ ITC£‚§mÏ&;ì (interthread communi-
cation memory)  ¤€›;ì˜åǵITC Jø æ^“˜/÷£empty/full¤”
;½öá FIFO ^‡é^‡Ï&"õ&E§žë MIPS úi CPU
Ãþ"

368
N¹ B MIPS -8Ù§ŒÀ*
Ð
B.1 MIPS16 Ú MIPS16e ASE
´˜‡ŒÀ-8*Ч§Ur?›§Sº€~ 30-
MIPS16
40%"MIPS16e ´®²^3 MIPS16/32 IO CPU þ© MIPS16 -8
˜‡Ñ‡Or‡¶i"MIPS16 ½ u“躀ŠÌ‡Ä|
Ü——õꜹeù«|ÜÒ´4$¤XÚ"¦+A^uA½¢y§§
%´˜‡õ‚ûIOµMIPS úi!LSI!NEC Ú Philips Ñ)|± MIPS16 
CPU"
3c¡ 1.2 !¥·‚`L§¦ MIPS ?›“è'Ù§NX(ŒÏ¿
Ø´ MIPS -¤óŠ § ´Ï-Œ ——z‡-oi
!§ƒ'ƒe, CISC NX(²þ-ݐkn‡i!"
MIPS16 O\ ˜«ª§3ù«ªe CPU Œ±é½ݏ 16 
-?1Èè"Œõê MIPS16 -Ðm ¤˜^~ MIPS32/64 -§
éw,ùU´˜‡ƒɁ›-f8"' Ò3u¦ù‡f8Up
?è@Ü©§Sv Œ§±¦§SoNŒwÍØ "
,§16 -¿ØU¤˜‡ 16 -8"MIPS16 CPU ´‘k 32
½ö 64 Mìý¢ MIPS CPU§Ù$ŽÑ3‡MìþöŠ"
MIPS16 Ø´˜‡-8——'X§Qvk CPU ››-§v
k2:$Ž-" ùvk'X§Ïz‡ MIPS16 CPU 7L‡$1
1

 MIPS ISA"\Œ±$1 MIPS16 Ú~ MIPS -·Ü“è"z‡¼ê


N^½öMì=£-ÑUUC$1ª"
3 MIPS16 ¥^-/Œ$k éª?è´QBqp
"MIPS16 -7Lói!é৤±1 0 Ø2´-|¤Ü©
¶ “ƒ´§z^a=Ûê/Œ-m©‰1 MIPS16§z^a=
óê/Œ-£~ MIPS"MIPS f§SN^- jal 8I/Œo´
1 éÜ©-8Jøò-ÝØ ˜Œ‡§ù‡Ž{Ø´ MIPS u²¶ARM úi
ARM CPU  Thumb ‡´ÄkJÑù‡Ž{"

369
B.1. MIPS16 Ú MIPS16E ASE N¹ B MIPS -8Ù§ŒÀ*Ð
ié৤±Ú\ #- jalx§§Ûõ -¥ª=†"
 r-Ø ˜ŒŒ§éuŒõê-·‚© 3 5ÀJM
ì§ùk 8 ‡Ï^M쌱gd–¯¶3Nõ MIPS -¥Œ±„
16 ~ꍏØ §Ï~Ø ¤ 5 "Nõ MIPS16 -½ü‡M
ì§ Ø´n‡", §„k˜ AÏ?è5Kò3e˜!£ã"
B.1.1 MIPS16 ASE ¥AÏ?肪ڍ-
MIPS16 kü‡A½f:¬\Œ§Sº€µ5 á=êE~þ´Ø
§3 load/store öŠ¥vkv ό‰Œ"n^#O-ژ«AO
½kÏu)ûù ¯K"
extend ´˜^AÏ MIPS16 -§§d 5 “èÚ 11 ¤"ù
‡ 11 Œ±Ú Y-¥á=ꍃë§ùÒ#N¦^˜é-5
?è 16 á=ê"ù^-3®?Šó¥wå5Ҕ˜‡-cM"
C1~þ3~ MIPS ªeÑI‡ -§3 MIPS16 ªe
´ãŒKú¶r~þ˜3S¥, 2Ö§‚¬¯˜ "MIPS16 O\
ƒéu-g ˜\1öŠ(PC ƒé/Œ\1)§¦~þŒ±i“èã
¥£;.‰{Ò´˜3¼êmރc¤"ù ´=kvkî‚éAu~
MIPS - MIPS16 -——MIPS vkƒé PC όêâöŠ"
Nõ MIPS  load/store öŠ´†3Òv(stack frame)p§$29/sp ŒU
´~^ČMì"MIPS16 ½Â ˜|Ûª¦^ sp -§#N·‚r
¼êÒvÚ^/Œ?è? ØI‡˜‡üÕMì"
MIPS  load -o´)¤ 32 /Œ"dui\1-=/Œ´
4 êžâÜ{§$ü /ŒÒL¤ "MIPS16  load -|±CŒ¢
Úµ/Œ £þ¬Šâ–é–Œ•†£ §l O\ -¥Œ^
/Œ‰Œ"
Š˜« A:ś§MIPS16 ½Â ˜ -§#N3 8 ‡ MIPS16
Œ–¯Mì† 32 ‡ MIPS Ï^Mì¥?ۘ‡ƒm‰ØɁ›êâ
Dx"
B.1.2 é MIPS16 ASE µd
MIPS16Ø´˜«·Ü®?Šó?§Šó§·‚ùpØO駍[`
²"§´‰?Èì^"Œõê¦^ MIPS16 ª?ȧSº€Ñ¬ 
^ MIPS ª?È 60-70%"ù' 32 CISC NX(“荏;n§‹
ARM  Thumb “è Øõ§ÚX 16 CPU ƒ'k˜½¿å"
´vk¤Ìê¶MIPS16 §SŒU' MIPS ?ȞõÑ 40-50% 
-"ù¿›X3 CPU Øþ$1˜‡§S¬õ^ 40-50% ž¨±Ï"´$à
CPU ²~̇É;쁛§ Ø´É CPU ؁›" MIPS16 §S

370
B.2. MIPS DSP ASE N¹ B MIPS -8Ù§ŒÀ*Ð
I‡$‘°5-§l ü$ p„ "”Ç"3p„ é¿
§S;ìkž§MIPS16 ò¬ „Ý 姄kŒU`þ~ MIPS
“è"
du5U›”§MIPS16 “è3kŒþ;ì] Úo‚‘°OŽÅ¥
vkáÚå"ùÒ´Ÿo§´˜«ŒÀ*ÐÏ"
3ÙA^‰Œpà, MIPS16 ò¬†^‡Ø EâÐm¿"˜‡ÊÏ
MIPS §S^Ï~©‡Ø Ž{Ø ? ROM ;ìƒ §ò¬'™Ø Ó
 MIPS16 “è§ 'Ø LÓ MIPS16 “èь¶ XJ\XÚPk 2

v SU r ROM ‰©‡XÚ¦^§ r“è)Ø  RAM ¥‰1§


@o^^‡)Ø ISA éŒU¬‘5ÐoN5U"
kù˜«²(ª³§@Ò´Œþ¦^±i!?è)ºŠó£Java
½§ Yö¤5Ö3žmþ‡¦Øî‚Œ¬§S"@«¥m“躀š
~§'?Û?›ÅìèÑpõ"XJk)ºìژ é5U‡¦î
‚§Sæ^Åìg ISA Ö§@oæ^;n-8?肪ò¬
K§S˜Ü©",)ºì£AO´ Java¤ŒU¬š~Œ§´A^
^‡E,ÝÜOò¦)ºìgŒ­‡5:ìü$"
·ý MIPS16 ò¬UY3õÑ!º€Ú¤Ɂ›XÚ¥‰ŒA^"
§„´Šu²Ú‘o§Ïù¥k˜ XڌU¬1þ)"
B.2 MIPS DSP ASE
MIPS DSP ASE 8I´ŽÑDڍ-83¡éõxNA^ž¤a
Øv"^‡N›)NìѪ&Ò?è/)è!6xN?n½öã”/ÀªØ
/)Øù óŠÏ¦^ ÄuE,êÆ$ŽŽ{§˜Ý@áu;€
êi&Ò?nì3/"3OŽ gþ§ù«õxN?Ö~~9éŒ
1•þ½ê|êâ­E?1ÓöŠ"
3ÄuMìÅìSܧ\„•þ$Ž˜‡Ð{´rõ‡ê⑋
ü‡ÅìM쥧^˜^Mì--Mì-3z‡Mìz‡
þ‰1Ó$Ž"ù´˜«4†¿1?n§‰ SIMD£“L“ü
-õêâ(single instruction, multiple data)”¤"DSP ASE )oi!ÚVŒi
 SIMD öŠ"
Ø==´•þöŠ§DSP ASE „kA‡OAµ
• ½:êa.µ3ù ‚¸¥^2:OŽ£l¡¡ÈÚõÑÝ5`¤
„Ø ²L"DSP A^^‡æ^½:ê"ù˜‡ꐴ˜‡‘ÎÒ
꧴)º¤Têر 2 ,g¤Š"Û¹ƒØÏf´
2 (65536) 32 ꂪ¡Š Q15.16 ‚ª¶@´Ïk 16 ^Š
16

êÜ©°Ý§15 ^ŠêÜ©‰Œ£p ^ŠÎÒ ØŽ3S¤"


2 ;n?肪4Ø Ž{Œ|^P{Ýü$"
371
B.3. MDMX ASE N¹ B MIPS -8Ù§ŒÀ*Ð
æ^ù‡P{§Q31.0 Ò´DÚ‘ÎÒê§Q0.31 ´0u -1 Ú 1(
C1) ƒmê"(JL² Q0.31 ´ DSP A^¥ÉH 32 ‚ª§
Ϗƒ¦žØ¬ÄÑ£Ø 4àœ¹ −1 × −1 —ŒŠ 1¤"Q0.31 ~
{ Q31"
DSP ASE Jøé Q31 Ú Q15 £kÎÒ 16 ¤ê|±"

• ڎâ$Žµé DSP Ž{SïÄÑu´Øy¢——§‚‡¦„Ý


é¯"Œ±O˜ |©Ž{±;ÄѶ´¿Ø´oUkùŽ
{"3OŽ(JÄўÏ~ˆ³‰{Ò´r(J^Œ±L«Œ
½öê“O"ù‰1ŽâöŠ¡Ú ——DSP ASE ¥é
õ$ŽÑ¢y ÚA5£3Nõœ¹eӘ‡-ӞkچšÚ
ü‡‡¤"
• ê¦{µXJ\ÏLE^°Ýê¦{ìrü‡ Q31 ꃦ§@
o\˜‡ 64 (J§d˜‡ Q62 (JÚ£3p þ¤E›ÎÒ
¤"ù‡(JL«ª'%§rù‡Š†£˜ )¤˜‡ Q63 ‚
ª£é 64 ¦^g,¤k^ ")¤ Q31 Š Q15 ¦{‡†
£"
• \µk êöŠ%@¿ï$k "´XJï L«Š
‡L#$  1 Š˜Œž§ò(J?˜ Cq(JÐ"ùÒ´
DSP ASE p\¹Â§aq›?›oÊ\"

• ¦\\öŠko‡\\ìŒÀµ £^u½:a.žŒU¬Ú¤"
– MIPS úi 24-K CPU ù«y“ MIPS32 CPU ®²k˜‡ƒ¤
Ùê¦{\\$Ž§´^uêÚÚ$ŽžÇ¿vk@op"
k o‡ 64 (J/\\ìMì ac0–3 ± §¦{\\öŠÐ^"P
 MIPS ¦Øük˜‡\\ì§ÏL hi/lo M얯"# ac0 Ò
´P hi/lo§ØLå ‡#¶i"
DSP -8˜:Ñؖ~5 MIPS32 -8"§´˜ ^uAÏ
8-8ܧéõžÿé´­‡Ž{¥®9:"
k' DSP -˜AL§ë„ MIPS úiч 34-K Ú 24-K CPU §
S Ãþ"
B.3 MDMX ASE
MDMX ´˜‡‡' DSP ASE Põ}Á§3 MIPS -8‰ŒSJ
øaq DSP  SIMD õxN$Ž"MDMX ´ SGI muچ§u 1997 cú
Ù"
372
B.3. MDMX ASE N¹ B MIPS -8Ù§ŒÀ*Ð
öæ^{3XãŒØÓ"MDMX ÀJ 32:ü 64 M
ìp?nõxNê⧠DSP ASE æ^Ï^Mì§õ괊ê¦{ü
*Ð ï"MDMX ÀJŒU·Üuùāp5U½ö?§B5
|ܧ´‡Ó^õ7¡¡È"
DSP ASE Ú\·‚Ÿ¦ MDMX 3¢S^‡¥2A^ŒU5
Jø q˜‡nd§¤±3d·‚Øõ! MDMX"XJք¬k1n‡{§
N@žÿ·‚¬uyù‰Ù¢´˜‡†Ø ØØÅ"

373
MIPS âŠL
$f0–$f31 Mìµ 32 ‡Ï^ 32 2:Mì"3 MIPS I(32 ) CPU§
kóê?ÒM쌱^ŠŽâ$Ž£ÛêÒMì 64 V°
Ýê$ 32 ¤"
$n Mìµ CPU  32 ‡Ï^M샘"

a0–a3 Mìµ CPU Mì $4–$7 O¶"

ABI(Application Binary Interface): ï§S?›“èA½I


O§<‚@3ÎÜTIO‚¸eU y(‰1"MIPS32 CPU Ï
~^˜‡¯¤± o32 IO§ 64 öŠ§Œ±ÀJ n32 Ú n64"Nõ
i\ªXڝ6u‡ API ˜‡f8"
\\ì£accummulator¤: AO½Mì5ÓP­E\~$Ž(
J"3 MIPS NX(¥§¦{ü(JMì hi/lo ¤\\ì
/Œ«(address region): ´ MIPS §S/Œ˜my© kuseg!kseg0!
kseg1 Ú kseg2"ë„z‡üÕ«¶ie¡SN"

/Œ˜m(address space): A^§SŒ„‡/Ÿ‰Œ"3oö


ŠXÚe$1§S‡u/Œk5¿?1=†"Ϗù˜‡öŠ
Xڌ±Óž$1NõA^§S§kNõ/Œ˜m"
Alchemy Semiconductor: 1999 cå5úi§ḋ StrongARM
O< lm DEC§¿3›E$õÑ!¥5U!pÝ8¤ MIPS ‡?
nì"¦‚r¤õM÷3“EûOŽÅ” ¿ªOýóƒþ§´ù
˜ý󿙤y¢"2002 c Alchemy ¤ AMD ˜Ü©§2006 c¤
 Raza ˜Ü©"Ù AU1xxx ¬‚3•i\ªXÚøÀ"
Algorithmics: ˜[=Iúi§;€l¯ MIPS EâÚó䧷´Ùܺ
<ƒ˜"
éà(alignment): êâ3;쥽 A½i!>."XJêâm
©/ŒØ±g¤Ó˜mŒ¤{ê"§K¡g,éà"MIPS
374
MIPS âŠL
CPU ‡¦ÙÅì|±êâé–g,éà¶Ï i£oi!¤‡éào
i!>.§2: double êâ7Léàli!>."
alloca: C ¥¼ê§ˆ£˜¬3N^T¥¼ê¼êˆ£žgÄ£Â
;«"
Alpha: d Digital Semiconductor úi›E RISC CPU a.¶Ž´
MIPS CŠ"

ŽâÜ6ü ALU(arithmetic/logic unit): ^5 CPU ¥‰1$Ž


õUüâŠ"
AMD: ˜[3éȇ>fúi§3 2004 cc ϏEÑ ' Intel
úiÐ x86 CPU Ѷ"ÖJ§´Ï§Â Alchemy
Semiconductor k ˜‡ MIPS i\ª¬‚"

©Û¤(analyzer): ë„Ü6©Û¤(logic analyser)"


Apache |(SVR4.2): 3 UNIX System V Release 4.2 öŠXÚÚ MIPS
ABI IO(ÜÄ:þ§Jø MIPS NX( UNIX XÚøAûé
†"
A^§S API(Application Program Interface): é, ^‡õ
UL§N^§Ï~±˜|IOz C/C++ ¼êN^/ªJø"ù
´˜‡•ŒŽ{§ ¼˜ß ¡k^19Ù(Jù˜¯
¢‹Ï "
NX((architecture): 넍-8NX((instruction set architec-
ture)"

Y(archive): 8I“è¥, ˜«{"


ëê(argument): C ŠóD4‰¼êŠ"OŠó ¡Šëþ(parmater)"
Œ±n) C ëê´DŠN^ëþ"
ARM: oÜ3=I˜[u˜ ARM NX(?nìØÇú
i"ARM NX(Äþ´ RISC§فÐO´36Y‚B5Ú
>´{ü5ƒmJ¦B5", Ù{ü5Ï ARM úi¤ 1
˜‡k¿å 32 ^Ø CPU øAö"
ASCII: š~tÑ^u C ŠóiÎ?è"

ASE: MIPS NX(;^*Ð"3 MIPS32/64 NX(Ä:þ½Â


ÐA‡ŒÀ*Ð"ASE 3^ MIPS32/64 ½Â˜‡I“L«§
Ï~´,‡ Config CP0 M쥍"
375
MIPS âŠL
;^8¤>´ ASIC(application specific integrated circuit):  ^
u,‡A½>´;€O½öN¡"
ASIC-core CPU: ë„ CPU core"

ASID: 3 CPU  EntryHi M쥑o/Œ˜m ID"^5ÀJ˜|


A½/Œ=†µk@ g ASID ŠÚcŠš/Œ=†â¬
‰ÑkÔn/Œ"
®?짮?“è(assmble, assembly code): ®?“è£kž¡®?
Šó§S½“褴Œø<ÖÅì-/ª"®?ìÒ´r®?Š
ó§S€È¤Œ‰1§S§S§ŒU‡²L˜‡¥m8I“è"
ƒé;(associative store): Œ±^‰Ñ;êâ˜Ü©?1é
;ì"éuz‡êâI‡˜‡üÕ'짤±Œƒé;ì^
KŒþÜ6"MIPS TLB XJSC {§æ^˜‡ 32  64 ‘ƒ
é;ì"
ƒéÝ(associativity): ë„ cache, set-associativity "
ÉÚÜ6(asynchronous logic): ÉÚ>´Ò´Ø´Œ7X˜‡½A‡
ž¨&Ò|„>´"ë„ÓÚÜ6(synchronous logic)"
(ATMizer): d LSI  ATM 䝛E܇¶k˜‡S˜ MIPS
CPU ŠÙ¥˜‡Ü‡"

f!f/!f5(atomic, atomically, atomicity): ^OŽÅ‰


Æ1{5ù§XJ˜|öŠ‡oÜщ1‡oÜÑ؉1Ò¡
f"
£ˆ(backtrace): ë„Ò£ˆ(stack backtrace)"
ÃJ[/ŒMì(BadVAddr register): ^5Ϗ,«Ï£™
éà!،–¯!TLB ™·¥¤—g€/ŒŠ CPU ››M
ì"
“o!‘x(barrier, hazard): 넑x“o(hazard barrier)"
“o!;ì(barrier, memory): ë„ sync -c^"
BAT: 3vk;ìNM‡£TLB¤ MIPS CPU ¥E^§S;«
˜‡£ÄþLž¤À‘"
bcopy: C Šó^5€˜¬;ìSN¥¼ê"

376
MIPS âŠL
ÄOÿÁ(benchmark): Œ±$1uNõØÓOŽÅþ^±'ƒé5
U§S"ÄOÿÁlE^5ÿþA½?Ö“è¡äüz¤Œþ
@‡§ùéu˜‡XÚ?n~„A^§S„ÝŒ±Jø&E"
Berkeley Unix: ë„ BSD Unix"

ÚÉ~•þ BEV(boot exception vectors): CPU GMì¥


˜ §Œ±—g€²L uØ?1p„ (kseg1);«˜é^
•þ"T ˜CE žå:ùü‡ÑŒBNӘÖ
;ì"
bias: ë„ floating-point bias"

BiCMOS: ˜«AÏ¡›EE⧷Üæ^p—Ý$õÑ CMOS


¬N+^uSÜÜ6§¯„Ú€=gêV45¬N+Š"3
1980 c“ Ïé CPU éž)§´vk<^ù«E⌤õ"

Œ—à(big endian): £ã˜«rõi!êpk i!u$


i!/ŒNX(¶ë1 10.2 !"
(bit field): i˜Ü©§)ºü‡ 8Ü"
¬Œ(block size): ë„ cache line size "
{l(blocking): ˜«3¤ƒcʎ‰1öŠ"
gÞ(bootstrap): KIl˜« CPU ½XÚ?uØ(½GeéÄ
§S½ö§S¡ä"
©|(branch): 3 MIPS -8p´ƒéu PC =£"
©|¿ó(branch and link): ƒéu PC f§SN^"
©|ò´ø(branch delay slot): u;쥍-S¥;‹˜‡
=£/©|- ¡ ˜"?u©|ò´ø¥-o´3©|8I
-ƒc‰1"kžÿk7‡^˜^ nop -W¿©|ò´ø"
©|`z(branch optimization): £d?Èì!®?ì½ö§S ?1
¤ ¿©|^©|ò´ø éS¥-gS?1NL§"
©|m(branch penalty): Nõ CPU 3©| ÊîA‡ž¨±Ï§Ï
®²ò©|ƒ -? 6Y‚¤±7L£ˆ¿­#W¿6Y‚"
ù‡ò´£±ž¨±Ïü ¤¡©|m"3á6Y‚þ"§´
36Y‚ R4000 ü‡ž¨±Ï©|méÇKéŒ"

377
MIPS âŠL
©|ýÿ(branch predicaion): ˜« CPU ¢yEâ§Ù¥óŠu6Y‚
cà{üÜ6£O©|-¿ ßÿ©ƒ8I"6Y‚ãŠâ
ßÿ?1§ Ø´˜†^S"CPU I‡, ś3uyßÿ†Øž?
1£ò"
(JL²ØI‡pE,Ý©|ýÿJÒéÐ§Ø {ü 32
CPU ƒ ÊHÑæ^"

BrCond3–0: d?nì^‡©|-†ÿÁ CPU Ñ\&Ò"

ä:(breakpoint): NÁ§Sžÿ§ä:Ò´NÁ)¤g€¿ò››
ˆ£^r- ˜"ÏLÊb˜^ break -NÁ§S¥¢y"
Broadcom Corporation: ˜[¶OŽÅä¡›Eû§ùpJ
´Ï§PkÚ) SB12xx X 64 MIPS CPU§8¤^åé2
Nõ䝥"SB-12xx O5 u SiByte§„e©"
BSD UNIX: ˎ|^‡u1£Berkeley Software Distribution¤´Ð
$1u DEC VAX .Åþ UNIX öŠXÚC«"BSD ´1˜‡P
k 32 J[;SØ UNIX C«§¤ 5 Sun @öŠX
ÚÄ:"²LéžmاBSD 4.4 ‡±m˜ 萪uÙ£´
TƱY éÈ-å Linux mu¤˜‡ USؤ"§#
† “Ò´°Júi OS X"
BSS: 3?È  C §S¥§^5NBvk²(Щz(²Cþ
;«"éAu8I“蘇«"Дvk<U P BSS “LŸo¿
g"
Œõê C ?ÈXÚ^ “.bss”¶Š© ˜mvkDЊÛCþ
êâ«"
âuÖ±Ï(burst read cycle): MIPS CPU £Ø é@Ϙܩƒ
¤3˜‡âuÖ±ÏlS˜gÖõ‡i£~„o‡i¤5W¿p
„ "
i!(byte): 8 êâ"
i!S(byte order): ^5rNêâ3S¥Uìi!/ŒgS"wþ
Дé²w§´Ä|¤iڌiˆ‡i!žN´4<· "
i!†(byte-swap): ‡=|¤˜‡iˆ‡i!gSöŠ"ù3
é5gØӗàÅìêâ?1Nžÿ‡^"
C ý?nì(C preprocessor): cpp §S§˜„^Š C ?Èì1˜
H"cpp KI©O†ÚŽÑ"§?n5ºÚ±“#”m©k^ý?
378
MIPS âŠL
n-§~X #define!#include Ú #ifdef "¦+Ú C ƒ'駧
´˜‡Ï^÷Šó§Œ±~~^uÙ§Šó"3Ö¥§­‡š C
A^´^ué®?Šó§S?1ý?n"
C++: ˜«?È.Šó§3 ŒÜ© C Š{Ú L§´Jø ˜
@¡•é–*Ð"
p„ (cache): ˜‡Nþ9Ï;ì§ål CPU éC§E›C
lSÖêâSN"31 4 Ù¡ùã MIPS p„ "
p„ §†N(cache, direct-mapped): †Np„ §é
z‡äN;ì ˜§k˜‡øŒ±˜T?SN"XJ˜‡§S
-|ª„¦^TЇ^˜‡p„ øØÓS ˜?ü‡Cþ§†
Np„ AON´C$¶´†Np„ {ü¤±
Œ±$1upž¨ªÇ"N­‡´§†Np„ I‡
قë››ìÚ;ü§ù¦†Np„ ¤¡
p„ g,ÀJ"
=¦3{ü CPU p§†Np„ y3é„ "
p„ §­EI\(cache, duplicate tags): 3p„ ˜—õ?n
쥧o‚››ì7L²~ w CPU p„ —äN`§´ wA
½p„ I\—±uA½o‚¯Ö´ÄÚp„ cêâk
'"ù«–¯¤ép§XJo‚Ú CPU ©ž¦^I\§@o CPU
ò´¤ép§XJ´VàI\ž§@oM‡Úp£¤ép"
!Ž‰{Ï~´éo‚a,p„ &E31°€§
ÚÌp„ ¿1#—‡—?ۘ‡Cz¯‡Ñ´o‚Œ„"
­EI\¿š‡{âUk^¶‡§U4o‚3õꜹe;–
¯ CPU I\§ÒE,U JpXÚÇ"
p„ §Ônό(cache, physical-addressed): æ^£=†
¤Ôn/Œ?1–¯p„ "@Ï MIPS CPU p„ ±9
¤k MIPS L2 p„ Ñ´Xd"
p„ §|ƒé(cache, set-associative): é5g˜‡äN;ì
˜êâkõ‡/Œ±;p„ "~„´ü´|ƒép„
§Ò´`§éu;ìS?¿êâÑkü‡Œ^p„ ø"
ukü‡p„ Ӟ?1|¢§ùXڌ±?nü‡ª„–¯êâ
uӘ‡p„ ¢Úœ¹"
˜‡|ƒép„ I‡'†Np„ °o‚§ $1
v@o¯"@Ï RISC ^†Np„ ±!Ž Üp„ Ú
"¦+°o‚éu¡þp„ ؤ¯K§k @Ï8¤ CPU E,
379
MIPS âŠL
k†Np„ 5Jpž¨ªÇ"y3§˜„–•uæ^|ƒé
¡þp„ Ϗkp·¥Ç"
p„ §if(cache, snooping): 3p„ ¥§fi›, O
£,  CPU ½ö DMA ̛ì¤o‚¹Ä±éé up„
êâÚ^"˜m©§“f”ù‡c^5Œ±Zýp„ §3
p„ ';ìêâ„#œ¹eJøp„ ‡ÄKƠ
ŒUS¥Pêâ¶ù‡cy3^5?Ûéo‚¹Ä?1i
›p„ "
p„ §©m(cache, split): ù˜«p„ §éÚê▯
æ^©mp„ "
p„ §£(cache, write-back): ˜« CPU 3Ù¥\žêâ
3p„ ¥§´£ž¤¿ØxÌêâp„ (D-cache)"T
p„ 1IP“9(dirty)"” Ù§ ˜êâI‡^Tp„ 
1§½öéTp„ 1‰1˜g£öŠž§êââÌ"
p„ §ß(cache§write-through): ˜«zgöŠÑӞ\p
„ £XJ–¯·¥p„ ¤ÚÌêâp„ (D-cache)"Ù`
:´p„ l5ج¹vk\Ìê⧤±Œ±‘¿¿ïp„
1"
Ï~§;ìXÚ£ƒéú¤±Ï3$1ž§ Ìêâ
Œ±;u˜‡ À쥧¤± CPU Ø7–öŠ¤"
‡;ì±Ï¯U á±Ñpu CPU ²þöŠ)Ç„Ý
5öŠ§ßp„ ÒóŠéÐ"3y“XÚ¥é„ "
p„ ­K(cache aliases): 3J[;öŠXÚ¥§\kžŒ±r
ÓêâNØÓ ˜"ùŒUu)3§ü‡?ÖØÓ/Œ˜m
ƒmê⧽ö3A^§SÚS؃mkØÓÝêâþ"
y3Nõ MIPS CPU æ^§S£J[¤/ŒŠp„ ¢Ú—U Ú/
Œ=†¿1m©p„ |¢Ï Œ±!Žžm"´XJØÓ§S/
ŒŒ±–¯Ó˜ê⧷‚ŒU¬-Әêâ?up„ ¥ü‡Ø
Ó ˜—=p„ ­K"XJ·‚m©\ù ˜§Ò¬u)
Ø"
p„ ­KÙ¢Œ±;"MIPS CPU æ^/Œ=†¿›X$ 12
/Œ3=†ž±ØC§ŒUŒp„ ¢Ú^Œ$ 15
"SØ^‡3阇)¤õ‡ØÓ/Œžÿ§‡%y©
§S/Œ1 12–15 ƒÓÒ1 "

380
MIPS âŠL
p„ ˜—5(cache coherency): p„ o´°(‰Ñ\§S½
öXÚ٧ܩ;?p„ /SfXÚSNûÐG"
J¦˜—5æ^ NõE,EâÚM‡‚€¶^u“ÑÖì”Pª
MIPS CPU('X R4000SC Ú R10000)3p„ ¥æ^ AÏś5
ˆù˜8I"´ù«Eâ3Œ.ÑÖìOŽÅƒ ­.p^„Ø
õ"
p„ ˜W(cache flush): ˜‡k ÜÂ⊶Ð;¦^"l5
Ñؘ٧.´£!Š¢„´ö(Ü"
p„ ·¥(cache hit): =\3p„ ¥é¿ é ¤‡
ÀÜ"
p„ ¢Ú(cache index): p„ ¢Ú^5lz|ÀJp„ 
˜/ŒÜ©"
p„ Š¢(cache invalidation): IP,˜p„ 1êâØ2¦
^"p„ 1›› ¥ok,«k ^uù‡8"ùé MIPS
CPU Щz´7،˜Ü©"

p„ 1Œ(cache line size): z‡p„ øŒ±NB˜‡½õ‡


iêâ§^ü‡/ŒI\I£˜‡ê⬡˜‡p„ 1"Œ
1!Ž I\¤^˜mŒ±Jp­Wǧ´Œ1Ϗ\1 õØ
I‡êâ L¤ ˜m"
Zp„ 1°–•u‘Xlm CPU ålÚŒ™·¥“d
O\"MIPS I CPU o´k˜‡ip„ 1§´ 5 CPU –
•uæ^o½l‡i1"
p„ ™·¥(cache miss): \3p„ ¥é´vké‡
éÀÜœ¹"
p„ ™·¥“d(cache miss penalty): ™·¥p„ ž CPU
Êî¤s¤žm§ûuXÚ;ìAžm"
p„ ¿Û(cache profiling): ÿþ˜‡äN§S$1ž¤)¤p
„ 6þ§8I3u­#|„;쥧S±~p„ ™·¥
gê"Ø 4§SÚ§Sã §„ؘÙù«‰{Œ15kõŒ"
p„ ­W(cache refill): 3˜gp„ ™·¥ ^5¼˜‡p
„ 1êâ;ìÖöŠ"ù´1˜gÖ?p„ §CPU , ­
#m©‰1§ùgÒ·¥ p„ "
p„ |(cache set): |ƒép„ ˜‡¬"
381
MIPS âŠL
p„ [ì(cache simulator): ^up„ ¿Û^‡óä"
p„ I\(cache tag): p„ 1¥;^5£OTêâ3Ì
¥ ˜&E"
p„ £(cache write-back): r˜‡p„ 1SNE›£
̃A;¬L§"Ï~´^‡‰1§Ïp„ 1k
‡“9(dirtry)” I“§^5P4glþglÌ¥ѱ5´Ä
L"
Œp„ (cacheable): ^u˜‡/Œ«½ö;ì=†XÚ½Â
˜‡"
p„ †ØMì(CacheErr register): R4000 9Ù “ CPU ›
›£?nì 0¤M짿÷ ^±©ÛÚ?Ep„ Ûó/ECC
†Ø&E"
p„ öŠ(cacheop): MIPS NX(Jø ˜‡õ^å cache 
-^5ЩzÚöŠp„ SN"
N^ö(callee): 3˜g¼êN^¥N^¼ê"
N^ö(caller): 3˜g¼êN^¥§ÑyN^-±9N^(å ››
ˆ£¼ê"
ÏMì(Cause Register): CPU ››Mì§3g€ wŠ\´@
«a.g€"Cause ‰Ñ=‡ Ü¥ä&Ò3¹Ä"
Cavium Networks: Cavium ä;^OŽÅ¡§2006 cuÙ§
‰ Octeon"z‡¡¹kõ‡ MIPS64 CPU"
þ.(ceiling): 2:êê=†§\ØuT2:ê
ê"d MIPS - ceil ¢y"
iÎ(char): ^5NBiÎ?èê3 C Šó¥¶i"3 MIPS
CPU £y3¤k¢S CPU¤p§ù´˜‡i!"

(CISC): ^5š RISC NX(Äi1 "3Ö¥§·‚–


DEC VAX!Motorola 680x0!Intel x86(32 ‡)ƒaNX("¤k
ù -8Ñ´3 RISC uyƒcu²§¤kÑéJ‰1' RISC
CPU ¯"

ž¨±Ï(clock cycle): CPU ž¨&Ò±Ï"éu RISC CPU§ù´ë


Y6Y‚ã$1„Ç"

382
MIPS âŠL
pÖé¡7ázԌN(CMOS): ^5›E¤k¢S MIPS CPU 
¬N+Eâ"CMOS ¡'Ù§Eâ—Ýpõѧ¤±äk+k`³
8¤"3 CPU p§U òéõ>´˜?˜mUåy²´'
5Uσ§Ï ܯ„ CPU y3Ñ´ CMOS"
˜—5(coherency): „p„ ˜—5(cache coherency)"
'Mì(Compare reigister): ¢y CPU þ½žì Jø
CPU ››Mì"k éP MIPS CPU ¿ØJøTM짴
\N2Ø¬-ù« CPU "
˜Mì(Config register): 3 MIPS32/64 CPU þIOz!^5
˜Ä CPU 1 CPU ››Mì"
››(console): ú@•^ruxžEÚÂ^rÑ\ I/O Ï
"
~þ(const): C Šó(²á5§L«TêâÖ"~~ڍ-‹˜
å"
þe©Mì(Context register): 3‘k TLB  CPU þk CPU
››Mì"Jø ˜«^,«LSü3XÚþ?n TLB ™·¥¯
„{"
þe©ƒ†(context switch): õ?ÖöŠXÚ¥l˜‡?Ö,˜‡?
Ö^‡‚¸C†óŠ"
?nì(coprocessor): CPU ˜Ü©§½ö, O;—ÍÜÅì
܇§‰1˜ AÏ3-?è-8"ù´˜‡ MIPS NX(
Vg§¤õ©l ŒÀ!½ö´äN¢yƒ'-8Ü©Ï
~ Ì6-8Cz"ù«‰{ƒ¤õ§´Ù·¶— NõØ
)"
?nì^‡(coprocessor condition): MIPS NX(¥z‡?n
ìf8Aύ-Ñk˜‡üÕ L«ÚÌê CPU Ï&G§^
bcxt/bcxf -ÿÁTG"„1 3 Ù"

?nì^‡©|(coprocessor conditional branches): MIPS NX(


?n쌱Jø˜‡½õ‡^‡ §¤k?nìÑ^ bclt label
Šâ^‡¿Â?1©|"
?nì 0 (coprocessor 0): †;ìN!É~?naqA›
›-ƒ' CPU õU£½Âƒ ¤ "

383
MIPS âŠL
CPU Ø(core CPU): Š ASIC ˜‡Ü‡O‡?nì§^5
¤¤¢“¡þXÚ"” MIPS CPU 5õ^ŠØ"
corExtend ASE: MIPS úi, CPU ØþŒÀ-8*Ч¦
¡OöO\½¦^#!;^OŽ-ƒéN´:"
OêMì(Count register): ëY$1½žìMì§3 R4000 ƒa
 CPU Ú, @Ï CPU þk"
cpp: C Šóý?n§S"

CPU core: ë„ core CPU"

JúfLˆª CSE(common subexpression elimination): ŒU´


`z?È쥁­‡ü‡`zÚ½§‡¦?Èì­E˜‡®²èÓ
êâ‰ÑOŽU uÿÑ5", Œ±Ä1˜g$Ž(J?
1E^"ù:cÙ­‡§ÏÙ§?ÈìC†ŒU—­E(J§^
CSE ?1n‡'3Ù§`z¥ïaqÜ6‡{üõ"

±Ï(cycle): ž¨±Ï"
êâp„ (D-cache): êâp„ £MIPS CPU o´PküՍ
-Úêâp„ ¤"
(D-TLB): k MIPS ?nì^é©m/Œ=†p„ lÌ
TLB W¿§±;Óž?1-Úêâ/Œ=†] Àâ"Œõê
MIPS CPU Pk-à I-TLB§Nõ¯ CPU k D-TLB"ÙöŠ
é^‡´ØŒ„§Ø ó¬klÌ TLB žs¤ ž¨±
Ï"
êâ6(data dependencies): 3,‡Mì¥)¤˜‡Š-ڑ
‡^ù‡Š-ƒm'X"
êâÏ´†ì(data path swapper): „i!†ì(byte-swapper)"
êâ/-p„ ˜—5(data/instruction cache coherency): ±
I-cache Ú D-cache ˜—5óŠ"MIPS CPU ؉ù‘óŠ¶\\½
?U-6žÿŠ¢ I-cache ˜é­‡"ë„p„ ˜—5(cache
coherency)"

NÁª(debug mode): ˜«AÏ CPU G§š~aquÉ~ª§


† Debug(DM) Mì ƒéX"u)^´É~ž?\NÁª§NÁ
ì§S$1˜^ deret žòÑ"ë„1 12.1.4 !"

384
MIPS âŠL
NÁ&(debug probe): ˜‡ëmu^‡ÌÅÚ CPU  EJTAG
üÝf§4\U NÁ8IXÚþ^‡"ùNÁì؇¦8
IXÚþïk EJTAG ü9ƒ ] §¤±Œ^3ŒõêàN
i\ª"
NÁì(debugger): ››ÚÎ3$1§S^‡óä"
(DEC): Digital Equipment Corporation§‡ 1980 c“¤õ.
śEû"Ù PDP-11 Ú VAX OŽÅ‰ UNIX ±(a"l 1989 c §
Q²v MIPS CPU§žmá´KØ"
(DECstation): DEC Ùu 1989  1993 cƒmíÑæ^ MIPS NX
(óŠÕå¶i"
ò´©|(delayed braches): „ branch delay slot "
ò´\1(delayed loads): „ laod delay slot "
UIN(demand paging): ˜‡§Sì?\1L§"6u˜‡ö
ŠXÚÚ ¢yJ[;ìM‡—öŠXÚÓ¼é§Sÿ™\1?
SÜ©Ú^§Ö?ƒAê⿊/ŒN4§Sw´TÜ©
u(/§, ˆ£§S§­#‰1”}Ú^"ù¡©§Ï
;ì=†üÚ\1±¡½Œ¬ü "
š5‚z(denormalized): ˜‡2:ꊱ–Ã{±Ï~Ï~
°ÝL«ž¡´š5‚z"IEEE 754 ½ÂªéJ4M‡†?n
š5‚zL«§¤± MIPS CPU ^5?n½öOŽš5‚êžÿ
o´g€"
Ú^(dereferencing): ˜‡s ¶c§^5^X5¼¤
•;ìêâöŠ"
ä(diagnostics): “äÿÁ”{¡§^5@ ^‡§Ñ5Ø´
¤äNóŠ§ ´^5Úu!uÿÚäOŽÅ9NáM‡¯K"
pÝ8¤¡¥\\ NõA5ä^‡JøB"
†N(direct mapped): „p„ §†N(cache, direct mapped)"
®?·-(directive): ^5®?Šó§S¥Ø)¤Åì-´wŠ
®?쇉ŸoÜ©˜‡âŠ—~X .globl"‰–-£–ö
Š¤"
9(dirty): 3J[;XÚ¥§^5£ã˜‡;ìglþgl?
;ìѽö£ƒ ®²?UG"9ØU¿ï"
385
MIPS âŠL
‡®?ì(disassembler): r;ì¥?›-S=†¤<Œ±
Ö®?ŠóÏPÎL/ª§S"
£(displacement): /ŒOŽ¥^\,‡“Č”þŠ"MIPS
~„œ/Ò´§Azg\1/;/ŒÑ^˜‡Mì¥Č\þ
˜‡?è?- 16 kÎÒ £"
†;얯 DMA(direct memory access): ˜‡ Ü3v
k CPU Zýe†Ú;ì?1êâDÑ"
(double): C Ú®?Šó¥éu˜‡V°Ý£64 ¤2:궡"

Vi(doubleword): MIPS NX(£ã¥^u£Ø´^u2:¤64


êâ¶i"
e1(download): lÌŕ8IÅDÑêâĊ£XJk¦¯§ÌŘ
„^rë@Åì¤"
(DRAM): ^5ØO(ŒNþ;ìXÚ£Ï~´^ DRAM ܇
ïå5¤"kž^5?Ø^ DRAM E;ì;.5Ÿ"
(dseg, drseg, dmseg): J[;«£Ú kseg2 «­U¤§k3NÁ
ªâŒ±–¯§^5NÁ“èN EJTAG NÁü]
êi&Ò?nì DSP(digital signal processor): ˜«AϺ‚‡?
n짤O½ u?n6êâ§z‡êâ“L,«ªlê=†ì5
Š"DSP ;5u, 61[Ž{„ݵrN¦\$Ž5
U"†Ï^?nìƒ'§3$Ž°Ý!^p?Šó?§B5!±
9|±ÄöŠXÚõUA5¡Ñkj""´ DSP ½Â¿
ؖ RISC @oî‚"
(DSP ASE): MIPS32/64 NX(˜‡*ЧO\ Œþ-Ï?
nõxNA^¶Nõ#öŠÑ´ SIMD!Ú.±9,«ƒ¦\\"
­EI\(duplicate tags): „ cache, duplicate tags "
Vi(dword): MIPS ®?Šó‰ 64 êêⶡ§ double-
word"

Äó(dynamic linking): ^5A^§S3$1žÄÏéڔ½


f§S¥L§¶g§‡^¡ DLL"Œõê Linux/MIPS XÚÄu^
r˜mA^§SÄó"
ÄCþ(dynamic variables): ^5¶Âþ½¢Sþ3ÒþC
þ£aqu C Šó¼êSܽÂCþ¤¶c§ù´˜«Lž{"
386
MIPS âŠL
ņè ECC(error-correction code): Úêâ;3˜å §Ø
=Œ±^5ä†Ø #N^5ņأb½†ØKê ¤"k
MIPS CPU æ^ép„ ÚSo‚þ£N„)S§ØL@´
XÚOžû½¤z‡ 64 Viêâ\þ 8 ‡ ņè ECC"
4ÍÜÜ6ECL(emitter-coupled logic): û½˜‡&ғL˜„´
"˜«>íIO"ECL '~„IO TTL Dфݯ!|D(Uå
r§´“d´õÑp"y3ÄþLž "ù‡¶i£ãÐ^uù«
¡¬N+¢y"
ܥ䛛ì EIC(external interrupt controller): MIPS32/64 Š
˜‡À‘§• MIPS CPU Jø˜‡ØÓ¥ä&-{"§Jø õˆ 63
‡†ØÓ¥ä£éui\ªXÚék^§Ï²~kŒþ¥ä ¤§
´“d´‡¦XÚO< ^M‡Ù‚¢y¥ä`k?"ë„ IPL§ä
N[!„1 5.8.5 !"
(EJTAG): MIPS32/64 CPU ØSNÁü5‰§^‡Œ^§´‘k
ÏL JTAG £ÿÁ¤Ú ëNÁ&^?Œ"„1 12.1 !"
Œ‰1ó‚ª ELF(executable and linking format):  UNIX I
Oz›½˜‡8I“肪§´ MIPS ABI r›5‰"
emacs: ©?6ìpa¬ §ý§S 7،óä§emcs
(h<)zg\Ue˜‡ ž$1˜‡\ÀJ Lisp §S"AŒ±?
¿½›§Ø+‰ŸoóŠ§\ь±lêؘ±c‰LaqóŠ<@
p kdŠÏ"ÖÒ´^§"
i\ª(embedded): £ãŠ˜‡£Ì‡¤Ø‰OŽÅÔNSܘ
Ü©OŽÅXÚ"Œ±´lÀªiZÅÀ欛›ì?ÛÀÜ"
•ýì(emulator): „ in-circuit emulator; software instruction emula-
tors "

—à(endianness): ˜Å촌—à„´—à"„1 10 Ù"


endif: £#endif¤cpp pL«^‡¹“èã(—"ë„ #ifdef"

EntryHi/EntryLo Mì(EntryHi/EntryLo register): 3‘k TLB


 CPU ¥¢y CPU ››Mì"^5Ú TLB Cêâ"
É~§SOêì EPC(exception program counter): wŠ\É~ƒ
CPU lŸo/­#m©‰1 CPU ››Mì"

(—Ü©(epilogue): „¼ê(—Ü©(function epilogue)"


387
MIPS âŠL
ŒÞ،?§Ö;ì EPROM (erasable programmable read-only
memory): T~^uJøXÚڐ֓è¶ùpšª^
5@ Ö“è ˜"
errno: Œõê C ¼ê¥^5w I/O †ØÛCþ¶i"

ErrorEPC Mì(ErrorEPC register): R4x00 Ú 5 CPU uÿp


„ †Ø§ U 3 CPU ?u, ' £´~„¤É~?n§
S‰1Œ´žUuÿ†Ø§p„ u†XÚJø gCÕáM
ì5P4ˆ£/Œ"„1 4.9.3 !"
É~a.è(ExcCode): Cause M쥝¹L«fu)É~a.
 "
É~(exception): 3 MIPS NX(¥§˜‡É~Œ±´?Û—››
=ü‡g€\:ƒ˜¥ä½g€"
É~§IEEE (exception, IEEE): ë„ IEEE 2:É~£floating-point
(IEEE) É~¤"Ø3´§ù´˜«ØÓu MIPS É~ÄÔ"
É~•þ§É~\:(exception vector, exception entry point): CPU
M‡3É~ƒ m©‰1£J[¤;ì/Œ"“É~•þ”Ù¢^cØ
§5 uŒ±^^‡ÏL73SL5­#½Â\:NX("
3 MIPS CPU p§É~?n§S\:UÏL?U EBase Mì¥
ü‡ÄŒ—N˜——CÄ"
É~ɳö(exception victim): 3É~ž§É³ö´duu)É~
£„¤™U$11˜^-"éudu CPU g¹Ä—É~§É
³-Ò´ÚuÉ~-"Ï~´É~ƒ ››ˆ£/:¶´Ï
©|ò´J¿šo´Xd"
‡~Š(exceptional value): ‡Ñ~L«‰Œ2:Š£Ã¡Œ!&Ò
šê NaN ¤"XJ^‡#N§?ÛOŽ(Jù«Šžÿь±Ú
u˜‡ IEEE 754 É~"
Œ‰1©‡(executable): £ã˜‡Œ±†$18I“è"
ê(exponent): 2:ê˜Ü©§„1 7 Ù"
*Ð2:ê(extended floating point): MIPS M‡¿ØJø§Ï~¦
^‡L 64 £Ï~ 80 ¤˜m2:ꂪ"
Ü(extern): C Šó¥3, ¬¥½ÂCþêâá5"
FastMath: ë„ Intrinsity c^"

388
MIPS âŠL
†Ø§Ñ†(fault, faulting): „¡†(page fault)"
2:ü^‡èFCC(floating-point unit condition code): MIPS I 
MIPS III k˜‡§ 5 ISA kl‡"

FCSR Mì(FCSR register): 2:››/GM진1 7 Ù"

k?kÑ FIFO (first-in, first-out): žNBêâè§Ù¥z˜‘


±Ú?\èƒÓ^SÑ5"
?(fixup): 3?›“襧óì/½ ì ¦Ú§S $
1 ˜ƒš N-Úêâ«/Œ¹Ä"
I“(flag): ùp£OŽÅÖ¥~^¤^5››Mì¥ü‡ ¤
"
2: ˜(floating-point bias): ˜‡\ IEEE ‚ª2:êêÜ
© £þ§¦é¤kÜ{Šêܩя"
2:^‡è/I“(floating-point condition code/flag): d2:'
-˜ü‡ §D£Ì CPU ^ bclt Ú bclf -ÿÁ"
2:•ýg€(floating-point emulation trap):  CPU ØU¢y2:£
?nì 1¤öŠžu)g€"Œ±^‡g€?n§S5[
FPU 1ˆ£››§ùA^§S^‡ØI‡´ÄSC FPU 2
:M‡"^‡~§ŒU‡ú 50–300 "
2:É~(floating-point exception): 2:OŽ IEEE 754 IOÄ
 OŽ(JŒU´“‡~Š”—˜‡¡ˆ«ˆ^rŒUØp,(
Jc"TIO‡¦¢y CPU #NÓ¼z˜«a.É~—ùÒk
·Ï§Ï MIPS Ó¼˜„5¯‡ś‰É~"
2:ü FPU(floating-point unit): MIPS CPU ‰12:êÆ$ŽÜ
©¶¡"{¤þQ²´˜¬üÕ¡"
foo: U-ýöÃ^©‡¶"

FORTRAN: @ωÆÚêŠOŽ¤^OŽÅŠó§3ù +Ùé


ÐŒ£‡5‘L ˆ«-<? "€"
FP: 2:"

fp vMì£fp(frame pointer) register¤: CPU Ï^Mì£$30¤§


kž^5L«˜‡Òv£stack frame¤Č"
fpcond: 2:^‡ £‰?nì 1 ^‡ ¤,˜‡¶i"

389
MIPS âŠL
FPU: 2:ü"
ê§êÜ©(fraction, fractional part): 2:Š˜Ü©£‰—
ê(mantissa)¤"„1 7 Ù"
v§vŒ(frame, framesize): „Òv(stack frame)"
gd^‡Ä7¬(Free Software Foundation): gd^‡ÕÅ"
ö"FSF ´˜‡±k GNU ^‡‡£tѤ|„"
ƒé(fully associative): „ƒé;(associative store)"
¼ê(function): C Šóéf§S{§֌õêžÿ^ù‡¶¡"
¼ê(—Ü©(function epilogue): 3®?Šó¥§3¼ê—Ü„
½-Ú·-S§†››ˆ£N^ök'"
¼êSé(function inlining): p??ÈìJø˜«`z{§Ù¥¼
êN^^N^¼ê‡¼êN܍-S?1O†"3NõN
X(¥§ùUŒJ£éué¼ê¤§ÏžØ ¼êN^
m"3 MIPS NX(¥¼êN^mŒ±ѧ´SékžÿE
,´kdŠ§Ï§#N`zìŠâ¼êþe©‚¸?1óŠ"
¼êÄÜ(function prologue): ®?Šó¥§ u¼êmÞÜ©½
-Ú·-§MìÚïáÒv"
gcc: GNU C ?ÈìÏ~¶i"

gdb: GNU NÁì§GNU C Š‘óä"

Û(global): §S éu¶iڊ3‡§S‰ŒSŒ±–¯êâ
‘Pª{"kžØî‚í2?ÛPkgC;˜mk¶êâ
‘—ù‡({´·(static)"
ۍ(global pointer): MIPS gp Mì§3, MIPS §S¥^Š
é½Â u½§S/Œ static ½ extern  C êâ‘Jøp–¯"
globl: ®?Šóél¬ ܌„ê⽓è\:á5(²"

GNU: gd^‡Ä7¬‘8¶¡§T‘8Jø˜‡aqu UNIX ö


ŠXÚ¤k¤©£S،UØ ¤˜‡Œ±gduÙ‡"
GNU C ?Èì(GNU C Compiler): 3Õá§S Úgd^‡Ä7
¬° +E Richard Stallman Ú­.ˆ/“öš 8NŠe
Ñgd^‡¬"ؚ\3^ SGI óŠÕ§ÄK GNU C ´ MIPS þ
Z?Èì"
390
MIPS âŠL
Û £þLGOT(global offset table): MIPS/Linux ^ÄóÅ
›7،˜Ü©§Ð´3 MIPS/ABI ¶Âemu"„ 16.2 !"
gp Mì(gp register): CPU Mì $28§~^‰§Sêâ"Œ
±óTŠ ±32K ‰ŒS§Sê⌱^ü‡--\1"¿
š¤kóäó!¤k$1ž‚¸|±ù˜:"
Œi(halfword): MIPS NX(é 16 êâa.¡"
‘x(hazard): ‰6Y‚‘x(pipeline hazard)"‘xu)3-S
،‚/§Ï)ö-¯¢þŒU„vk–\§SS¥
¡ž¤ö-þ£~~´du)öJ36Y‚ Ïâ)¤"
 CPU NX(¿Øj±‡¦M‡Jß²žâ¬k‘xµkŒU½Â
˜‡vk‘xNX(§±¢yE,ÝÚ£ŒU¤5U›”“d"
3P MIPS CPU ¥§k˜‡‘x3^rA?§SŒ„µèã3;
\1-ƒ -¥¦^êâÒ¬”}"y“ MIPS CPU 3^rA
?“è¥vk‘x"
=¦# CPU k† CPU ››ƒ'‘x§ù 31 3.4 !?ØL"
‘x“o(hazard barrier): ˜^˜u)öڞ¤öƒm-§^5
yž¤öw)öJÜ)"
æ(heap): 3$1ž©§Sêâ˜m"
(Henrich, Joe): 5 MIPS ^rÃþ6-<ƒ¹Šö§A¤k(
 MIPS ISA Ñ´lùÖ ) 5"
(Hennessy, John): MIPS ° +EÚCÄö§Hennessy Ç+
Stanford ŒÆ@ MIPS ïđ8"

(hi, lo): MIPS ê¦{ü(JMì"Ü3˜åŠê¦{\\


öŠ\\ì"
·¥(hit): „p„ ·¥(cache hit)"
(I-cache): -p„ £MIPS CPU o´k©m-Úêâp„
¤" CPU ֍-ž§é I-cache"
(ICE): „ in-circuit emulator c^"

(ICU): ¥ä››ü

˜(idempotent): ˜‡êƶc§‰1ügډ1˜gäkƒÓ
JöŠ£Ï ‰1ÊgÚ 99 g¤"‰\j›´‡˜öŠ§
´\0ÒØ´"
391
MIPS âŠL
6Y‚ CPU u)É~ž¿‘ ˆ£¥ä?֞§éJy˜
ƒÑTА‰1 ˜g¶XJU 4, öŠ˜§XÚÒجÉJb
­EöŠK"'X§MIPS ¤k©|-Ñ´˜"
IDT: Integrated Device Technology úi§1980 ±9 1990 c“ MIPS
CPU i\ªA^k1ö"IDT „3UYUF¤§´ CPU Ø2´Ù
̇’Ö "
(IEEE): {I>f>ì󧓬(Institute of Electrical and Electronics
Engineers) Äi1 "ù‡1’ìN›½ NõOŽ+IO"§
óŠ~~'Ù§IOzō\¢^!ÜnÚkï5"
IEEE 754 2:IO (IEEE 754 floating point standard): ˜‡'u
ŽâêŠL«ó’IO"TIOr›5½ ˜|ÄŽâ¼ê°(1
§muŒ£‡ꊎ{Jø ˜‡­½Ä:"
(ifdef, ifndef:): #ifdef Ú #endif ò C Šó¥^‡?ȓè)å5"
TA5¢Sþd C ý?n줧¤±Œ^uÙ§Šó"
á=ê(immediate): 3-8£ã¥§á=ꊍi\“è¥~
ê"3®?Šó¥§?¿~êŠ"
¢y (implementation): ^Š“NX(” ‡¡"3Ö¥§Œõêž
ÿ·‚ù3˜‡äN CPU N¤,‡¯œ"
3‚•ýì(in-circuit emulator): ˜m©§^U °([ CPU 1
¿Jø˜ ª››‰1Úu CPU ¬“ CPU "‡?n
ì ICE ü،;/‡Äu,‡‡?nì£~~´p?¤¡‡
"
~~kŒUØ^ ICE ?1mu—ICE B ¯Kõ"
´y“§ù‡ckž^5NÁ&Þ(debug probe)£„þ¤§^ØÓ
{Jø ƒqõU"
¢Ú§p„ (index, cache): „ cache index "
¢ÚMì(index register): ^5½Â=‡ TLB êâ‘SNò^5
l EntryHi/EntryLo ƒmÖDx"
Indy: d SGI 3 1980 c“æ^ R4000!R4600 Ú R5000 64 MIPS CPU
›E¤ƒé$óŠÕ"
š°((inexact): £ã›”°Ý2:OŽ"5¿ù3ŒõêF~O
Ž¥u)éõ¶'X ÒÃ{°(L«"IEEE 754 5½‡¦ MIPS CPU
1

Œ±éš°((Jg€§´vk<‹mù«À‘"
3

392
MIPS âŠL
áŒ(infinity): ˜‡2:êŠL«Œ£½¤v{L«Š"IEEE
754 ½Â KáŒ$Ž1"

Sé(inline, inlined, inlining): „¼êSé(function inlining)"


-NÝ(instruction scheduling): |^ CPU 6Y‚c £Ä-
±¼Œ5UL§"3{ü6Y‚z MIPS CPU þ§ùÏ~ҍ
¿©|^ò´ø"ùd?Èì5¤§kžd®?ì5‰"
-8NX( ISA(Instruction Set Architecture): CPU õU£
㧰(½ÂN?n?¿Ü{-6£´Ø7½ÂN¢
y¤"MIPS32/64 ´Öù̇ ISA"
®?-ܤ(instruction synthesis by assembly): MIPS -8ŽÑ
Nõk^ÚÙGöŠ£~X\1‡Ñ ±32KB ‰Œƒ ~ê
-¤"MIPS NX(Œõê®?ìÉ^A^Åì-S¢y
-£kž‰÷-¤"
(int): C Šóêêâa.¶i"TŠó¿vk½Â^õ 5¢y˜
‡ int"ù‡gd݌±4?ÈìÀJ38IÅìþǁp¢y"
p£(interlock): ˜^-ò´,‡^‡OÐâ‰1M‡A
5"3 MIPS NX(¥kêp£"
¥ä(interrupt): ˜‡£e™¶-¤Œ±—É~ Ü&Ò"
¥ä¶- (interrupt mask): CPU GMì¥z‡¥ä˜ ¶-§
(½3‰½žm#N=‡¥äÑ\)É~"
¥ä`k?(interrupt priority): „ IPL"
Œ¥ä(interruptible): ˜„^5˜ã¥mŒ±N=¥ä§S£§
S Ï #Nu)¥ä¤"
Intrinsity Semiconductor: Instrinsity uÙ!›EÚü« FastMath
MIPS32 CPU£„k˜‡N\ ?nì¤Ìªpˆ 2 GHz —¦Ù¤
8cŽ¯ MIPS CPU", §TúiŒU;5u7ŒNO
Eâ Ø´ MIPS CPU"
Š¢(invalidation): „ cache invalidation "
¥ä`k? IPL (interrupt priority level): 3NõNX(þ§¥ä
Ñ\äkSï`k?¶3Ó½öp`k?¥ä?n§S‰1Ïm
¥äج)"{¤þ§MIPS CPU vk‰ù §r`k?3‰ ^‡?
n"
393
MIPS âŠL
´æ^ ŒÀ EIC ¥äXÚ MIPS32 CPU 3M‡¥6Ú¢y¥
ä`k?"„ 5.8.5 !"
Irix: SGI óŠÕ/ÑÖìþöŠXÚ£Äu Unix System V ƒþ¤"

ISA: -8NX("

¥äÑÖ~§ ISR(interrupt service routine): ¥äÉ~N^^‡


, ˜‡¶i"
u§- (issue, instruction): ùOŽÅ¢yžÿ§u®
²^ , CPU ] m©‰†,^-ƒ'öŠžm:"
I-TLB: ˜‡‡l TLB E›&EM‡L§^5=†-/Œ§ù
Ø^Ú=†êâ/ŒM‡¿"3@Ï MIPS CPU p‰“micro-
TLB” ½“uTLB"” é^‡´ØŒ„§Øš\gCéžmOê¬5¿
‡–¯Ì TLB ž‰1¬k˜‡ž¨±ÏÊî"
JPEG: ˜‡ã”êâØ IO"

JTAG:  ¢yÿÁõU ë>f5‚IO§ŒÑȏ“&


‚”"JTAG &ÒO¥¤k¹Ä‡¤Úsó§#NÜÀÜ^ü
‡–¯:"¢Sœ¹l5¿šXd§ÏüõU¡Ï~¿Ø|
± JTAG¶§´>´†¬ÿÁ7،˜Ü©"
†Ö'k'´§JTAG &ÒJø˜«ë¡þ EJTAG üNÁ
&Þ(debug probe)Œ1ª"
=£ó-(jump and link instruction): MIPS -8é¼êN^
¶¡§òˆ£/Œ£ó¤˜\ ra Mì"
k0 Ú k1 Mì(k0 and k1 registere): ü‡½g€?n§S3
Ï^Mì"éJO˜‡Ø^Mìg€?n§S"
SØ(kernel): Œ±üÕ?ÈöŠXÚü§¹?ÖNÝõU"
k öŠXÚ£– Linux¤´¬§k˜‡¤NõõUŒSضk
´¬z§k˜‡SرŒ\þ 9Ï?Ö"
Ø%A?(kernel privilege): éuo CPU§Ù¥#N‰1?Û
öŠG"Ï~éÄ ?uTG¶3XÚ½{üöŠXÚ¥§˜
†?uTG"
Kernighan, Brian: ú@KIé C Šó?1XÚz5 C §SO
Ãþ£C Programming Handbook¤6˜ÖŠöƒ˜£,˜‡´ Denis
Ritchie¤"?Û§S ÑØATÖk' C ŠóÙ§Ö "

394
MIPS âŠL
,n(kludge): ó§“鯄ž?´?Ö)û{@¡"
kseg0, kseg1: ™N/Œ˜m£Ù¢Œ±`´NÔn/Œ$
512 MB ˜m¤"kseg0 ^u¦^p„ Ú^ kseg1 K^u؉p„
Ú^"Õá§S§½ö¦^{üöŠXÚ§SéŒU‡$1
3 kseg0/kseg1 «"
KSU, KU: GMì£1 3.3 !¤¥Ø%/^rA?"

kuseg: MIPS §S/Œ˜m$ŒÜ©§±^rA?$1§SŒ±


–¯T«§¿ ¤±/ŒÑ²L£CPU C TLB¤=†"
L1!L2!L3 p„ (L1, L2, L3, cache): ˜?!?!n?p„ 
O¶"
¢ (latency): du, ü½Oü—ò´";ìÖ¢
´;ìGêâ¤sžm§Ï~´'‘°­‡£N´À¤
ëê"
“¼ê(leaf function): g؝¹O¼êN^¼ê"ù«¼êŒ±
†ˆ£ ra Mì§;.œ¹eØ^Ҙm"
>²¯a(level sensitive): &Ò£cÙ´¥ä&Ò¤á5"MIPS ¥ä
Ñ\´>²¯a¶?۞m˜ -¹¿ ™¶-Ò¬—¥ä"
¥(library): „8I“è¥(object code library)"
1°(line size): „p„ 1°(cache line size)"
óì!ó-\1ì(linker, link-loader): é©m?È8I“è¬
뤘¬¿é ÜÚ^?1)Û§S"
Linux: ù´“GNU/Linux”öŠXÚSض¡"„1 13 Ù"

—à(little-endian): ˜«òõi!ê$kÜ©;3$i
!/ŒNX(¶„ 10.2 !"
ll, ë£\1(ll, load-linked): MIPS32/64 ë£\1!^‡;-é
õ?nìÚü?nìXÚ§ÑUJø˜«kïföŠÚÙ§Ä
öŠXڛ›ük{"„1 8.5.5 !"
LLAddr Mì(LLAddr register): R4000 Ú 5 CPU  CPU ›
›£?nì 0¤Mì§3ä^‡ƒ Ävk^"TMìþ
˜gë£\1(ll)-/Œ"

395
MIPS âŠL
! Mì(lo, hi register): ê¦Øü;^ÑÑMì"ù
lo hi
Mì´p£—ÁãlÙ¥•Ï^MìDÑêâöŠ¬˜†{l
¦ØöŠ(å"
\1ò´ø (load delay slot): 3Ð1˜‡û’z MIPS CPU ¥§
\1ò´øØ=´‡m§ ´M55½µM‡é\1ŠØ?1p£§
d^‡KIy3;‹-¥Ø‡¦^\1Š"
;‹\1ƒ - ˜¡\1ò´ø§a'u©|ò´ø£, ö
˜†´NX(˜Ü©¤"
?Èì!®?콧S Œ±£Ä“è¦þ|^\1ò´ø§3Pª
CPU þ§kžU3@p˜˜^˜öŠ"

\1/;NX((load/store architecture): ^5£ã– MIPS ùa


NX(§;ìêâ–¯U²(ÏL\1Ú;-?1"NõO
NX(½Â Û¹–¯;ì-£'XæÒöŠ§é;ìCþ
$Ž¤"
\1¦^m§\1ò´(load-to-use penalty, load delay): 3Œõ
ê MIPS CPU ¥§\1êâJø،U@U 4;Ù -v
kò´Òá=¦^£=¦´p„ ·¥œ¹e§Áã;XҖ¯\
1ê⏖k˜‡-Êî¤"
u;XÒ¦^\1Š —ò´ CPU ±Ïꡏ\1-¦^ò´"
¬m6D`{´§\1-¦^ò´˜‡±ÏÃúŒä§ü‡æ†Øä!n
‡ØŒÍ†"
\1ì(loader):  )¤Œ‰1©‡ é8I“è¬?1?n¿‰
-Úê⩧S/Œ§S"
ÛÜCþ(local variable): 3c?È/®?¬S܌±–¯k
¶iêâ‘"
Ú^ÛÜ5(locality of reference): §SŒÜ©;얯8¥
u˜Ü©;ì ˜£–áÏSXd¤–•"ù˜:´p„ 
kÏ"
Ü6©Û¤(logic analyzer): Ӟi›Nõ&ÒÜ6>²£= 0 ½ 1¤
ÿÁ"~^5‡?n얯L/ŒL"
(long): C  °Ýê¶éuoN 32 MIPS CPU §S§Ú int
˜я 32 "éu 64 MIPS §S§ŒU 64 §´Ï~ڍ
ݘ"
396
MIPS âŠL
̂Ðm(loop unrolling): p??Èìæ^˜«`zª"§S¥
̂?ȤU 3Ø©|“è Ü¢yÐAÚ̂“è"ù3du
6Y‚ڍ-ý¦©|¤ƒép¢y£MIPS éXd¤þ
AOk`³"=¦3 MIPS NX(þ§Ì‚Ðmk`zJ"ÏLò
ØÓ̂ڽ“è·Ü§ÒkU?-NÝŬ"
C¦^ LRU(least recently used): ‘op„ Ò´£Â
C¦^p„ ˜mž^`O†Ž{"éuŒ©|‘o LRU
Gš~E,§¤±î‚ LRU é^u‡Lo‘©|"
LS: $k (least significant)"

LSI: LSI Logic Corporation§˜[›E MIPS CPU úi—X8̇´


›E‡8¤r¡þXÚ¥ ASIC ؘܩ MIPS CPU"
÷(macro): OŽÅŠó¥˜‡3?È/®?ƒc‡^¯k½Â©
?1O†“üc"” äN/`§´^ C ý?nŠé # define ½Â
ÀÜ"
madd: „¦\(multiply-add)"

ÌZÅ(mainframe): Œ.[BOŽÅP¶i¶PkŒþ;ì!^u
êâ—8.A^"
—ê(mantissa): 2:êL«˜Ü©"£¡ê½êÜ©¤„1 7
Ù"
N(mapped): ^5£ã§S)¤@ I‡²LE,=†âU
Ôn/Œ§S/Œ‰Œc"
ùè/¶-è(mask): ˜‡ §ÏLÅ Ü6“†”öŠÀJêâ(
˜Ü©"
MDMX ASE: é MIPS32/64 ˜‡*УT*ÐÑy' MIPS32/64
@¤"MDMX æ^2:Mì5L«£8 Ú 16 ¤.ê|§¿J
øéê|¥ÜêӞ‰1ÓŽâ½ã/öŠ"k:aqu x86 
MMX *Ð"
ÊH@ù«öŠéu\„ѪÚÀª?n£õxN¤Ï^?֚~k
^"´ù U§\„õŒU´ DSP ASE §|±ÓöŠ§
I‡Ï^Mì"
memcpy(): IO C ¥¼ê¥^5€ê⬼ê"

;ì“o(memory barrier): „ sync c^"


397
MIPS âŠL
‡ TLB (micro-TLB, uTLB): I-TLB P¶i"
‡“è (microcode): Nõ CPU d˜‡. Œ^2©ÛÅìŠ
󣇓è¤?§. Ø£‡Ú™¤¤"( ISA ¥-ÏL‡
“èf§S¢y"
3 1970 c“§‡“è{k|u+n CPU OE,5"‘X 1980 c
“muэÐOóä§cÙ´muÑ Ð>´[ìƒ §£
†3M‡þ¢y ISA öŠCkŒU "´Nõ CPU £AO´ CISC
.¤E,æ^‡“è¢yE,½)œ-"
.Å (minicomputer): 1970  1980 c““X‡Œ”OŽÅ"ù
«OŽÅ3 1970 c“Èdƒé$§3ŒÆü‡X½ö)¿ýŽ
Œ«É‰ŒS"1˜‡ UNIX Ú 5m˜ è$ÄÒå u.ŧ
cÙ´ DEC  PDP-11"
MiniRISC: LSI úi˜X.`z MIPS CPU ûI¶"

Minix: d Andrew Tannenbaum ‘k, UNIX A{ü|


öŠXÚ"3\€öŠXڑ§Æ¥¤^öŠXÚ¥kKå"
Š˜J´§Linux ҴϏ Linux Torvalds éu Minix =^uÆ
˜ ہ5Ø÷¿ "
MIPS: 3Ö¥§·‚^ù‡cŠNX(¶i"MIPS ´ MIPS ú
i3{IÚÙ§I[ÙgCNX(!ŒnÜ^Ø!M‡9^‡¤
5þ˜‡ûI¶"
MIPS/ABI: MIPS A^§S#IO§ æ^Œ—à/ª
MIPS NX(Ü UNIX Xڂû|±"

MIPS OŽÅXÚkúi(MIPS Computer Systems, Inc): Ðé


MIPS NX(?1û’z¿ÈÅ"kžÿ^5Ù Uö§=
SGI úi MIPS Eâ܀"

MIPS ŒN‚û(MIPS silicon vendor): ?ۛEÚÈ MIPS CPU


½¹kÐO MIPS CPU |‡úi£=üØ@ ^ O<
CPU Øúi¤"ù‡¶ü)µLSI!IDT!Performance Semiconduc-
tor!NEC!Siemens!Toshiba!NKK!Philips!QED!Sony!SGI!PMC-
Sierra!SiByte/Broadcom!Alchemy/AMD!Cavium!Raza"vkÙ§=
‡ CPU NX(Œ±kùo˜‡¶ü"
MIPS System VR3, RISC/OS: ù Ñ´^5Ó˜‡öŠXÚ§l
UNIX System V Release 3 )ј‡öŠXÚ"ù £‡´ Irix 
Š ƒ˜"
398
MIPS âŠL
MIPS Eâkúi(MIPS Technologies, Inc): O MIPS CPU Ø
úi§MIPS32 9 MIPS64 NX(Šö§l 1999 cƒ y3
¤k MIPS NX(io<"MIPS Eâúi´ SGI  MIPS CPU Ü
€©lÑ5ƒ ¤á˜[úi"
²Lá6}Á pà“MØ” MIPS64 Oƒ §MIPS úi8¥u˜
XŒnÜØO"y3ù Ø3i\ªXÚ¥ 2A^"
MIPS UMIPS 4.3BSD: MIPS OŽÅúi1˜‡öŠXÚ§´ Berke-
ley  BSD4.3 ‡ UNIX XÚ˜‡£‡‡"§3{¤þk­‡¿
§Ϗk MIPS NX(A5Ò´;€é BSD I¦ O"
MIPSEB, MIPSEL: ù´lŒõê MIPS ?Èìóä󞦌—à½
—àÑў¤^c"
éàØ(misaligned): =™éà (unaligned)"
;ì+nü MMU(memory management unit): 3 MIPS ¥Jø
˜;+nM‡Ò´ TLB§Œ±òpˆ 64 §S/Œ=†¤Ôn
/Œ"
MS: pk(most significant)£Ü©¤"

¦\!¦\\(multiply-add, multiply-accumulate): òü‡êƒ¦,


‰1˜g\{¦Úü^-"XJk˜‡;^£ŒUV°Ý¤\
\ìÒ´¦\\§XJ (JŒ±Ï^Mì¥Ò´¦\"
ùa-éuꊎ{?è rŒk§cÙ´éu2:ê"MIPS32 ƒ
c CPU vkÑ¢yê¦\¶¢yT-ÄþÑoN MIPS32/64
½Â"
‘k2:M‡ MIPS32/64 CPU Pk2:¦\-8"
DSP ASE O\ ˜ ;^¦\-"

õ?nì(multiprocessor): kõ‡?nüXÚ¶¢‚¥§·‚r§
^Š SMP ÓÂc"
õ?Ö(multitasking): £ã|±õ‡››‚§öŠXÚ"3~„
gþ§‚§^˜‡Òژ‡e^-/Œx§¤±öŠXÚI‡k
,«NÝì5]Àeg$1=‡‚§§¿y¤k?Öщ1"
õ‚§M‡(multithreading hardware): U lM‡¥õ‡‚§£Ó
ž§½–36Y‚¥pÝ­U¤$1- CPU"MIPS32/64 MT ASE
5½ MIPS ¢yõ‚§˜«{§3N¹ A ¥k£ã"

399
MIPS âŠL
&Қê NaN (Not a Number): IEEE 754 ½ÂAÏ2:Š§Š
--š{öŠêžˆ£Š"
g,éà(naturally aligned): XJ˜‡ݏ n êâÄ/Œ n
"§@o`ù‡êâ´g,éà"˜‡iXJ uoi!>.§@
oÒ`´g,éඌiXJ uüi!>.Ò¡g,é඄é
à(alignment)"
NEC: >f’ã<§1990 c“+k MIPS CPU øAû"

i@É~/¥ä(nested exception/interrupt): \3‰1þ˜‡É~


?n§S¥mž2gu) MIPS É~žœ/"kžÿi@É~vŸo¯
K"
NKK: Š˜[Œ.Fn´úiŒN܀§NKK 3 1990 c“
@Ï) ˜ MIPS CPU£Ì‡Š IDT 1‡5 ¤"
،¶-¥ä NMI(nonmaskable interrupt): 3 R4000 9‘ ì‡
¥£QŠ˜‡Ñ\&ҏŠ˜‡¯‡¤"3 MIPS CPU þ§„
ؘÙ.´Œ¶-¥ä„´A½^E ¶övký O"
noat, nomacro, noreorder: ®?Šó››·-§Jø‰§S ˜«
{5BŽ, ¿šo´^E,®?ìöŠ£vk no ·-¶­#
#NƒAöŠ¤"
.set noat “Ž®?ìò®?“è€È¤^ at/$1 Mì-S"
.set nomacro “Ž®?ìòü‡®?Šé€È¤õ‡-"
.set noreorder “Ž®?ì 3©|ò´ø¥W¿k^- ‹Ï“è
gS"
š{l(nonblocking): ˜«öŠ§\ŒUÏ"§3¤ƒcʎ‰1§
´¢Sþ; ù‰"˜^š{l\1Ò´ CPU L\1-U
Y‰1§4êâ\13 ‰1"\1êⒽˆ£˜‡M쥧™
5-éTMì–¯´p£§ù§Sò31˜g¦^\1êâž
{l§Øšdž®²‰1 "
š“f¼ê(nonleaf function): 3,‡/N^O¼ê¼ê"~
œ/e§?Èì¬)¤˜‡¼êÄܧ3Òþˆ£/Œ£ŒU„kO
M스§±9˜‡¼ê—ܧ¡Eù Š"
š´”5;ì(nonvolatile memory): ·^u?Û3XÚä>ƒ E
,U±êâ;ìEâ"

400
MIPS âŠL
˜öŠ(nop, no-op): vköŠ"3 MIPS þ§nop Ù¢´- sllv zero,
zero, zero O¶§Ø)ŸoJ§?›-?èTЏ""

5‚z(normalize): ÏLé—ê£ Úéê?Uò2:Š=†¤5‚


z/ª"Ø éŠƒ §IEEE IOÑ´5‚zL«"
Ãz(nullified): ·^u?ۏ,®²u¿ UY?\6Y‚%Ø
N)?ÛJ-—Ù£MìöŠ³› ØÚuÉ~"
3T-áu“ØT‰1”£N´Ï†Øßÿ¤|ܧkž¡
“6Y‚˜"”
˜„5ù§†6Y‚σc§-جkŸo،’£J"¤¢
6Y‚ÏÏ~lp„ ·¥ž\1êâˆc ,‡žm"3
@Ï{ü6Y‚ CPU ¥§-=‹3˜^)É~-ƒ â
¬Ãz" 5 CPU 2æ^ù‡E|—~X§¢y©|-
“ŒU”CN"
NVRAM: š´”5 RAM§˜ƒä> E,±SNŒ
;ì"
objdump: ˜‡)è8I©‡¿ ‹<&E¢^§S;.¶i"

8I“è(object code): ˜«AÏ©‡‚ª§¹k?È §S“


èÚêâ§éN´=†¤Œ‰1©‡‚ª"
8I“è¥(object code library): ˜‡¹eZ‡£üÕ?Ȥ8I
“謩‡§Óž„k˜‡¢Ú‰Ñz‡¬ÑÑú^¼êÚCþ
¶"XÚó쌱É¥±9{ü8I¬§¿ =ó¥¥ý^
@ ¬"
l?›(octal): ±lÄêL«ê§DÚþ3c¡\˜‡""¢Sþ§
®?ì4kŒUrÖž±"‹Þê)ºl?›"
ÏS‰1(OOO, out of order): CPU ˜«¢yEâ"OOO CPU U
^Sэ-§´-‰1‘XêâˆUìêâ6^S£‡'
è™÷¤"‡Jø(^SŠÂ§ù« CPU 7Ly¤-U
^Sòѧ ?ۉ1¥-BŠ^ь±ž"
ùfþš~E,§êâ6gS#Nõ-¿1‰1§(J5
UOr´Xdƒp§±–uù«Eâ3š~p  CPU ^4ÊH"
i\ª CPU „kŒnÜ CPU +„vk¢y OOO§wå5ò5
¬"MIPS NX(˜ßMìMì|„Ú"y^‡è¦ OOO
¢yå5чN´˜ "

401
MIPS âŠL
öŠè(op-code): -?›L«¥Ü©§é‰½-ÏPÎØ
MìÀJÜ©!i\~êƒ T±ØC
öŠê(operand): ˜‡öŠ^Š"
`zì(optimizer): ?Èì˜Ü©§ò§S˜«(L«/ªC
†ØÓdL«§£F"¤‡o!Ž˜m‡o$1¯ "
OS: öŠXÚ"

ÄÑ(overflow): öŠ(JŒÃ{^ÑтªL«¡ÄÑ"
W¿(padding): du?ÈìI‡÷vM‡éêâéà‡¦§ éêâ
(3;ì¥L«ƒm3јm"
(page): ˜‡;쬧Ï~Œ,g˜¿ g,éà§ù´/
Œ=†XÚ¦^;ìü "Œõê MIPS öŠXÚæ^ 4 KB ½Œ
§´M‡kžU ·ÜA«Øӌ=†"
Ú(page color): ˜‡ôÚ´J[/Œ$ 1–4 Š"3˜
‡J[¢Ú§ÔnI\p„ £MIPS CPU þ~^¤¥§Ôn/Œ
ƒÓ´J[/ŒäkØÓôÚêâ¬^ØÓp„  ˜§—p
„ ­K(cache alias)"
´XJӘÔn/ŒNôڃÓҌ;­K"3Ñyõ­N
~„œ¹e§Nõžÿ4öŠXÚKI‘oӐڴƒg,
"Ø3´§3, )œœ/§¯K‡Jõ"
æ(page fault): ˜‡öŠXÚVg§§S–¯ ˜‡vk©k
Ôn/Œ=†/Œù«¯‡¶3ùöŠXÚ¥§æ)
û‡²LùA‡Ú½µÑ·SN!©Ôn;ì!˜/Œ=†!
 3Ñæ-?­#m©§S"
L(page table): ;.öŠXÚ TLB ™·¥É~?n§S‡
Œþ/Œ=†£Cu TLB Œ±†^‚ª¤§^J[/Œp
Š¢Ú"ù˜‡êâ(¡L"
©(paged): ˜‡;ì+nXÚ£'X MIPS ¤§Ù¥æ^½Œ
£MIPS Œ 4 KB¤ü ?1N¶/Œp ?1=†§$
ØC†D4"
PageMask Mì(PageMask register): MIPS ;ì+nXÚ¦^
M춄1 6 Ù"
ëê(parameter): !~§ž§k §S `D4ëê‰f§S§k
£Uì C ?§Ãþ¤`D4ëþ‰¼ê"¦‚`Ñ´˜£¯"
402
MIPS âŠL
Ûó(parity): {ü†Øuÿ"‰i!½öÙ§êâü \þ˜
‡P{“ ”¦ 1  o꣝) ¤Ûê£Û¤½
óê£ó¤"
Ü©i!Ü©Vi(partial-word, partial-doubleword): °Ýu˜‡
i½öVi´M‡Œ±Š˜‡ü ?1DÑêâ"3, MIPS
CPU þ§Œ±3˜‡ԇi!ƒm"

Patterson, David: l MIPS Ý5w§¦´ Hennessy ÇŠ—º


ŠÚӊö£„ Hennessy and Patterson¤"3 MIPS +ƒ §David
Patterson ¶íŒUÚ Hennessy ¿§¦+ Berkeley  RISC ‘8§
5¤ SPARC c"
§SOêì PC(prgram counter): CPU c3‰1-/Œ
{¡"
PC ƒéό(PC relative): XJ˜^-¦^/Œ?菃éuT
-g ˜ £þ§@oÒ¡T-´ PC ƒéό"¬SÜ PC
ƒéό©|éB§Ï‡¬3;쥲£žØI‡?¶
ùŠX PIC£ ˜Ã'“è¤c? ˜Ú"
PCI: Œ 1993 cu² PC  I/O o‚§y3Šë I/O ››ìÚ
OŽÅÏ^ª"
PDP-11: 1970 c“­.ÉH.ŧd DEC ›E"ÙK4
§ÏûÐOûüÚ`D© -Ù¤§S ¿ á
ÀÜ"cÙ´ Ken Thompson რu² UNIX§K ‡{¤"
PDtrace: EJTAG NÁü˜‡*ЧŒ±Â8‹l&E§˜X²
LØ /Œ#N Ü^‡­#E§S‡‰1´»"‡¢ž
v õ‹l&E´‡]Ô"„1 12.3 !"
½š`z(peephole optimization): ˜«`zª§TªÏL£OA
½ª-S¿^á{üª?1O†5ˆ`z8"½
š`zéu RISC ¿Ø@o­‡§´é CISC š~­‡§ÏJø ?
Èì|^E,-̇ś"
vÒ PFN(page frame number): Ôn/Œp §´©ª MMU
ÑÑ"
Philips: î³>f’ãÞ§Q²OڛEL MIPS اy3UY¦^
MIPS Ø"

403
MIPS âŠL
Ôn/Œ(physical address): Ñy3 CPU ÑÑÚ þ/Œ§D
ÑÌÚ I/O XÚ"†§S/Œ£J[/Œ¤ØÓ"
Ônp„ (physical cache): “æ^Ôn¢ÚÚÔnI\p„ ”
{¡§Ò´`ùü‡õUÑæ^£=† ¤Ôn/Œ"
PIC: „ ˜Ã'“è(position independent code)"

6Y‚(pipeline): ' NX(A5§ÏL§Œ±¢yA^-¿1


í?¶„1 1.1 !"
®?Šóé6Y‚Ûõ(pipeline concealment by assembly): MIPS
®?ŠóÏ~ØI‡§S Ä6Y‚§¦+ÅìŠó7LÄ"®?ì
ò“èc £Ä½ö\ nop ±“¿ 1"
6Y‚‘x(pipeline hazard): „‘x(hazard)"
6Y‚Êî{l(pipeline stall): „Êî(stall)"
6Y‚ã(pipestage): äN MIPS 6Y‚£~„Ê‡¤ãƒ
˜"˜„œ/§3?Û6Y‚O¥§˜‡6Y‚㍴K?
¿ü‡ž¨>÷ƒm-Ü6"
pixie, pixprof: @Ï MIPS UNIX XÚ¥kL­‡{¤K¿Û ó
ä"^5ÿþډÑp„ž§SÅ^-1"pixie óŠžr©
§S?›=†¤˜‡)ÚOz‡Ä¬£˜‡Ä¬Ò´±©|
-½©|8I m˜ã-¤‰1gêÿþ-‡"
pixprof ¯? pixie $1ž)°þJ±žzOêê⧲LÜ C
¤k¿ÂÚO(J"Nk˜U§ù óä½öaqóä3Oóä
¥¬Jø"
PlayStation: Sony 1995 ciZŧd 32  MIPS ‡?nì°Ä"

PMC-Sierra: PMC-Sierra ´˜‡¬‚2äúi"§u


2000 c MIPS CPU ;’Oúi QED§d ) eZ MIPS
¬"QED òYe5p5U½› CPU ¬‚˜†UYV 64
R9000X2 CPU§ U¬æ^ MIPS úiØ"

£‡/Œ£‡5/Œ£‡(porting/portability/portable): N˜«
OŽÅO§S4§U $1†,˜OŽÅþ"˜‡´u£‡§S¡
Œ£‡§\Œ±Šâ§SŒ£‡5éÙµ½?"
˜Ã'“è(position indenpendent code): Øؖu§S/Œ˜m
Ÿo/ÑU (‰1“è—Š˜J´§ùé Linux/MIPS A^
^‡5`´7I"„1 16 Ù"
404
MIPS âŠL
Œ±ÏL{ü/r¤kÚ^ÑU¤ PC ƒéό/ªf PIC
/ª"
POSIX: IEEE öŠXÚJø?§›½˜‡IO"‡IO
k ­§´,f8£'X¯¤±õ‚§IO IEEE 1003¤®²
¤¯¢þIO"
PostScript: ˜«OŽŠó§Óž´L«‹<¡˜«êiª"˜
‡4p²Ž{§Ð u Xerox Parc§Ù™UÚ£­.Äþ´du
Adobe System úi@Ø4§?\Œ¯½|U ?õa"

pragma: C ?Èì #pragma ý?nŠé§^5l “èSÜÀJ,


?ÈìÀ‘", ANSI C IO|±§´Ø {*Ú(¹µGCC
–•uòk^À‘Ꮚó*Ð"
°(É~(precise exception): É~u)ƒ §-S u EPC •
@^-ƒc-ܤ§ Ù Ñy-wþ†vkÑ
y˜"MIPS NX(Jø°(É~"
°Ý(precision): £êâa.¤êâL«¤^?› ê"
sÓ(preemption): sӴϏ, ­‡¯œÑy ØØÊeÃ
Þ3Z¯œ"3OŽÅXÚ¥§“­‡¯œÑy”ªϒ½
´‡¥ä§¤±sÓªöŠXÚ´3?Û¥äžÑ#N­#NÝ"P
 Linux ‡£2.6 ƒc¤Ø´sÓªµXJ¥äu)ž“èÐ$1u
Ø%§3¥ä“ègʎ½ögˆ£^rƒcØ#N‘ ­#
NÝ"
ý(prefetch): 3ØK3$1§S^‡e§m©òόê
âp„ öŠ"XJ§S Œ±3êâý\1ƒc±,«ª
Jc?1ý§@okŒUwÍJ,5U"
ý?nì(preprocessor): „ C ý?nì"
PRId Mì(PRId register): wŠ\ CPU .ÒڇÒ£Ö¤
CPU ››Mì"ØALõ6§"

˜? L1 p„ (primary(L1) cache): 3Pkõ?p„ XÚ


¥§l CPU Cp„ "
A?(privilege level): CPU U $1SöŠXÚ7LU3ü
«ØÓA?þ$1"®¤k MIPS öŠXڐ^ü‡A?µØ
%A?Ú^rA?£+nA?ÊHѤ"
^rA?§SØ#NƒpZ6½Z6PkASاS¶PkA
§S7L(óŠ"
405
MIPS âŠL
Š‡A?(privilege violation): ˜‡§SÁã‰1Ø#NöŠ§ù
¬—˜‡É~"öŠXÚ7Lû½ŠÑN¨v"
&Þ!NÁ(probe, debug): „ debug probe "
?§(process): ˜‡ UNIX c§éAu·-1þ˜‡c½öü‡A
^§S˜¬OŽ¶)˜‡››‚§!˜‡$1§S?›“è±
9Œ±3Ù¥S$1gC/Œ˜m"
¿Û(profiling): ‘þ˜ Â8] ¦^Ú$1&Eóä5$1§S"
@‡ó䌱¦X^‡§3^‡ÏeÏL±Ï5¥ä¼&E§Œ±
´XM‡£Xþ¡ PDtrace¤"
§S/Œ(program address): l^‡ó§“Ýw/Œ§d§S
)¤"‰J[/Œ"
ÄÜ(prologue): „¼êÄÜ(function prologue)"
Œ?§Ö;ì PROM(programmable read-only memory): Øî
‚?¿Ö§S;ì"Ð´@ 3) Œ±?§;
짴y3M?§£“ù”¤ROM 3æ^ MIPS CPU @ŒX
Ú¥é„ "
koöŠXÚ(protected OS): ˜‡3$A?‰1?ÖöŠX
Ú§ùŒ±“Ž?Ö?1»€5óŠ"
PTE: L‘"3 MIPS þÒ´d^‡‘o^5EM‡ TLB êâ‘
êâ"
PTEBase: MIPS Context ½ XContext Mì˜Ü©§C\;.ê
ⴘ‡•;ì¥/Œ=†L"
Pthreads: „ POSIX"

QED: þfì‡kúi§1990 c“±5õ MIPS CPU O


|"
o°Ý 128 2:ê(quad-precision (128-bit) floating point): MIPS
M‡Ø|±§´3 n64 ABI ¥Š ½Â§k ?Èì^^‡¢y"3 C
Šó¥§ù¡ long double"
R2000, R3000: 1˜‡û’z MIPS CPU§µCå5æ^ Ü·
RAM Š˜?p„ "

406
MIPS âŠL
raMì(ra register): CPU Mì $31§DÚþ^Šf§Sˆ£/
Œ"ISA |±ù«^{§jal -†^§£Ù 26 8I/Œvk3ev
˜m½=‡MìɈ£/ŒŠ¤"
‘Å;ì RAM(random access memory): QŒÖqŒO
ŽÅ;ì"„ ROM"
Random Mì(Random register): ‘k TLB ž CPU ››M
ì"TMìgÄëY4O§Š TLB –‘ÅO†Ž{"
Raza ‡>fkúi(Raza Microelectronics, Inc): ƒé#?\
MIPS úi§Raza ›E XLR xõ‚§!õØ MIPS64 CPU A^uC
ål䧌U´8c¤k MIPS ¥óéþp"ýéŠ5
Àœ
Ö`k(read priority): du ÀìϧCPU ŒUŽÓž‰1˜
‡ÖöŠÚ˜‡£ò´¤öŠ"k‰1ÖöŠØ=Œ1„UJp5U"
XJ CPU o´–Öêâ§@où«^‡¡Ö`k"´
Ö ˜É–\Kžÿ§ù‰¬E¤˜—5¯K§¤k
é MIPS CPU }Áùo‰£LSI  LR33000 ´‡~ ¤"
Mì­·¶(register renaming): ˜«¢yp5UOŽÅEâ§#
N-‹Ï~gS‰1´‰1gSé§S ±ØŒ„"^u MIPS
R10000"

Œ­½ 8I¬(relocatable object module): ˜ã¹7‡&E


ÚP¹8I“è§4§SU é¿‘ ?U¤k £þÚÛõ/
Œ§r¬½ SA½ ˜"
­½ (relocation):  ¦?›8I“èU3ØÓ;ì ˜‰1
?1=†L§"
2g5‚z(renormalization): 32:OŽƒ §(JŒUØ2´5‚
z"2g5‚zÒ´­#4(J5‚z"
E (reset): Ö¥^5\-¹ CPU  Reset Ñ\žu)¯‡¶
ù3fþ>½öXÚ­#Щzžu)"
°{-8OŽÅ RISC(reduced instruction set computer): Ö¥
 ¢y{ü6Y‚ O˜aOŽÅNX("3 1980 c“
ŒÏm©Ñy"
ÖU RMW(read-modify-write): é?¿a.; ˜~„ö
ŠS" RMW S3ÖÚƒm‹äžÒ¬u)õ‚§XÚ~„
407
MIPS âŠL
†Ø§dž¥ä‚§ŒU^˜‡LžŠ­¥ä‚§Š"Ò´
`§RMW ~~kf5 ‡¦"
Ö;ì ROM(read-only memory): ØU\;"£3y
“§õØU±Ï~öŠ\—~~k˜ l‚½öš~5Ã
㌱?1­#?§"
\ª(rounding mode): ½Â2:öŠ°(1"Œ±ÏL2:
G/››M옣„1 7 Ù¤"
¢žöŠXÚ RTOS(real-time operating system): ˜‡E^c"
Az‡' Linux {üöŠXÚÑ¡ RTOS"ý ÏXÚ÷
v(½ž O{üöŠXÚX8ŒU‰“M¢ž”öŠXÚ"
s0–s9 Mì(s0–s9 registers): U콊^¼ê‰ŒCþ¤^
 CPU Ï^Mì8Ü£$16–$23 Ú $30¤" ´?Uù Mì¼
êÑ7Lk§‚Š"
âÝ(sandbox): äkAÏo˜|] £^!©‡˜m!;ì9
CPU žm¤§3Ù¥Œ±S$1Ø&?§S"ù´ÏAþZEâ
¶cƒ˜"
SandCraft Inc.: ˜[ MIPS CPU Oŧ¤áu 1996 c§—åu
½› CPU O"ÙÜ©< d SGI  R4300 ‘8|Ø%¤ |
¤"SandCraft O NEC  Vr54xx X CPU"SandCraft u 2003 c
Raza ‡>fúi "

ڎâ(saturating arithmetic): $Ž(J°Ý‡Ñ Lˆ(J


‚ª¤UL«‰Œƒ ž§)¤ŒL«‰ŒSC$Ž(JŠ5
?nÄÑŽâ$ŽöŠ¤ڎâ"éukÎÒê$Ž§(J
´ŒL«Œ½öê§éuÃÎÒê$Ž§(JKŠž^"
“"
éuŒUÄÑOŽ§ÏL^‡“è?1uÿØy¢œ¹§ù‡ÀJ‡
'“g,”£7Ðõ"
^‡;(sc, store conditional): „ë£\1(load-linked)"
Iþ(scalar): £ØÓuê|½êâ(¤{üCþ"aq§˜géü
¬êâ?1öŠ CPU ¡IþÅ"ù‡c5´ ڕþ?nì
CPU «O§ öŒ±˜göŠ˜¬êâ"

NÝì(scheduler): 3õ?ÖXÚ¥§NÝìÒ´û½eg‰1=‡?
Ö§S"
408
MIPS âŠL
SDE-MIPS: Algorithmics é MIPS 8IÅmuó䝧Äu GNU
C ï"
SDRAM, DDR DRAM(synchronous DRAM): ‘kˆ«ˆÄ
u÷Xêâ‚G1êâDÑp‘°êâS¡"
?p„ (secondary L2 cache): 3‘kõgp„ XÚ¥§
´l CPU 1Cp„ "
«(section): ^5l§S¥©m“è!ˆ«êâ!NÁ&E¿ Dx
8I“襩¬¶i" ±z‡«ü û½Ù3S¥
˜"
ã(segment): „ kseg0, kseg1 "
©ã(segmentation): ˜«Lž;ì/Œ=†Úo{§Ù¥
§S/Œ\þ˜‡Ä/Œ5?U"x86 ^Lù«{§´gl 386 ±
Òv7‡ "
&Òþ(semaphore): ˜‡rkåVg§^u|„O­èõ?Ö½
õ?nìXÚm܊"
.set ®?Šó››·-(.set§assembly language controls): „ noat "

|§p„ (set, cache): „cache set "


|ƒé(set-associative): „cache, set-associative "
SGI(Silicon Graphics, Inc): 1990 c“Äu MIPS OŽÅøAû
PŒ§´ MIPS NX(io<"ÖŠžTúi» "
short: C Šó˜‡.êâa.¶i§–‹ char ˜ŒŒØ
‡L int"3 32 Ú 64 NX(þ§short qo´“L 16 ê"
SiByte: ˜[ CPU Oúi§3 1990 c“ ÏMï 64 MIPS
CPU"Broadcom úi §ƒ §E,¦^ SB-12xx CPU"

&Ò(signal): UNIX ƒaXÚ¥ux‰ÊϧS©¥ä"3 Berke-


ley UNIX ¥U?§d POSIX óŠ|n¿5‰z§^˜«{'
ªL«õ?ÖXÚ¥{ü¯‡Ï&"
ŒN‚û(silicon vendor): 3 MIPS ­.§›EÚÈ MIPS CPU
?˜[úi"
ü-õêâ6 SIMD(single instruction multiple data): SIMD -
éõ‡êâ­EӘöŠ"y“ SIMD -;.‰{´l˜‡°M
쓃¡”õ‡öŠê"
409
MIPS âŠL
SmartMIPS ASE: ˜‡-?*Ч8I½|½ u“œUk”—Œ
?Ö´?1\—/)—4$õÑ CPU"O\ þOŽ-ژ
;ì+nUÄé@ ¡•SA^Jø[âÝo"
é¡õ?n SMP(symmetric multiprocessing): Œ5õ CPU XÚ
¤õ˜«/ª§Ù¥eZ;ì£;.‰{´æ^˜—5
p„ ¤ CPU $1ÓöŠXÚSØ"Linux/MIPS ®²Œ±†
$1u· SMP XÚM‡þ "
f(snooping, snoopy): „ cache, snooping "
¡þXÚ SoC(system on a chip): ^õ‡fXÚïE,ì‡"
5õ´5gØÓÇõ‡fXÚ¤"
^E (soft reset): 3êi>f¥§E ´ÊHŒ„4˜ƒÑ£å
:&Ò"éu˜‡ CPU§E “L ]m=­Ó£—3A‡Î¦ƒSk
E)"kžÿ§\Ž3E CPU žÿ4§P4c­˜ ÀÜ—ù
Ò´“^E "” „1 5.9 !"
^‡-[ì(software instruction emulators): ˜‡[ CPU/
;ìXÚöŠ§S"Œ±^5uAO. ^‡§Ï. Ã{
oNNÁì"
^‡¥ä(software interrupts): ÏL˜ Cause Mì Úu
¥ä¶^‡¥ä=ù ™¶-žâ¬u)"
Sony: ž¤a>f¬úi§Ù PlayStation æ^ MIPS ¡"

“è?NÁì(source-level debugger): ± §S£-1!Cþ¶!


êâ(¤/ª«c§SGNÁì" “è?NÁìI‡–¯
“è§ùóŠui\ªXÚ^‡ž§NÁì7L$13‰ÌÅþ§l
$1u8IÅþ{üNÁi›§S¼§SG&E"
sp Mì/ÒMì(sp register/stack pointer): CPU Mì $29§D
Úþ^ŠÒ"
SPARC: Sun úi RISC CPU NX("† u\²ŒÆˎ|©
 RISC ‘8§ MIPS Ñgd"4ŒÆ"d"4£ uÎ7쌤´
˜¤háŒÆk Ŷˎ|£ u° 顤´¤úáŒÆ§'-
?"3‡?nìOþkNõ¬{¤"
DÕ/Œ˜m(sparse address space): ˜ öŠXÚüÑ£wÍÒ
´æ^˜‡é–/ŒŠÏéY¤k3\Pk'¢SI‡Œõ
/Œ˜mžâUóŠ"ù\Œ±«ÉòÀÜDÕÑÙuˆ?¿ Î
410
MIPS âŠL
ÃR©˜m§XDÕ/Œ˜m‡¦"y3„vk=‡DÕ/Œ˜
möŠXÚ¼û’þ¤õ"
ßÿ‰1(speculative execution): ˜« CPU ¢yE|§Ù¥ CPU 3
ýT‰1=^-£~„´§3„™ŠÑ´Ä¬u)^‡©|
䤃c҉1-"l R10000 ± pà MIPS CPU ±95
õpài\ª CPU Ñæ^TEâ"
£^£(spinlock): SMP XÚ^˜«. &Òþ/ª"ÙA´˜‡
3T&Òþþ{l‚§ò?\˜‡±Yu\£Cþ̂"ù3¼
˜‡£^êA‡±Ïžk¿Â"
SR GMì(SR register): CPU GMì§A››Mìƒ
˜"¹ CPU ª›› "œ„1 3.3 !"
Ò(stack): ?kÑêâ(§^5P¹3$1k¿gŠó
CPU ‰1G"

Òëê((stack argument structure): ˜‡Vgþêâ(§1


11.2.1 !^5)ºUì MIPS ½ëê´ND4‰¼ê"

Ò£ˆ(stack backtrace): NÁ옇õU§é§SÒG?1)


Û±‰Ñˆc‰1 ˜¼êN^i@("TõUûuî
‚„ÌÒ¦^½§ù:®?§S7L^IO–-IÑ"
Òv(stack frame): ˜‡äN¼ê¤^Ҙm¡ä"
ÒeÄ(stack underrun): Áãl˜‡l™Ø\êâÒ¥Ñêâ
žÑy†Ø"
Lžêâ(stale data): ˜‡¶c§^5®²CöŠ“´
E,„3êâ"Œ±´ CPU ®²# p„ €„™£ž
;ì¥êⶏŒU´;ìSN®² DMA O†„™Š
¢p„ ž up„ ¥êâ€"¦^Lžêⴇ†Ø"
Êî(stall):  CPU ¤óŠ –, ] ž6Y‚È(£¤k
-GÑØUí?¤G"
Õá^‡(standalone software): $1žØI‡?ÛöŠXÚ½IO$
1‚¸^‡"
d"4(Stanford): Î7ì/«˜¤ŒÆ§Hennessy Ç3@p+
MIPS Æâ‘8§´ MIPS úi)/"

411
MIPS âŠL
·Cþ(static variable): C Šó¶c§3?Ȟ© ½;
ì/Œêâ"
GMì(Status register): SR Mì,˜‡¶i§„þ"
stdarg: ANSI C 1OIO÷§Jø é‘kؽ‡êëê½öa.
k3$1žâU(½ëê¼ê|±§´Ûõ ¢y[!"
strcmp: C Šó¥¼ê§'ü‡£±˜iÎ(—¤iÎG"

strcpy: C Šó¥¼ê§€˜‡£±˜iÎ(—¤iÎG"

‡?OŽÅ(supercomputer): Š¥~^5 J¦êŠOŽ½O


Ž—8.A^5U Ø7ĤïEOŽÅ"Ï~´ÏLæ^˜
–•þ2:-ƒé„NX(A55ˆp5U"
‡6Y‚ CPU(superpipelined CPU): Q,6Y‚´‡Ð¯§@o
NÏL@؞¨±ÏÚrü‡‰1㩏¡ä§Ù¥z‡¡äÑ
U@?Ø ž¨±Ï—ùÒ´‡6Y‚"
MIPS R4000 CPU k˜:‡6Y‚§²z‡Úêâp„ –¯©¤
ü‡ã¿ KŒž¨±Ï®˜‡l?6Y‚", \6Y‚
—©|“dO\£©|ýÿŒ± )ù:¤±9\1-¦^ò´O\"
R4000 (á ù˜:§Ò´3é2 RISC aNX(¥§ØA¦
^‡LÊ?6Y‚§Øš\\ ©|ýÿA5¿±,«ª)û êâ
\1¦^ƒmò´¯K"
‡Iþ(superscalar): ˜« CPU ¢yE⧌±Óžuõ^-"n
Ž´E›v õ6Y‚ã5#N¿©õ-˜å‰1§4\“s˜
“dü5U”"
(Jy²§3|± OOO |„ƒc§‡Iþ CPU é?ÈÑ“èUJø
Øõ5UJ,"éuÃó?§c[NL“èSJŒU¬Ð"
´k aO-£~X2:¤¿1uÚ$1¤ƒ$§dž
ù«E|U!Ž¤", §§61§Ý'ÙdŠp"
+nA?(supervisor-privilege level): 0uØ%Ú^rƒmA
?"3 MIPS32/64 ¥´ŒÀ§Nõ MIPS CPU Ñk¢y§´l5
v^L"„1 3.3.1 !"
†ì(swapper): „ byte-swapper "
sync§;ìÓړo(sync, memory synchronization barrier): ˜^
4§S ²(L«§S¥ÖgSý魇-"§S^S¥3
sync -ƒc?ÛÖ7L¤ƒ §âU‰1 sync ƒ Ö"

412
MIPS âŠL
ÓÚÜ6(synchronous logic): Uì3ƒUMìƒm\“|Ü
Ü6“ã§z‡Mì3½۞¨&Ò=†Ïm;&E"ò
Verilog “èC¤U^¡Ü6?È짌õê8§ہuN
ÓÚÜ6 Verilog “è§@´¤k®ŒnÜ CPU 󊐪"
éU^ÉÚÜ6?1Œ‚nÜ´˜‡4à(JÉ ò8I§XJ
¤õŒ±)5UõÑ'4ŒJ,"
ܤ-(synthesized instructions): „ instruction synthesis by assem-
bly "

XÚN^(syscall): ˜^ )É~ 3-"É~¿˜‡éS


ØSf§SN^"syscall -k˜‡˜sM‡ØŠ)º§^
‡Œ^§?èØÓXÚN^a."´ Linux ¿Ø^§—¿^˜‡
3Ï^Mì¥D4Š5«©XÚN^a."
t0–t9 Mì/žMì(t0–t9 register/temporaries): CPU Mì
$8–$15 Ú $24–$25§U½^užCþ¶?Û¼êь±^ù Mì"
":´ù ŠØUy3XÚN^ƒm"
TagHi!TagLo Mì(TagHi, TagLo registers): MIPS32/64  CP0
M춧‚´p„ I\SN։Õ"
TC: 3 MIPS MT(õ‚§) CPU ¥§TC ´$1‚§M‡ü§Pk˜
‡ PC ژ|Ï^Mì"
žMì(temporary registers): „ t0 "
L3 n?p„ (tertiary (L3) cache): u L2 ÚSƒm1n?
p„ "
ËÄ(thrashing): ˜«éuª`z$§ÙA´Øä­E”
}"“p„ ËÄ”´˜«A~§Ù¥§Sª„¦^ü‡/Œ¿
Ә‡p„ ;¬§‡EòéO†Ñp„ §¦p„ ”
Š^"3^‡¡s¤ éŒãåÁãEÑØ´Ép„ Ëē
è§Ñ±”} wª¶´¦^|ƒép„  ù‡¯K½õ½ž
” "
‚§(thread): ‚§Ò´§S¥Uì§S ¿ã^S‰1Ü©"ù´^
‡õ?ÖöŠXÚ!õ?nìXÚ½õ‚§ CPU M‡ÄEü"
½žì(timer):  CPU Jø˜‡õU§´˜‡½„ÝOêì§T
Oêì‘k˜«Å›§U3Oêˆ,‡½Šž¬Úu¥ä"

413
MIPS âŠL
=† À Àì TLB(translation lookasdie buffer): ò§S/Œ=
†Ôn/Œƒé;ì" TLB ؝¹\I‡/Œ=†ž§CPU
u)É~§dXÚ^‡\1Ü·/Œ=†êâ§, ˆ£¿­#‰1Ñ
†/ŒÚ^"„1 6 Ù"
TLB, B#‘(TLB, wired entries): cA‡ TLB ê⑌±˜¤Ø
É TLB ­W?n§S‘ÅO†üÑKµr wired Mì˜"
±þ˜‡Š§random MìÒجu½u wired Š"éP
MIPS CPU vk wired Mìo´3cl‘"

TLB ÃÉ~(TLB invalid exception):  TLB ‘šƒA/Œ´


gIPÃžu)É~"
TLB á˜(TLB miss): vk TLB ‘š§S/Œžu)É~"Œ
õê TLB ™·¥É~^˜‡ÕA;^É~\:"ù‰´Ïù‡
É~´öŠXÚ¥Ñyõ§Ž£OÉ~“茱!Žžm"
éP MIPS CPU é^r TLB ™·¥É~¦^;€É~\
:µMIPS32/64 CPU éÉ~ª£˜‡„´AÏœ/¤ƒ  TLB
™·¥Ñ^;€É~\"
TLB ?UÉ~(TLB modified exception): ˜‡ TLB ‘š ˜‡
öŠ/Œ§T TLB ‘IPØŒžu)É~"
TLB uÿ§tlbp (TLB probe, tlbp): ˜‡-§Œ±J˜‡§S/
Œ‰ TLB 5w´Ä3,˜‘U =†T/Œ"
TLB ­W(TLB refill): 3 TLB ™·¥ƒ • TLB V\#êâ‘
L§"
óäó!óä‡(toolchain, toolkit): ^5l “èm©)¤Œ$1
§S¤I‡Üóä8Ü£?Èì!®?ì!óì!¥¤"
Àz(Toshiba): ˜[F¡›Eû§Pk MIPS Ç"ÀzŠÊ
ϝÈ CPU ì‡øAû¿Øâѧ¤¶´Š Sony PlayStation 2
“aœÚ™”%9µ˜‡ 64 2:•þ?nì§Ø' 1980 c“?
ۇ?OŽÅÖÚ"
=†/Œ½/Œ«(translated address or address region): 7L²L
TLB =†£ÄKц¤ MIPS §S£J[¤/Œ") kuseg «§^rA
?^‡7L3d$1¶„kNØ%A?« kseg2"64 CPU P
kõ=†«"
=† À Àì(translation lookaside buffer): „ TLB "
414
MIPS âŠL
g€(trap): KA½-Sܯ‡—É~"
(trunc): 2:- trunc r˜‡2:êêÜ©˜‡ê"
TTL: ¬N+-¬N+Ü6£transistor-transistor logic¤Äi1 "ù
´˜‡&Ò½§^5(½˜‡>í&ғL 1!0 „´0uöƒm™½
Â"TTL Äu@Ï 5 V Ü6xS."TTL &-– 1990 c“ Ï
3¤k‡?nìXÚþÏ^¶ÙŒUO“ö´Ñ‡?U æ^ 3.3
V ø>> "

ü´|ƒé(two-way set-associative): „cache, set-associative "


Ï^ÉÚÂuì UART(universal asynchronous receiver/transmitter):
˜«G››ì"
Ultrix: DEC Ù$13Äu MIPS  DECstation OŽÅþ BSD X
öŠXÚåûI¶"Ultrix $13 DEC ‡¦—àþ§¦§†
“ MIPS óŠÕÚÑÖìØU?›oN"
UMIPS: „ MIPS UMIPS 4.3BSD "

™éà/Œ–¯É~(unaligned access exception): duÚ^£load/store


i½Œi¤™U·éà/Œ —g€"
™éàêâ(unaligned data): ;3S¥êâ§Øy ué
à·/Œ>."™éàêâU^Aύ-SâUŒ‚–
¯§„ 8.5.1 !"
،p„ (uncachable): CPU ÖزLØKp„ 
;«"éu kseg1 «Ú TLB ‘IPØŠp„ ?1/Œ=†
«Ñ´Xd"
Ø^p„ (uncached): Ø|¢½Ø\p„  CPU Ö"
eÄ(underflow): 2:öŠ(JŠÃ{~L«ž¤eÄ"
ژp„ (unified cache): éu¤k CPU –¯Ñ|¢Ú#p„
§)ÚÚ^êâ"Äþ¤k MIPS CPU Ñæ^üÕ˜? I-
Ú D- p„ §´Œõê L2 Ú L3 p„ Ѵژ"
™¢y-É~(unimplemented instruction exception):  CPU
ØU£O-èžu)É~¶^3ØU¤2:-Ž‡^‡
/"

415
MIPS âŠL
éÜN(union): C Šóêâ(²§L«TêâéØÓa.kØÓ
)º"XJ\;êâž^˜«a.§Öў^,˜«a.§Ù(J±k
ªw«ÑpÝ،£‡5"
ü?nì(uniprocessor): ؋O?nì;ì CPU"
(UNIX-like): aqý UNIX XÚ§´vk‡½öªI
O") Linux§„k5gˆ‡ OpenBSD Ú FreeBSD |öŠXÚ§±
9– Sun  Solaris ½ö SGI  Irix ƒaû’öŠXÚ"
™N!؊=†(unmapped, untranslated):  kseg0!kseg1 /Œ
«"
Ðm̂(unrolled loop): §S¥̂§²LC† £Œõêžm¤
3a=ƒm‰1‡L˜ĝóŠ"~~U¦§S$1/¯˜:¶kž
dp??ÈìgÄ?1ù«C†"
^r˜m(user space): ^rA?Œ–¯/Œ˜m£kuseg¤"
^r«(userland): Linux ^5¡XÚ?uS؃ Ü©µ¥„kÄ
A^§S"GNU/Linux öŠXÚ^r«Œõ5gu GNU ‘8"
^rA?(user-privileged level): MIPS CPU $A?G§Ù
¥U^~5-8§§S/Œ7L u kuseg S"öŠXڌ±“Ž^
rA?§SƒpZ6Ú½öZ6öŠXÚ"
utlbmiss É~(utlbmiss exception): ^r TLB ™·¥É~"3P
 MIPS CPU þ§;^ TLB ™·¥É~\:=^u^rÉ~"
v0–v1 Mì(v0–v1 registers): CPU Mì $2–$3§Uì½^5N
B¼êˆ£Š"
(varargs): stdarg y3®²LžP‡"

VAX: DEC äkmM5 32 .ÅNX(§ýéØ´ RISC"1


˜‡|±J[;ì£V u virtual¤.Å"
•þ!•þ?nì(vector, vector processor): PkU ˜g3˜¬
êâ8Üþ‰1öŠ§AO´2:öŠ-?nì"ù´˜«¡ü
-õêâ£SIMD¤¿1?n~f¶´1˜«¢S¦^¿1?n"
êŠ$Ž—8.‡?OŽÅ6•þ?n5Jp„Ý"
Œ•þz(vectorizable): N´¢ygÄ̂`z5|^•þ½Ù§
SIMD öŠ§S ¡Œ•þz"¢S¥§Ï~I‡c[O§S
âUŒ±?1@«`z"
416
MIPS âŠL
Verilog: ˜‡?§Šó§^5£ãéý¢M‡[½ö“nÜ”Ü6
O"Œõê¢S^y“ŒE^Ü6OÑ´^ Verilog "
J[/Œ(virtual address): „§S/Œ(program address)"
J[;ì(virtual memory): ˜«$1A^§Sª§ØI‡¢S
þý‰§S@gCI‡Ü;짴§SgC¿Ø«O"
²LSü4Á㖯¿Øý3;ìÜ©ž§—öŠXÚN^"ö
ŠXÚéÑI‡;죓è½ê⤧?U/ŒN4A^§SŒ±
é§, l—Ö¯-?­#‰1A^§S"Œ.öŠX
Ú£UNIX ƒa½öy“ Windows¤o´¦^J[;ì"
VMS: DEC  VAX .ÅmuöŠXÚ"

void: ˜‡4 C §Sw˜ßêâa.§L«vkŒ^Š"

´Cvolatile: C ½®?Šó(²êâá5"˜‡´CCþ@
«Ù1Ø”;ìCþ£=¿Ø´{üˆ£þg?Š¤"X
Jvkù‡á5§`zìŒU¬@vk7‡­#Ö˜‡Š¶eTCþ
“L´\3uÿ;ìN I/O /Œ§ù‰Ò† "
VPE: 3 MIPS MT £õ‚§¤¥§˜‡ VPE ¹˜‡½õ‡ TC £3Ù
¥$1§S¤¿ Jø˜| CP0 MìÚÙ§] §¦wþÒ
”´˜‡ MIPS32/64 oN CPU"
J[Ò VPN (virtual page number): §S£J[¤/Œ?1=†
Ü©"§S/Œ$ £=S/Œ§Ï~ 4 KB¤Ø^UC†D4
‰Ôn/Œ"
VxWorks: ˜‡3i\ªA^¥¢žöŠXÚSاdºàúi(Wind
River System, Inc)muڝÈ"

WatchHi!WatchLo Mì(WatchHi, WatchLo registers): ¢yê


â* :?nì 0 Mì§R4000 º‚ CPU þÑk"
* :(watchpoint): NÁìJø˜‡A5§–¯‰½/ŒžŒ±6
Ê3$1§S¿ò››D4£^r"NEC  Vr4300 CPU PkÙ¥
ƒ˜"
wbflush: ˜‡~§/÷IO¶§T~§/÷( u Àè¤k
ܱÏlm CPU "
Whitechapel: Q²á6,å˜[ u=I UNIX óŠÕúi§1987
cñÑ 1˜ MIPS S¡OŽÅ"
417
MIPS âŠL
óŠÕ(workstation): ùp$1 UNIX ƒaöŠXÚS¡OŽÅ"
£7(wraparound): k ;ìXÚ£) l MIPS p„ ¤
k‡5Ÿ§–¯‡Ñ;ìŒ/ŒžÒ{ü£å©/Œm©–¯"
 Àì(write buffer): ˜‡ CPU ±Ï/ŒÚêâ FIFO
;ü£Ï~Œˆo‡¤"3;ìXÚ?nöŠL§¥§CPU Œ
±UY‰1"æ^ßp„ ž§ ÀìAOk"
£p„ (write-back cache): „ cache, write-back "
ßp„ (write-through cache): „ cache, write-through "
XContext Mì(XContext register): † TLB £;ì+nM‡¤k
'?nì 0 Mì"3 64 όJ[;«æ^AÏ|„
LXÚþ§Jø˜«?n TLB ™·¥¯„{"
"Mì(zero register): CPU Mì $0§Ù^{4AϵØ+\Ÿ
oŠ§o´ˆ£"Š"

418
ë]
ëÖÚë©Ù
Cohen,D. “On Holy Wars and a Plea for Peace.” USC/ISI IEN 137, April 1,
þl Wikipedia (www.wikipedia.org)¥u¢“—à(endianness)”Ò
1980.
ŒéTØ©"
Heinrich, J MIPS R4000 User’s Manual. Englewood Cliffs, NJ: Prentice
Hall, 1993
NX(²;¶SNš~[§[kžéJ餇
MIPS III
&E"ӞTÖl˜‡ƒî‚ݧ==ùã@ 3 MIPS NX(
¥ýÏ^+§ ŽÑ äN¢yƒ'Ü©"3ÖŠž§TÖ
± PDF ‚ªJøe1"£ë„e¡Ñþ] ¤
Hennessy, J. and D. Patterson. Computer Architecture: A Quantitative
Approach. 3rd edition. San Franciso: Morgan Kaufmann, 2002.
3 MIPS A½+ƒ §ù´˜˜ŠPk'uy“OŽÅN
X(Ö"§˜ØvÒ´þ §´þkdŠ"éuÄVg
ùãP‡E,؆§Œ±'Ünd‚<ÃÖ¶´XJ\ú
1n‡d‚„ŽÜn{§\¬uyT‡¥#SN(¢Ôk¤Š"
3\ ïƒc§u˜e´ÄÑ Y‡"
Kernighan,B. and D. Richie The C Programming Language. 2nd edition.
XJ\Žé C Šó )õ§
Englewood Cliffs, NJ: Prentice Hall, 1988.
@oØUvkÖ"y3\NATï# ANSI ‡ §¢Ã´Ö
k:þ"
Love, R. Linux Kernel Development. Carmel, IN: Sams Publishing, 2003.
k' Linux SØp?H˜ÜŸÌ·¥!éÐÖ§ØØ´Äk
“èь±ÖÖ"Öõu)º˜‡¯œŸo@‰ Ø´ù
‰"
419
ë]
Rosenberg, J. How Debuggers Work: Algorithms, Data Structures, and Ar-
chitecture. New York; John Wesley & Sons, 1996.
ؚ\3muNÁóä§ÄK\ŒUØI‡n)TÖ¥ò@o[
§Ý§Ø+N§TÖU Ï\\k¦^\¤PkNÁóä"
Sweazey,P. and A.J.Smith. “A class of Compatible Cache- Consistency
Protocols and Their Support by the IEEE Future Bus.” Proceedings of
the 13th International Symposium on Computer Architecture, 1986

Tanenbaum, A. and A.S.Woodhull. Operating Systems Design and Im-


plementation. 3rd edition. Englewood Cliffs, NJ: Prentice Hall, 2006.
T֊öŠXÚ\€Öé؆"Ö¥£ã Minix öŠXÚäk­‡
{¤¿Â§£Ù@χ¤ Linux )Jø ÐÄå"
þ]
e¡‰Ñ URL 3Öчž²u(@k§´†?Ûk' Web 
<M&E˜§SNkŒUCz"XJ\Ã{–¯,‡Œ§^\U|¢
ڙé˜eTŒ´Ä®²‚[ §„Au˜eglÖч±5#
'u MIPS Ú Linux &E "
MIPS NX(®²Ñ5éžm §lþNU éÙ§˜ k^
ÖÔ"
Advanced Micro Device (AMD): www.amd.com Œk'ul Au1000  Au1550
 MIPS ?nì&E§3 AMD  ƒcÐ´ Alchemy Semicon-
ductor O ù ?nì"l Google þ|¢ alchemy site:amd.com é
ÑÜ·"
Broadcom Corporation: www.broadcom.com Œk'u Sibyte 3 Broad-
com  ƒcO BCM X MIPS ?nì&E"l Google þ|
¢“communications processors” site:broadcom.com Œ±éƒA
¡"
GNU C Compiler Œ3 gcc.gnu.org"3 gcc.gnu.org/onlinedocs Pk
c‡ÚP‡3‚Ãþ"
Linux MIPS port: KITóŠ|‘oÕ3 www.linux-mips.org"T
Õ:o´Jø# “è Linux SØ3 MIPS þ£‡"d §„k˜
Ù§k'£‡ÚïSØ|±9Ï&E"TÕ:„Œ±Ï\éÑk
'?nì!XÚ!óäóõ&E§k Ü©Jø {¤Úµ&
E"
420
ë]
MIPS Technologies: MIPS NX(io<§ÏL•Ù§‚ûuÙ CPU Ø
Ç5*)§ÙŒ3 www.mips.com"\Œ±3@puyNõ† MIPS
k'úië"
PMC-Sierra Inc.: u www.pmc-sierra.com Õþk'u PMC-SIERRA
 MIPS &E§)Nõ5d QED úiO?nì§ ö
PMC-Sierra o¿"

The Linux Devices Web site: TÕ: u www.linuxdevices.com§2Jø


k'3i\ªXÚ¥¦^ Linux #ªÚ&E"
The Linux Kernel Archives: ù SN u www.kernel.org"lùpoŒ±e
1#‡ Linux SØ “è£ ´3k£‡ˆ«NX(§T
Õ:ÑJøÑÖ¤"C‡Ï~3ùp§XJ#‡„v
k£‡\M‡þž§ù ‡Ò^þ "

421
ÈöÖ¢
ùpéÖ¥™J½™[)º§3Ö?Èì)¤®?Ñў
ŒU‘† PIC k'®?«§‰˜{ü)º"ù «¶i˜„± .cp
mÞ§cp “L context pointer(þe©§½È¸‘)§Ï‚Œ±n)
Ò´·‚ÙG gp"
.cpload Ú .cprestore
T« ˜‡Mì£Ï~ t9 = $25¤ë꧘„ u¼êÄܧ
u .set noreorder Š^S"§«®?ì§uxA^-ŠâëêMì
Š\1 GOT LČ gp"k' GOT SN§žë 16.2 !"
.cpload reg «˜„‡˜3¼êÄܧÐmXeµ
lui gp, _gp_disp
addui gp, gp, _gp_disp
addu gp, gp, reg

Ù¥ _gp_disp “Ll¼ê\: GOT L\:ƒm £þ§´˜‡


3?ȞÒU(½Š"reg U콘„ t9§3¼êN^c§dN^¼
êW\¼ê/Œ§, ÏL˜^ jalr reg-N^"ù3¼ê\
:§reg ŠÒ´¼ê\/Œ§\þ GOT \ £þ§\ gp§Bò
GOT L\/Œx\ gp"
.cprestore offset «®?ìòc gp uÒþål sp £
offset  ˜§=)¤µ
sw gp, offset(sp)

Ӟ3z‡‘ a=N^-£= jal§5¿Ø´ bal§ öáu©|N^¤ˆ


£ ¡E gp Š§=)¤µ
lw gp, offset(sp)

-"

422
ÈöÖ¢
.gpword Ú .cpadd
ùü^®?«˜åŒ±)¤˜‡ ˜Ã'a=L"d .gpword Mï
/ŒL\Œ±^ .cpp \þ gp ($1/Œ"
.gpword local_symbol

aqu .word§´ó Š local_symbol  cp  £þ"


.cpadd reg

ò gp Š\Mì reg þ"


.cpsetup Ú .cpreturn
ùü‡^u 64 §©OƒAu 32 PIC  .cpload Ú .cprestore"
.cpsetup reg, reg2/offset, label

Ðmµ
sd gp, offset(sp)
lui gp, %hi(%gp_rel(label))
daddiu gp, gp, %lo(%gp_rel(label))
daddu gp, gp, reg

U콧reg=t9, label ¼ê\IÒ"


.cpreturn

Ðm ¤µ
ld gp, offset(sp)

Ù¥ offset Ò´þ˜‡ .cpsetup ¥ offset "

423
éÖµd
ŒõêNX(¡Ö§ Ñ Øõ´ 1‡Ø=é1˜‡Š ¦”.
TNX(®?Šó˜[ q„¡ #§ ò¶ RISC NX(——MIPS
——Ú   ¶  m ˜ è ö Š X Ú——Linux
¡Û"5 See MIPS Run6´˜‡ÑÚ‡~§A
Š¤kù˜aÖŠö˜‡’"Dominic ——(Ü å5"Ö1˜Ü©l MIPS O
Sweetman Jø éuNX(ëÖ5`7‡ Km©§, 0 MIPS -8Ú?§] "
[!§é[!Lão´É ÑNþ'  Ö± MIPS32/64 ŠÄOéNX(¤kÙ
NX(A5£9Ù59ó¤"(JEÒ ù §‡?1 '"
4°ç¿ 5k›'uNX(äNÒ´ †1˜‡ƒ'˜‡­ŒCz§Ò´˜è
MIPS ֧Ӟ˜ß/² 'ß?NX(u ‹3f¨ Œ þ§ÏÖ± Linux Sؓè
Ј«Eâ!²L!{¤!$–£σ"1 Šý¢. öŠXÚ~f§¿ Ы N
‡¥­‡Ö¿Ò´'uöŠXÚ!^‡£‡Ú 3 MIPS NX(JøÄ:þï Linux ——
ABI SN§ù Ö¿¦TÖ¤^‡mu< )ü?nìÚé¡õ?nì‡"ÖlöŠXÚ
`DëÖ"?Û3 MIPS NX(þóŠ< . ——¥ä!;ì/Œ=†——m©§˜
ѬWuÂõÖ" †ù Linux/MIPS A^§S“è\1?S!†
¥¼êó¿ $1‡L§"
——Randy Allen, Catalytic M©<ÚEâ
oi
• éu Linux 3ý¢M‡þ$1‰ Z

Öéu?Û MIPS NX(ëÃþÑ ù)"


´˜4Ð@Ö"[«1˜‡DÚ§1‡ • éu MIPS -8Jø ˜‡!¡!
E,r­:˜3ÏLäN~f²^M‡þ" #!¿ ´u¦^"
d §1‡á Cl MIPS-I/V NX(•
• UY± ¦Ö1˜‡4äŒÖ5Ú
MIPS32/64 NX(LÞk'SN§)
NX(¡éõ‚§|±"{ óƒ§Ö´ <\‘Šº‚§‡N Šö‡L 20 c
?Ûî‹ MIPS NX(§S ˜Ü7Ö 3Äu MIPS NX(XÚþO²
ƒŠ" "
——Jan-Willem van de Waerlt, Fellow
ŒNúi
Embedded System Programming,
Philips Semiconductor Computer Architecture, Advanced Computing

424

You might also like