Professional Documents
Culture Documents
w MIPS ——
LinuxNX(¿Û
£1¤
MIPS
£dAù¤Í
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<@§´«[/"ku
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ükCÄ"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§9HÖöJÑB¿"s1µ!
¿ÚïƧuxÈö£jqu@softprise.com¤"
Èö
2007 c 12 31 F
ii
8¹
Èö`² i
S xiii
có xv
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 6Y5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
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 #|^±Kp Ç . . . . . . . . . . . . . . . . 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 7 Ù 2:|± 131
7.1 k'2:êÄVg . . . . . . . . . . . . . . . . . . . . . . . . 131
7.2 IEEE 754 IO9Ù{¤µ . . . . . . . . . . . . . . . . . . . . . 132
7.3 IEEE 2:ê;ª . . . . . . . . . . . . . . . . . . . . . . . 133
7.3.1 IEEE êÚ5z . . . . . . . . . . . . . . . . . . . . . 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 ÑI2: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
vii
8¹ 8¹
8.5.12ÖMMì . . . . . . . . . . . . . . . . . . . . . . . 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
viii
8¹ 8¹
10.2.5£5ÚàÃ'è . . . . . . . . . . . . . . . . . 258
10.2.6 àÚ 5êâ . . . . . . . . . . . . . . . . . . . . . . . 259
10.3 p 55¯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
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 Ù ^MNÓó 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
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?ÈìÚ
¦^6Y1-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
u3 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!õ§#;^*Чéu261
Linux öXÚ3 MIPS NX(þ¢y éÐ?n"Ø MIPS NX
(5 §5See MIPS Run 61'u MIPS NX(cuÐ]
´#¶=¦) MIPS NX(53S§TÖE,´¤k]¥äÖ
5"
·F"\U Ú·úÖÖQkd!qk"
Michael Uhler
Chief Technology Officer, MIPS Technologies, Inc
Mountain View, CA
May 2006
xiv
có
ùÖùã´ 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´dA{ 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.Zo^"·F
" Linux ;[U ·é Linux [!ç´JkŬùãe3
ý¢MNX(þ$1ý¢öXÚ§NUN§L"
MIPS ´« RISCµRISC ´k^ ¶c§·^u 1980 c¢y
p6Y u²|NX(ÓA5"CISC ùcÒk ¹ "·
ùp3dÂþ¦^ùc§^53 x86 ÚÙ§ 1982 ccNX(¥uy
A5§OÌÄ´^è¢y"
k ÖöUé µ¦3· NX(ÚäN¢yv"´¦+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 MOó§Û%XÚa¯K"\öX
xv
có
ÚUùX ·ùpùãNõ[!¶kNõ`D§S @ C óv
C. §k£5Ð?§'uNX([!£Ã';"´k
ÿ\(IeM¥—— <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ÙT51"·{¡
“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ж·1gù
,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#
NE MIPS CPU k«ØÓ§Ý2:|±M§lvkÜ©¢
yk?"·r2:õUüÕ©m§3 ¡1 7 Ù"
ù:§zÙÑìÜngSÅÚ0 MIPS" ¡AÙU
C §ëÃþ§½öÄu~fÆS§"
1 8 Ù§·¡Åì-8¶Áã3O(Óq'IO
xvi
có
MIPS ëÃþ{õ——·^ 10 50 3O?s zõ
SN" 1 9 Ù{0 XÛÖÚÖ®?ó§ Øþ®?
1
ó?§Ãþ"
1 10 Ù´@ ØØ3O CPU Ú MIPS CPU m£^<Jø
k'£¯KAL§Ó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Ö(§\±wc®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 ¸¥Lo"<a´éõuo
(í2§ùجku\Æ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
có
/"Linux ¤ i\ª MIPS ^õöXÚ§´3i\ª½|E,¥
yõzÛ¡"MIPS 57X 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« C óèÚ8?ê"
• ù«iNL«M&Ò¶i"
ÖÌKX·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
có
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 )rKwÑ5"3¿÷¿½|þ§==°|
O¿ØUyØP§´ MIPS ?nì%~~UÏL±O
{z3z?nìEâuХѩ5UZ1"
é{üOéu MIPS OÅXÚúi5`5`Ñu«ûI§
Túi´ 1985 clÆâïÄ8¥©lÑ5;l¯EÚÈ¡"
(JTNX(3£y3U,¤ ó.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 cmݽ|#. 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
öó"
ù äkmM58Ù¥Ò´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(é§|^Ø §Ù¢
6YEâ5±|^¿©§cÙ´Ú 1980 cNOEâ
(Ü"
1.1 6Y
lc3==Ü p§k[¶ Evie <mñ¿~Ú¿
Ú¡A"3Ap¡§z ï Ô£Ï~´¿û~§¿Ú¡§ Î
µ§ Ú ¤Iküè§, XfC÷ e5?ê"
1
XJò§Sw¤´S¥;æ-{§O$1§Swå5Ú
üèÑÖvoq?"´XJl CPU Ý5w§¹ÒØ
"CPU lS¥Ñ^-§?1Èè§éIöê§1A
ö§ )(J——, 2gEÓó"1§SÒ
´-觧g6L CPU"
duz^-ØÓó§Ï 3 CPU SÜ®²k«ØÓ;^
Ü6¬§¤±E6Y¿vk CPU O\õE,ݶ´4
1 =ÖöØ7ÄÙ¥©¹Â"[Èö5] εÏ~Úcüöå¯"
2 få5·aú¨fд3wOÅÆÖ"
2
1.1. 6Y 1 1 Ù MIPS Ú RISC NX(
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 cO CDC6600§ù
«gØ61"ù®²k:lKOÅNX({¤þ §éda,Öö±ë
Hennessy & Patterson 1996 "
3
1.2. MIPS Ê?6Y 1 1 Ù MIPS Ú RISC NX(
Ò´6(AY¡6Y ——pipeline bubble)"
¿¤k6Ñk¯K"Frank o´Ú Fred ï Ô§¦
3 Fred ¡Ò1——XJ Fred ï ¿Ú¡§@ Frank ¿Ú¡"
´U üØæ§Ò±p6Y"ùé Evie 5`
Ø´1{§Ï¨I3ù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 "
¤±k6Y6u,«U òõêS¯ÝJp 50
Eâ——¦^p £~{¡ ¤"p ´«±pN
þÛÜ;ì§Ù¥XSêâ"zêâüÑ Ù3S
¥/£=p I\¤" CPU IêâÿÄkép §X
Jé^êâÒ±¯x£"ÏÃ{ßÿ CPU eÚIoê
â§p ´ CPU C^Lêâ¶kõêâlS§
¥ êâI¿ï±BCÑm"
=¦{üp U3 90% ±þmJø CPU ¤^Iê
⧤±6YO==I3Ñ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?Ûö
ÌÓ6YS"ª(JÒ´§±p ·¥§ CPU ÒU3
z¨±Ï¤^-"
·éìã 1.2§?Øez6Yãu)¯"
• IF (insturction fetch)§l-p £I-cache ¤¼e^-
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´«Ø)"
8
1.4. LÚy3 MIPS ¡ 1 1 Ù MIPS Ú RISC NX(
§CMOS Ü6Ø´¯§´ù:±Ñ—— Intel ùúi
½é¯Ò¬?1A7Ý]" ¦@ CMOS 3®²éÐ
¡kJpm——3½7¡¡Èþ8¤õÜ6!3½õÇ
e¢ypm'ªÇ"
, Oöúé CPU 5`JpÝ´õo½§¦Ñ(Ø`p
à?nìÐæ^ ECL ¡§Ò@ ®²3.ÅÚ?OÅ CPU æ
^@"{ü ECL Ü6ݯ§3¡mux&ÒÝ´¯
õ"´§ü¡þ8¤Ü6êþ§ $1u9þ"
uùü«Eâg¡ØÓ¯K]Ô§éJýÿ= ò
Ñ"Bipolar Integrated Techonlogy(BIT)úi´ ECL |±ö"1988c§m©
¡ R6000 MIPS CPU ó"T8<%Çǧ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ö¨ T8"R6000 8q¯Kö
ò§ªö R4000 ¡ µR4000 ´1|^p8¤Ýrp £
¡þ# CMOS ¡§±,«å»Jp ¨Ý"
BiCMOS CPU ¿vkX BIT 4 kµAc §¶ Expo-
nential Technology úi ÿ}Á§3 1996 cc Ñ PowerPC
BiCMOS ¢y§Ù¨ªÇL 500 îâ§ù3-<8w",
Ú BIT §TúiÏEâÚÜÓ¡V òªr4"
3¡§VÑkØ" §L Acm§¡þp
Eââ¤p¨Ý7Ø^"¨Êúij± CMOS Eâ
Ú£¤ Üp §gCé MIPS NX( Precision mu"¨
ʪòÙ¨ªÇJp 120 îâm——´¯ R3000 n——¿
vkæ^ ECL ½ö BiCMOS "¨ÊgCgCr§rù1?nì^gC
óÕþ"Túi@ù½|Ðd«â»5{§\þU «ÉpÚ
êµCEâ±9[pXÚ?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 Ö6urU 3éám——áu^/½0¤
Im——SòOÝ\)"¦+rJøòXÚ8¤ü
¡þ{~káÚå§ASIC û?nвïµNQU3±
O±Ï3r±cÏ"SÓ§qU·AÃ{£;OE,Ý
O\º
ASIC 1Y´±Ø/ªJøk^õUÜ——'X
MIPS ?nì"ØÒ´y¤µC ¤k7SÜ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¡So8¤å"
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·
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 é¯Ò
¤õ"§#£{üÊ?6YO¿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 ¯"
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ì
3Ùm©ÞAc§QED X{ÑÈ£úi$1§
NúiugC?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 ¢y8§æ^Ú
R4600 Ó{pº"Ø3´§Úd3¿rÖ\¡
(J§4¦À³ ÞM§(JT¬Ñvk?\½|"3ùg
PowerPC {á?-9 §QED #£5îÞu MIPS NX("
15
1.4. LÚy3 MIPS ¡ 1 1 Ù MIPS Ú RISC NX(
C«rNOU姹õ 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Ù$§5gr¾ü®O»´+¶ 2002 c1uygC?3
ìew¥"k úi½3ØcSO» p©"
5O³Ø;K PMC-Sierra Ú Broadcom ´ÄkUå
UY1¦5é QED Ú SiByte ?nìOOy"ù®²Ø1´a
¯K¶XNõ¤Ù¬Èb~{ÒXÓÂËþ%eY%@
äY§ù úi$ëé·ÔÑC4Ý(J"
Alchemy Semiconductor aÉ ìC»º"¦+ÙOõÑ$
-<Ä%§TúiJ±é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¤ 1e
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ó²§ù¤Lz{"
XJ\r^7¡¡ÈÑWþÜ6±Or¡Uå§OÚÿÁ¤ò
±Z{5O"
£¤§z«¡¬)·±ÏSIñÑAz¡" RM9000x2
½ö Broadcom 1250 zUñÑA½öAµùêþ
Ø "y3ØÙ5=«a.U áÚv 1þl ½
i\ª CPU OJø]7"
Intrinsity: ò MIPS ?nìí? 2 GHz
1.4.9 8U
8U3^ MIPS CPU Ì3±eoaµ
• SoC Ø:MIPS CPU 83ºÝÚõÑ¡ÉÃud"48{ü
O"PkÏ{¤§H9lñ?OÅNX(é
u;$à½NX( ó´4äáÚåOY"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
3z8¤Ý¡Ð§!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 -8C["ù 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Ú´UK4"(J´u9!ØÐ^§
´zîâ5UÃ'["
1998 QED R7000- 16K+16K+256K L2 1Pk¡þ?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õû½·ÜuN´Ú
¯/¢yp5U"
1.5.1 MIPS -8
• ¤k-ÝÑ´ 32 : ù¿Xvk-U =Ó^üni!S
m£Ï MIPS ?©';. 680x0 ½ 80x86 z©
n¤§vk-±Loi!"
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: U3A6YãâU1?Ö§¿
7L3¨±ÏS¤"~X§Mì£ãUk\M
ì槤±-U?UMì"
ê¦Ø´Ø½"-§´ØU3¨±ÏS¤"MIPS
CPU DÚ{´uxù öÕá6Yü§ù·±
2`"
• nöê-: ê/Ü6-ØI½S/§¤±Ñ ¿v
- ±½ÂüÕá öêÚ8öê"?ÈìUn
öê-§Ù `z§Sm5`z?nE,Lªè"
• 32 Mì: MìêþÀJÌ´d^I¦°Ä§3yNX
(¥| 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 -8AÒ´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´Ä©|û½7L36Y
±ÏSѶTNX(ÏL±©|ûüÿÁ^{ükÏu¢y
ù:"¤± MIPS ^©|ÿÁüMìÎÒ/"½öé
Mì´Ä"
1.5.2 ÏÚ
• ¯SUÏL{üMì\1Ú;: éSCþ?1â$¬
Ï6Y§¤±Øùo"zgS¯ÑÑ^wª\1½;
-"Mìæ¦ù:¢Svkfþ@oæ"
• k«êâϪ: A¤k\1Ú;ÑÏLüMìÄ\
þ 16 ~ê £þ£2:-±¦^kMì\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¤(¢¹kAAÏ-±{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
ã 1.3: 6YÚ©|ò´
ò´©|: MIPS CPU 6Y(£ã 1.2¤¿Xa=/©|
-1ã)#§SOêì§3a=- -®²m
© "TNX(¿Ø´¿ïùÜ©kd3^åó§ ´¦;©
| -o´3©|8I-c1";©|- -
¡©|ò´ø"
´MvkAÏ?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(
3ee6YøÑ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´Ï~kU
Ï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"ÖökUØÙGÄ£ã§éÙVg¿Ø
))"XJ\mLÃÄ C§Ò¬uyØ+T´cÓ°Ä´ Ӱħ
o´h 3m§lÜì 3"3ùp§¦+äN¢y£=Óf°Ä¤
ØÓ§NX(£== 3=>¤%k¿±Ó"
,§XJ\´ú´.åmçĴU 3w´¡þp1
¨§ù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 ¥^uk 32 Ï^Mì
CPU f8"/MIPS32 Ú MIPS64 NX(50`å5§·e¡{
¡“MIPS32/64”"
õêE MIPS CPU úiy3ÑoNù 5——@ ØUîoN
úi3¦þ 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”¤-——
´l5vkEL MIPS V CPU "٥ܩ-±/¤éü°Ý0
ªÀÜ©#Ñy3 MIPS 64 ¥"
MIPS32, MIPS64: 1998 cl SGI ©lÑ5 MIPS Eúi½I
O"TIO1g) ¡?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 51"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^§S3®?ó gþ¤wÀÜ"ù
¿X CPU ~óL§´"
¡Ù§·ò0 ¡§)Ûõ3p öXÚ ¡-<
? Ü[!——CPU Mì!¥ä!g!p öÚS+n"
·¬òù ?Ö©)¤ ¡ä50 "
CPU 3^r?þoN5~~'³¤kA5oN5Ðõ"®
¤k MIPS CPU ѱ$1 MIPS I ^r?è"
-8*Ð5z——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
Sk Ñ5" MIPS32/64 á ٥ -§Ó#N± ASE
£;^-8*Ф/ªJø 5"ASE ´é MIPS32/64 À*Ч
XJk{§Ù3±«IOªÏLMì5I£"y3®²k
õ*е
• MIPS16e:T*Ð3 MIPS32 Ú MIPS úicÒ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®
? gJ±ùÙ§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
C5O"êÚ 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"
28
2.2. Mì 1 2 Ù MIPS NX(
ì¶iN Ù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§[£""
ù´kn§Ï;N^- ¡e^-´N^-ò´
ø——P4§Uì5½T-7L3©|8I-c1"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ì"3Mì¥k
ª ±4y CPU [P1"
2.2.1 Ï^MìS.·¶Ú^{
·®²s A£ã NX(¡SN§e¡50 ^
¡SN"·ú\y3k7 )ù "
¦+MAvk¦^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: ^5f§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ì¥kUf§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þ¶If§S±^5v
(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ì^5oTL"ë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£li!±S¤Ûêâ3 gp «S§X
J´§Ò4óìuÑ´w"
• sp: æÒþe£ÄIwªÏ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±^v5P¹/læÒ¹"ù
«¹´kU§AO´§S9$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ØKN^
¼ê§ØK?Ûi@¼êN^"
• ra: 3?Ûf§S\?§ra Mì¥X£/——Ïd;.
f§Sѱ^ jr ra -("nØþù§ùp±¦^?¿Mì§
´ E, CPU Ïæ^`zE|£©|ýÿ¤§¦^ jr ra
J¬Ð"
gN^Of§S§S§7LÄk ra §Ï~æÒ
þ"
é2:MìkAIO§·ò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 isy 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½öÜ©6Yz¦{ü——Ò´`§±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)
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)
ÐmüëYMì\1µ
lwc1 $f2, 24(t1)
lwc1 $f3, 28(t1)
Sþ)¤Ü¤-"
®?ìJøÏ)±e¡µ
• 32 á=ê\1µ\±\1?Û()3óOS
/)觮?ìò¬rÙ m¤ü-§©O\1ùêâ
pÜ©Ú$Ü©"
• lS/\1µ\±\173SCþè"®?ìÏ~
¬òùO¤ü^-§k´^rCþ/p \1Mì
-§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Ó^li!½mCþ¤ÀJ Cþ§¿ò§å
3 64K i!±SS«", $1XÚЩzM
ì——S.þ^ $28 Ò´ gp ——5TS«¥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
Ñ1Mì¥"
• Ûõ©|ò´øµ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 "e2¦^ ISA CN
4
ùÐ'K¯\wvwL>K5ª(ö I6§¯¢þl5vk>K@¶i"Òë
4
õ¥516Q5õ¥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 cQ²k¤£
Þ§#¢y 32 MIPS CPU ÀJ Ñy"
X·c¡£ãL§ØÓ ISA üC½Â ASN¶½Â 3
ÉoöXÚ¥^r§S^Ü-——)2:$-3S" 5
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
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%:\¬²xoù"
kw ÄK"3 MIPS CPU p§\3§S¥/ýجÚ
¡Ôn/Ó£kCz駿ØÓ¤"·©O¡§S/ Ú 7
Ôn/"
MIPS CPU ±$13ü«A?þµ^rªÚØ%ª "{ 8
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): rp "ù /Ò¬
=¤Ôn/§NëY$à 512M Ôn/"Ïù«=4
{ü§~~¡ùã//=/«§Ù¢Ø,"
T«/Ao´ÏLp 5§¤±3p ·Ð©
zc§ØU¦^"ù«3à MMU XÚ¥^5õê§SÚ
êâ¶3k MMU XÚ¥^5öXÚØ%"
kseg1 0xA000 0000 - 0xBFFF FFFF(512M): ù /ÏLrpn "
{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ì"XJMO< JÆrù ÀÜNÔnS$
512M m §\!{¦"
<"
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´ÏLMì\þ 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©"
Äk5¿´ 64 ;ìN´¹3 32 Np¡"ù´Û%
E|——Ò5Dr. Who6¥ TARDIS§p¡' ¡õ—— 6
u·3 2.7.3 !5K5¢yµ[ 32 -8ÿ§Mì´
32 64 ÎÜ*Ð"ù(JÒ´§32 §S± 64 §Sm
$Úp 2 GB"¤±*ÐNr/m$Úp«©Ú 32
e^å§*Ð/m uùüöm"
*Ð^rÚ+n/m3¢SA^¥ØUk^?§
Ø\3¢yJ[;öXÚ¶ÏdNõ MIPS64 ^rE,r
½Â 32 8I/"@ ¬ÃI/=ÔnSI±^u
Ñ kseg0 Ú kseg1 512M §´±ÏLé;ì+nü£ TLB
¤?§5ÓJ"
43
2.9. 6Y5 1 2 Ù MIPS NX(
ã 2.2: 64 ;ìN
2.9 6Y5
?Ûk6Y CPU Méß@ ØU÷vÏ5
KöÑò¬3mò´"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 6YA:´§r?Ö
§S ½ö?ÈìKI"e¡A:o( 'u6YJ/µ
• ©|ò´µ3¤k MIPS CPU p§;X©|- -£=©|ò
´ø¥-¤=¦a=¤õ¬1"§S ½ö?ÈìAéÑ^
k^½ö´Ã³-W¿ò´ø—— /´Wþ nop "
´§Ø²(½§Òë®?ì¬Ûõ©|ò´"
3 MIPS II -8¥ÀÚ\/U©|(branch-likely)0
-¥§ò´ø¥-=3©|ɹe1¶^T-
/ë 8.5.4 !"
44
2.9. 6Y5 1 2 Ù MIPS NX(
• \1ò´µ·Øå5k?Û MIPS CPU Ù¥;3\1 -
U vkò´/¦^ff\1êâ" 10
[ØI2ú%ù«¹ "
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 §\UWu´u
É"·e¡Ò´ù"´30 c·k7k )e¢yù
A5úÅ"3>9Ö YnÙSNc§ïÆÖökc[Ö
Ù1Ü©¶AO5¿e0 ?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>§ØU2B/ ¯§ù
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ض¿ØKA
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ì§Ù m7L£â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:-Ó§y3(
GMì-?1?èIO &ýéج¢y2:ÿâU¦
{"ù=¦GMì½Â3ØÓ ^"CP2 ´^§ó^u½
MIPS ¢ymu) Cz§ ISA *нö3A SoC A^¥J
±yÓ®?§SU3Czc ø;^Mì" CP1 Ò´2:ü
ü« CPU þ^" g"
=^u OS ?n 0 õUk
¿/l MIPS ISA lm5"3 MIPS
·¬3Ù Ü©o(¤k3 MIPS32/64 CPU ¥UéÀÜ"
´64·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½¢yzMì§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±6aL@!"
·ù 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ÿ§lK
fMì?ÒlU¥äÏ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 (Ì´@ k5 ½öõ
§*Ð CPU¤ ll(load-linked)
-'/¶/\ ´§,k
ä^â¬Ö§"ë1 8.5.2 !"
HWREna 7.0 ã§û½= MMì±
^r§S¯——ë1 8.5.12 !"
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 IOkK姴éù Mì·¶´kØ
Ó"Öò¦^L 3.1 ¥ÏPÎ"
l CP0 Mì¥Ñêâµ
mfc0 d, <n> # l?nì 0 Ñêâ
Ï^Mì d C\ CPU Mì n "ù´wMì
{£aqk 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§ScA?Òü$ §êþÒ¬Ï
A? ·gÉ~¶,¡§XJ3ü$A?ck£
^rè§@o¿ÃA§SÒkUŬ±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ìkAUIk§ÄKØ õ
¯"ÚsMó§ûþ§(@ CPU ÚXÚéuMì
¤§±éÄ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?Û¹eSöXÚPkAÉ
~?n§SØUb½^r?è(5——AO/§§ØUb½Ò
k½öÒm^"
\I^ k0 Ú k1 ¥5É~?n§Sý3 S
m", Ò±Àܧ7±^,5lMì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 Ü¿
¤ £^rmÚE SR(EXL) õU"
• ¥äµSR ^5N¥äùè§û½= £XJk{¤¥äD'c
p`k?"MvkJø¥ä`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@ÖÑ
"§\vko³?£,\ ½´"½öÙ§äN"
¬Ñ¤", 3IP
ù!ùã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 r5½Ñ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©OL?nì 3–0 “?nì¦U”"?nì 1 ´2:?
nü FPU —— 1 Lk2:?nì¿ ¦^§ 0 KL
B FPU" 0 ÿ§¤k FPU -ѬÉ~"vk2:M
r§ 1 w,Ø1¶k2:M£ 0¤'K2:ÜU¬
k^" 2
oÐÐ2:Ü'KQºk öXÚé¤k#?ÖB2:-¶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زxo¿gë 10.2 !)"du<o´é§y3
MIPS ¢y©¤ ü.µDEC Ú Windows NT ´à¶SGI Ú§
UNIX .´à"i\ªA^Ðwruà§
y3®².· "
U$15g,/.0^éuöXÚ¬´k^A5¶RE
¦ù¤U" RE k§^r^$1å5ÒÐ CPU ´
à", §ýª/.0$1I^þ
éãå§8cvk<L"
MX ¦U DSP ½ö MDMX ASE£-8¤——Ó CPU ØUüöÑk"
3Ö§DSP ASE #§ MDMX q"yóäóÚ¥m
|±"
PX ëe¡é SR(UX) £ã"
53
3.3. CPU Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?nì
SR(SR)3ME £¤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"§S1é 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 Ãþ© rTP1üüÕ §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¶ vkMì^§Òv{m©Mì"
54
3.3. CPU Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?nì
{øù(¸§é SR(ERL) D «AÏ?Ö§ Ù §
Ò¬ÝK?nì1¶é~^rm=/¤k¯Ñ
ò§l 0 0x7FFF.FFFF §S/C¤ NÓÔn/
Øp I"8´4p ØÉ~?n§S±^
zero Mì5ħ^Ä+ £þª5¯, £döXÚ
dý3¤Ø²Lp Sm§±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"@oo 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 úi4 R4000 À d£A"
DEC ò5óÕ CPU"¿ö´ ·é~¦ùnd¶·úù
DEC úiSÜmu 5uФ Al- õ´du0 "Eâ¯
pha NX( CPU§@´l ¡ K´ë4§Ù ùX´
`þ5¶R4000 ¡' Alpha DEC gC?nìmu¿
@ 18 " ã"DEC @gC?nìmu
Ø+ÀJo 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 ±5AlCz"
57
3.3. CPU Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?nì
L 3.2: ExcCodeµÉ~ØÓa.
ExcCode ÏPÎ £ã
0 Int ¥ä
1 Mod ;ö§T3 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Ø£½öÖê⤵ ÜMuÑ ,«Ñ&Ò¶
7 DBE äNTNoXÚ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 - 35*Ц^
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£ã"kMì
§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 "
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à"
0 MIPS32
1 MIPS64 -8´ MIPS32 /mN
2 MIPS64 -8/m
AR NX(Òµ
0 MIPS32/MIPS64 1
1 MIPS32/MIPS64 1
0 vk£None¤
1 MIPS32/64 IO TLB
2 BAT a.
3 MIPS32 IO FMT ½N
êâ1ê"
61
3.3. CPU Mì9Ù?è 1 3 Ù ?nì 0µMIPS ?nì
!"
A éÝ——Tp (A + 1) ´|é"
Config1(FP) N\ 2:ü"
• p ÑÉ~§d£/\1 ErrorEPC
3.3.10 ë£\1/£LLAddr¤Mì
TMìXþg/C$1Lë£\1öÔn/§T´
iUò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 ´6Yz§ CP0 öJU CP0 - Ïã
âUÙ8I——=BdUA¨DÂm5M"´=¦
3· CP0 -16Y Ïc§Ù§-U®²Ñ¿m© "
·NâUyù -UUì·Cz # CP0 1Qº
nØþ`§dMó§éÑzUp¿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\weoN 2003 c£1¤ MIPS32/64 IOc
MIPS CPU Ãþµ.§Ï~ѬéÜk' CP0 xL§L¥[£ã
y U-w®²)«Cz¤Is¤DÂm"
=¦´@Ïk{ü6Y CPU§ù:Ñk:]Ô5"X6Y
\ÚE,§ùéu£^5`ý¤ æ" k CPU
±¿11-£{üVu$ÏS1¤§OIõ^ nop -Ò
Cé(J "Ýϧ·$Ñk ssnop(superscalar no-op) -§ü
ÕuT-ÒUyÑK¨±Ï"
´ MIPS32/64 CPU y3k Ü¢S{µxo-"
ù ´AÏ-§3I/§ÒUò´ U-kc CP0
-¤kJDÂ "
MIPS32/64 â6-ÉK´=ã«©ü«ØÓ CP0 x"
1x´@ 6-Ö CP0 MìÿâÉK
/"-x´@ 6-3Ù@ÏÒÉK/——
/´§lS½öp m©Ò®²ÉK"
,k¿g«O´@ KÙ§ CP0 -£7,´öXÚÜ
©¤xÚ@ £·±¡Ù^rx¤UKÊÏ-x"
3.4.1 xo-
3·m©c§5¿?ÛÉ~Ѭؤkx£¤±Ø¬ÏÉ~?
n§Sm©,öÿ¤ Ѥ§éu eret ´——öX
ÚØ+?Û¯Ñجræ£^r§S"
kn²(xo-"\±^ ehb Ø1x——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 e3À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Ú^rx
ù«yu);.µ´·é CP0 G£,Mì!, TLB L
!½öp ,1¤?1?U¬K·~ª£½ö3ê
¹e§Kload/store -¯Sª¤"ù«x7L3·£?
Û“”èc\±)û"
3ù ¹e§\7Lòxo-uUCG CP0 ö "
~/´r§3;EÙ ——´\N¬kÙ¦ó\
±3xöJDÂL§¥S1"ùd\gCMû½"
ù«a.x)µ
TLB LUC ⇒ 3ÉK¡þ!;ÚÖ
öê
EntryHi(ASID ) UC ⇒ ÛN!;ÚÖö
ê
UC ERL ª ⇒ l kuseg «!;ÚÖö
ê
?Up 1 cache - ⇒ 3ÉKp 1þ!
;ÚÖöê
* :MìUC ⇒ 3/þ!;Ú
Ööê
KfMì?U ⇒ ?Û¦^Ï^Mìö£1
x¤
B¥ä CP0 Mì?U ⇒ ,U ¥ä-£1x¤
õêù áu-x——vk eret ù -Jøv o
ÿ§\A^^ jr.hb ½ö jalr.hb -"1x^^ ehb -5
Ø"
3.4.3 3 CP0 -mo
?Û mfc0 -Ñwª6u CP0 M쥧´Ï¤k
TLB&EÑÏLMì?1§tlbwi!tlbwr Ú tlbr Ñ"aq§@
l CP0 MìÖÑêâ cache -k6"
67
3.4. CP0 x——Já\² 1 3 Ù ?nì 0µMIPS ?nì
ÏLÙ ASID 6u EntryHi§ù:Òvk@o²w"
tlbp
¤kù Ñáu1x§ÏL3IÖ&E CP0 -c^
ehb -Ò±yS"XJ\kŬr§@A^- þ§@
o@Уk CPU 3^ ehb A¨±ÏSU¬B¤k
CP0 -¤"
68
14Ù MIPS p óÅ
4.1 p 9Ù+n
p óÒ´òS¥CÖÜ©êâ3°§¦ù
êâU¯¿£ CPU"éu?(L1)p §7L3½m
S¤±y6YëY$1"
MIPS CPU -ÚêâgkA?p £©O¡ I-cache Ú
D-cache¤§ùÖ^-ÚêâöÒUÓ?1"
kp DÚ CPU [x£'X x86¤yU oNvkp
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 §¤±þ¡@oUzp
ÒØ´ýé7"p éA^^7L±ß²§Cz´$1Ý
O\"´ MIPS CPU Ïokp M§Òvk<Áã4p é
XÚ§S½ö°Ä§S±ß²——SCp M8´ 4 CPU
¯§ Ø´ ÏXÚ§S ", Unix aöXÚéA^§S
Ûõp §´þ?öXÚUÛõp ö[!§
\UE,I3oÿ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þ" Ò¥z1¹½õ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éêâ§IlS¥Ö\êâ§, E
p ¥"p A ?kêâÒ{ü¿ï§CPU I§
2lS¥#Ö"
ùNp k5§Ò´éu?¿½S/§3p
¥k1±Ùêâ" ùkÐ?k?"Ð?Ò´ù{
1
ålSNÏØU2 "
71
4.3. @Ï MIPS CPU ßp 1 4 Ù MIPS p óÅ
¡þp ¤NN´õ"©/3u§du
Np éuIêâkÿÀ §kU4 CPU 'I\u
Jc$1£ CPU ØâTêâ1Ø£ö¤"{üÚJc$1
u¯¨ªÇ"
$1ãm p ¬C÷§¤±¼#SêâÏ~Ò
¿ïc¡ êâ"XJ\ù ê⮲S\ S§\±
¿ïp SN¶XJp ¥êâ'S#§\ÒIk
rù êâS"
ùÒ·#¯Kµp N?nö"
ã 4.2: ü´|ép
£±©¤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/ko¯KQº§Ø´¶$13 CPU þØÓ
/mSNõØÓ§S¦^ØÓêâU¬Ó§S
/"·3ØÓ/m§±zgÑ#Щzp
¶ù«ªõcÒ^L§éép U´«Ün{"
´éup §ù«ªÇ$¶ 3p I\
¥¹/mI£±· "
Nõ MIPS CPU Ñæ^§S£J[¤/?p Jø¯¢
Ú"´%æ^Ôn/IPzp 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 vkM5uÿ
½ö;ù«p K£cache alias¤ r¯K3öXÚS
+n§S5)û§[¹ë1 4.12 !"
• p 1ÀJµp 1éAzI\±Ñõ
iêâ"@Ï MIPS p I\UéAi§I
\UéAõiêâÏ~ЧcÙ´3SXÚ|±¯âuÖ
£õêÑ|±¤"y MIPS p ªu¦^oi½li
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ÑkIL²¯´Ä²Lp "
p M3XÚ^Ï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µXJlÌ¥Ñê⧧
(êâÒ'"XJêâp ´£ª§¿ §SC
®² êâ§@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¥§ ¡21ù -§\Äk
7Lyù -¬£S¥§ÙgyéA I-cache þ
¢"MIPS CPU D-cache Ú I-cache m´vkéX"
3õêy MIPS CPU ¥§synci -¤7ö±B4\
ff\S-U ^u1——§´^^rA?-"
75
4.6. +np 1 4 Ù MIPS p óÅ
oØÏLM5+np ?
M5+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ü¯Ì¥
Ü63* £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®²LPê O¤"
â"XJk<Ö3p ¥#ê Õ3 21 VÝw5§ï(J
â§ìUZýo§wSì ÒØ "éuõêa. CPU§
y3k #êâ" ;§S 3I5¿p Ï
ù«{̯K´·^u Õ¦ XÚ^ѧ3ME,
O¤@«ªóXÚ"¿¤kX Ý¡Gѽdwå5\y"
ÚÑk¤k¯ÖÑÑy3þ¡ü 3Öÿ£2006 c¤§Ø
o§l Ü I/O ìØU MIPS CPU §k«ª³3X^
ÐÅ(Æ" ½§ÝM+n¢y/ß²0p
kéõf"CPU ^õ uÐ"XJ\ CPU ¢y
ê/áuT CPU ;^«¶[ج p §\UØIÖ
Ù§ CPU ÚÖ"·Ø3p Ù£´ék CPU ù:¤"3
M¥sõ%g§ 3O 5AcS¡Nõ MIPS ØE,ج
ÿâ^õU zp Ú kp 짤±ùLÞ
o±ÏÑ\þ E,Ý"<N´ sémâU¤"
@Mp ½'^¯§
XJ\^I)ûù ¯K§ÒIU p ?1ü«Ø
Óö"
1ö£ö"a,êâ up ¿ ®²À
/£IPglþ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Úçckp¾å"´
ùckN´Úåܧ§±£!¢½öüö(Ü——¤±
Ö;^§"
kü½öõ?nìSÒ¬9 E,õ¯K"
õêSXÚLuE,±u CPU v{O CPU Ö
§¤±^v{(=S«I¢½ö£"oS
¯[Ø?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Ú¥§Ï~Iki@õ?p " ¯?£ L1
¤=Ìp l CPU C"¯ L1 ·¥§Ø´lS¥é ´k
é L2 =?p ——Ï~'? AúA£´'S
´¯ÐA¤"p IA?ûuÌSÝÚ CPU ¯¯Ý'
å5kõú¶du CPU ¨±Ïm'Sm±Ï ¯õ§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 ;.kL5 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"
11 R4000 CPU Pk¡þ?p ì§QED RM7000£1998
cc ¤Ú\ ¡þ?p §ù38pàO¥é~"MIPS32/64
½Â cache -·^u*Ð L2 Ú L3 p "
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ö§ÄKoØZ"
• Ï.öµÑS¥,êâ/§?nÒÚ²Lp ¯
"Ò´`§XJ\Ï1Ø3p §31p öc
lSÑêâ"
• ¢Ú.öµâI^J[/$ gÀJp 1Si!§
, ´p ,´S1/§, ´T´" \7Lp 5
80
4.9. é MIPS32/64 p ?§ 1 4 Ù MIPS p óÅ
81
4.9. é MIPS32/64 p ?§ 1 4 Ù MIPS p óÅ
â"TagHi ~~Ø´7µXJ\Ôn/mØL 36 §TagLo Ï~
ÒUI\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\[LAp
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êâ¦^c21u"ùuòØ=¬
uy;ìØ UuyE,oا±9êâ´ CPU Ú£
奤ÑyÙ§Ø"Ïùϧ^u¢ypXÚ MIPS CPU
~~ÀJ3p pJøØ"ÚÌXÚ§\Q¦^{üÛ
ó±^E,Åè£ECC ——Error Correction Code¤"
X8Ffp§ï;XÚu±õ 8 °Ý/ªJø§#
NSXÚ¬Jø 64 êâÚ 8 "¤±·^OÀÜ
Ìù:"
Ûó{ü/S¥zi!¢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å5E,§Ï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ÚM7LòÜ©iêâö=C“Ö-Ü¿-#O-\”
öS"
éu{üXÚÏ~ÀJÛó ½öZyoÑvk"4
À´ék¿Â§ù3OïuL§¥k|uä§ 3¤¬%Ø^GÑ
Ad"
n¹e§;ìXÚgæ^oŧp XÚÒæ^
o"âØÓ CPU§\±æ^Ûó !zVi 8 Åè!½öZyo
oÑØ^"
XJU§êâ Ï~ÏLXÚxp µêâl;ì
\1?p ØIu"êâ3¦^ÿâ?1u§ù±
y?ÛÛóÉ~Ñ=ÚåÉ~-§ Ø´=-| uÓ
1-"
XÚoþêâéup êâæ^Ó?nÅ"
ù¿X¬w¤/p Ûó0——N´4<t æ"
5¿§XÚr?5êâIPvkk ´U"3ù«
¹e§CPU ¬§SÜp )¤ "
XJu)اCPU ¬)¤AÏØg"ùÚp
m; £XJp ¹kاUYlpÞ1èw,éy
Y¤"XJXÚæ^ ECC§MogCÅا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)"
buf ´§S/Òvk7)¤AÏ/"XJ\ØØÄuÔn
/ p 5¢§ p 3Ônm1 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Ú§I3p N
þÚS5Uþ!¤§CPU k 50¨65% m3p W"Òù
:5`§ò CPU Ø5UUòA^§S5UJp 15¨25%"
p ÇûuXÚ3p W¿s¤m"\±ò
8(üê¦Èµ
• ²þz^-p ·¥Çµp ·¥gêر1
-ê"
• p ·¥/Wmµ;ìXÚWp ¿2gm© CPU
1¤sm"
\U¬§Äp ·¥Ç——zgS¯²þ·¥Ç"
´p ·¥UkNõÏK§Ù¥k v{ý"Þ~
f§x86 CPU Mìê駤±Ó§S?È x86 ¦^¬' MIPS
¦^õéõêâ"´ x86 ¦^æÒ5OMìù ¦^¶
ùæÒ ò´S¥¦^~ª«§éA¦^Ǭ~p"z
Z^-·¥ÇÉù« OKÒv@o"
=¦þ¡ù{ü©Ûéue¡ÑA«\¯XÚÝw ´
{ékÏ"
• ~p ·¥gêµ
- 2\?p ",ùò¦OC\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µ
• 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êâ¬
ê8Lp |é´ê§\Ò¬3, mãS-4ª
p ·¥§ÏØÓ¬êâ¬préØÊ/ü@Ñp
"
ËÄX|éê8:ì~¶õêïÄL²Lo´p
éu5UAvkJp£´UkÙ§OÏIïl´$
õ´p ¤"
k þ¡µ£§@oé§SNCz¦§3p ¥$1
к
88
4.11. #|^±Kp Ç 1 4 Ù MIPS p óÅ
¦§SµXJU{§ù´ÐÌ¿"\±¦^?Èì¥Ý
•
`zÀ£LÝ`z~~¦§S¤"
• 4§S¥²~1@Ü©µ§S¥¯ÝØ´²þ©Ù
"²~¬kÜ©èAlØ^£Ø?n§)XÚ+
n¤§½ö^g£Ð©zè¤"XJ\UlÑ5ù é^
è§{Ü©èÒUképp ·¥Ç"
«²L¢y²3½§Ýþ¤õ{´§|^¿Ûì(½§S
3;.K1e¦^ª¼ê§, Uì¼ê1m4~^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éUL @ ' è5UU?"p
£½^~¦EÃã5ré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Øõsm§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 "ùUp 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¢Ú
¯Ap ø£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 "XJd2l,
/ 4K ¯Óêâ§2glS¥Ñ\p ØÓ¢Ú
4K ?"y3Óêâ3p ¥küK§éÙ¥??U,?Ã
{"ùÒ´p K"ÖêâKN´Úå·ÏkU
ا éu3êâKÒ´Uå ¿"
MIPS L2 ?p o´Ôn¢ÚÚÔnI\§¤±Ø¬kK¯
K" 9
¤± 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 §´MO<
cPùÙ¢´"TõÐB´ÏÊccÒ §
Ør"¤ AÚ. . .
Ó?nõ¯öXÚ¤7ØA5"
¥ä´d CPU ~-6± ¯ÚåÉ~^"Ï¥äØ
´·%ÒU;§¤±7Lk,«^Å37B¥ä"
• ;ì/=É~µ,/I=´MØUk=§½
ko§¬u)ùÉ~"
OS 7L(½ùÉ~.´Ø´Ø"XJÉ~wG´duA^§S
¯ #N/m {S§¯K)û´öXÚªA^§S
±oXÚ٧ܩ"~´û5S=É~±^5N^ö
XÚõU§E,±´UINJ[;XÚ§½ö{ü´*
¿æÒm"
• Ù§ISØZý~¹µÙ¥wÍ~fÒ´2:-
^§dMÃ{?n, (JÚöÎÚöê|Ü
Ϧ^ýÑÖ"
ùa¹' §ÏØÓSØéùa¹¬kØÓ?n"éà
\13XڥUا3,Xڥd^?n"
• §S½Muÿصù )Ø3-!3^re{
-!3A SR B1?nì-!êÄÑ!/éà
Ñ!^r¥¯ kuseg ± /"
• êâ5¯KµNõ MIPS CPU é5goÚ êâi!Ûó
½i°Åèu"p ½öÛó3|±êâ
CPU þ)É~"
1k ')Û©¥ä ܯ'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Ð"'Xuÿ±Ïo
\ÒØØ^OÅ"@´ÏõêyXÚéö?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¦î
!kUØ´úØ"i@É~ ——3É~?nv¤
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^§\IkwwOY"
3ÏL6Y£½ö^\E,-U1E⤠¼Z5U
CPU ¥§NX(^S1.Ù¢´M|©ob"XJM
OØ |©§É~ÒUTb³/³}"
É~6Ê31§§CPU 6Y¥kA^?uØÓãÿ
¤/(å-"Q,·U lÉ~£¿ ØÉ»X1
ä16§6Y¥z^-o1.§oÒ·vL
" d §·IP4=^-áu=a."
2
å§X¬IùoE,Qº
93
5.1. °(É~ 1 5 Ù É~!¥ä9Щz
1.§´É³-9Ù Y-ÒÐl5Òvkm©" É~°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 kU¬Ñ¯K" {zM§ÐNX(#N¦{/Ø{$
Øʧ=¦ÒÉ~ØUÊ"~¹@ؤ¯K§´e·
kXeè§Ù¥·3J¦{ü(J á=m©,^-µ
mflo $8
mult $9, $10
3. Cause Mìù^±wu)É~Ï"3/É~
§BadVAddr ";ì+nXÚÉ~Ð, MMU M
ì¶18Ù¬[ù)"
4. , CPU m©lÉ~\:§d ^?n"
99
5.6. i@É~ 1 5 Ù É~!¥ä9Щz
5.6 i@É~
3Nõ¹e§\U3\É~?n~§¥#N£½öÃ{;¤?
ÚÉ~¶ù¡i@É~"
XJ?nØ&§ùU·b¶¥ä§S³G3 EPC Ú
SR ¥§\7LýOÙ§É~U¬ÀKÙ"ØÑ ~AÏi@
É~ §¦UÙ§É~cÑ7Lù MìSN"d § #¦
UÉ~§\ÒØU26É~?n3Ï^Mì k1 Ú k2 "
É~?n§SU ¹Li@É~§7L¦^, S«
5Mì"¤^êâ(~~ É~v¶i@õÉ~vÏ~S
ü3æÒþ"
zgÉ~/ÑæÒ] §¤±ØÓN=?¿Ýi@É~"õêX
Úz«É~`k?§¿ Sü¤3?n,É~§#Np`k
?É~"ùXÚIk`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É
~Ø 4OOêì 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
ÜI5¿ÿ)"Ï·?n Ü.ج·§¤
±¥äÑÖm ´é' "
i\ªXÚ MIPS ^rAT'%¥ä §ùÒ´oüÕ^!
;5ù"·ùeA¯Kµ
• MIPS CPU ¥¥ä] µùÜ©£ã\^ÀÜ"
101
5.8. ¥ä 1 5 Ù É~!¥ä9Щz
^¥ä ´Zo^º
. CPU o3 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
• 3£§\I2gB¥ä±BU ¡E¥äcMì¿X
1¥ä?Ö"ù§ÒI SR(EXL)"¢S¥§3?\É
~ÂÚ½cr SR Mì¡Efu)É~L§¥§
U®²Û¹/ SR(EXL)"
é SR Cħ\Ic[Ä@ 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 ?up`k? IPL§KB¤k¥ä"
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§\3zgi!ÑÑàþ
ux i!§\U3kõêâ±uxcB“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дþ?{§Ù¢Ø½sm¶´\
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ü, gUd?
§¯] "
zf1è¬Ñke¡(µ 13
wait(sem);
/* do your atomic thing */
signal(sem);
?§"
,\ÐU yجÑy [Áe/——´XJ^Ù§a.&Òþ§\
15
oy?Ö 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 1S¬þ?ÛöѬ}"
´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 ¥ä
51——Ä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/¥ÀJm©1/"ùpU¬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±cpÕá&ÒC¤ 6 ?êµ
"Lvk¥ä§´3e 63 ØÓ¥äè"3 EIC ª§z"
èkÙgC¥ä\:§#N·O¥äìU © CPU ?n
õ 63 ¯"
16 (/`§XJ1L eret -"
107
5.9. éÄ 1 5 Ù É~!¥ä9Щz
þz¥ä£Ø+´DÚ´ EIC &-¤3\XÚkü¥ä
AOª½öém¦AOî|Üe´k^"3E,p?ö
XÚåe§!eþ¨±ÏéUÏ«å Ô§¤±´
uy\¨OöXÚvk^ù A5§ØaÛ%"
5.8.6 KfMì
=¦^¥äþ§¥ä?n~§kIKú;¥äèMì
§7L3?Ûk^ócC\gC/"
MIPS32/64 51#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ÚkUr¤k¥äB
ãm§ùãmUL·?¯¥ä?n§S$1m¤"
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ØØú/pKX"
·E^~5É~ŧ3E EPC uÿE 31
-§õê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Á3UâÖö¶·:
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 1p
-"“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 \1UØÖ
;ì £-Ã"
• TLB ?uÅG§3ЩzcýéØU¯£3k CPU þM
é TLB LEUºxko§(JU´ TLB '4§
UÏL2gE âU?E¤"
DÚéÄÚ½Xeµ
1. ©|Ì ROM ¥è"oy3Ò©|Qº
êâ"Ø\XÚ|±Ã^¦^2:ü§ÄKO#P E
SR(CU1)"
110
5.9. éÄ 1 5 Ù É~!¥ä9Щz
yâ"XJwþkZ§\Nu´ÄU é TLB Lêâ?1
"
• CPU ¨ªÇµ{éѨªÇ~~´ék^"\±ÏL$1ã
®Ý! up S!Is¤½êþ CPU ±ÏÌ
è§, Ú CPU Ü®ÝOêì31c ?1'"
½y\ý´3$1p ¥§ÄKÒ¬Û%(J——P
4Pk MØU3p ¥$1 ROM"
Linux SØ3Ú1ùó¿wê§ BogoMIPS§±r
NTêÚ CPU 5Um?Û'XÑ´b"
XJ\ CPU ÎÜ MIPS32/64 1£2003 c5¤§^ rdhwr
-4\¯Ì CPU ¨Ú Count Mì4OÝ'~Ïf"'
OêìÝÚ ÜëION´ "
XJ\Ñ CPU ID!¨ªÇ!p 5&E§'X`éÄ&E
Ü©w«Ñ5§kU,oó§¬a\"
5.9.2 ÚÚ½
éÄèÉü´Ñ8ImÀâò"¡§éu
M5Ab½§Áã3¦^zfXÚcÑu£e
÷Ffÿ§3z? cÁeâ þ¤",¡§¦þ~E
,Jî?è"Ú§SAl5ÑØ´'%5U§¤±é@:
p?ó"´p?óèu¦®²kõfXÚU $1"
\?n MIPS äNæN£'X SR ±BU ?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ìÐ
©zT¬;ì/þ.£éà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±tE,µ
5¿\ MIPS §Sïvkæ^ÛMì gp 5\éæÒCþ
§ÄKIõЩz"
5.10 -ý
kÿÉ~^5N^OÉ~ɳ-^?n§S§Ò3Ø
|±2:M CPU þ¦^^5¢y2:ö@"NÁìÚÙ§XÚó
äkUù"
ý^-§\IéÑ-!)è!¿éѧöê"MIPS -
öê3M쥧ùÿù É~cM쮲É~v¥
"k ù Éì§\3^¥1ö§r(J±Ö¶ª
\A(JMì3É~v¥", Ié;É~£/
NùÒaLý-, £"·òÚÚ/rHù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{51ùö§ùpIU É~v§±r
(J(£AMì¥"
O\; EPC ±Lý-Ø%Ò¬á\²"XJ
ý- u©|ò´ø¥§\ØUÒ{ü£“e^”-——@Ò
uvku)©|§ ¯¢þ\Ø´Äu)©|"
¤±ý8I- u©|ò´ø§ý©|-§ÿÁ
wwu) ©|´vk"XJu) ©|§IO©|8I, lÉ
~£@p"
112
5.10. -ý 1 5 Ù É~!¥ä9Щz
¤3´§¤k MIPS ©|-Ñé{ü§ vkB^"
113
1 6 Ù . S+n TLB
·ul. Ú\֥ܩÌ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ÓM3Ù§¸eX
Ûó"
·gºegÿ§M~~¡;ì+nü½ö
MMU"·g.þwÿ§·Ì8¥uÌM TLB £
¡´“translation lookaside buffer(= À Àì)”§ØLù¡é·n)
vkõ^?¤"
6.1 TLB/MMU M9Ù^
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¹kJ[/£VPN =J[Ò¤ÚÔn
/£PFN LvÒ¤"§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/"
116
6.2. TLB/MMU Mì 1 6 Ù . S+n TLB
• ASID£/mI£Î¤µ~¹e§ùÜ©3e5öXÚc
/mI£"É~جKT§¤±WÉ~ §Téc$
1?§5`E,´("
¦^õ/möXÚ¬oTc/m"´ÏT
? EntryHi§^ tlbr 5u TLB LÿØØ©%¶T
ö¬ EntryHi§1 7L¡E(c ASID "
• Rµ
£64 âk¤ù´/«ÀJÎ"\±/rTw
´ 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 Ñ)¤
I
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 31 TLB L
Ñ£A µØÄD4(JÔn/¤§u
º"
vk MIPS CPU U 3 PageMask(Mask) #N?¿ ª"õê
#N3 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
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
¡ØI3õp mgÄlCz——®k CPU
¦^¡§½®Ö¡§ù ØIõ'%"'4éù
¡p fÚp±4XÚ\kǧùdö
XÚ^5P¹A§'X`§±p ´ØI5+
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) ØÓ§@Ò¬¯"
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
ù«PÂ"
120
6.2. TLB/MMU Mì 1 6 Ù . S+n TLB
122
6.4. TLB ?§ 1 6 Ù . S+n TLB
3õê CPU þ§TLB SÜ´6Yù/=±p?1"þ
¡ù+n/äöUÃ{·AIO6Y6§§¤±XJ3 TLB
o- ¯Ò$1¦^=/-ÒU¬Ñyx"ë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
¡d3U"k CPU 3ù«¹eÏL'4 TLB 51g·o§d
SR(TS) "d TLB òʧgME â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ÚIoU NBþ/=73SL§^ TLB C
^L/=p " JpǧÏ~rL|¤ ^
TLB êâ|¤ê|¶ ?ÚJpǧ\±rL Ú(
^ Context ½ö XContext MìÒ±LSÜ
"
Q, MIPS XÚÏ~3ز/= kseg0 «$1öXÚè§~
·¥/Ñ´^rA?§S" \Éù«~¹e~?n§
Jø eZMA5"Äk§ù WÉ~ÚØU^uOÉ~ 3
Ü£èÚêâ¤ÚºÜ£eOæÒ¤Wkê⧥mkã
Y"MIPS æ^)ûYÉ DEC VAX NX(éu§Ò´rLg
\Ø%NJ[;/«£kseg2 ½ö xkseg¤"ùZÀ|á/e
f)û ü¯Kµ
• ! ÔnSµÏl5جÚ^3L¥m^Y§¢SþØI
ù ©ÔnS"
• Jø «{ü´1ŧ±3þe©ÿ#N#
^rL§ Ø^3öXÚ¥géÑv N¤kLJ[/"
´§ézØÓ/mkØÓSØ;ìN§
\?U ASID §L kseg2 y3gÄ#N(
L"ù{Ò´CZ{q"
MIPS NX(|±ù« Context £64 CPU ¥*Ð/ XCon-
text¤/ª5L"
XJ\4L3 4-MB >./m©£Ï3J[;쥧?ÛYÑ
جÓ^Ôn;ìm¤§¿ò Context PTEBase Lå©/
p §@o§3^rWÉ~ § Context MìÒ¬gĹWI
êâ/§ØI?ÚO"
y3е´ù«Yk·5ÌUµTLB
WÉ~?n§SgCU, 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 IL"
125
6.5. éMlÐLÚWÅ 1 6 Ù . S+n TLB
d §5gÉ~ªÉ~1'Û%µ§¿ØUC#m©/
EPC§ù“S ”É~£§Ò£É~ TLB ·¥ "
wå5дMm©?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Ônli!m¤ý
3 16 i!§¦+ MIPS32 EntryLo0–1 ´ 32 Mì"ù´
64 LoN§Ó3L¥=d^¦^&EJø D
Õ"
3ùpO¦^ lw/mtc0 SU !mµXJ\Ò3;e^
-¦^\1êâ§é MIPS CPU U ØÊîer"
XJ kseg2 /=Ø3L¥§ù \1ÒN´;Éi@ TLB
·¥É~"· ¡2!ù¯K"
126
6.5. éMlÐ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 !'uxoõ&E"
(7) T1ÅO=é§Xþ?Ø"
.set noreorder
.set noat
TLBmissR4K:
dmfc0 k1, C0_XCONTEXT
ld k0, 0(k1)
éu^r§SÝ\4Ù¤,«“64 ª”¶"ÿ§^r§SØU¦
5 SR(UX)
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Ú½ö$1XÚ§
\N¬¬Ø¬^ TLB"Ï MIPS TLB Jø Ï^/=
ÑÖ§¤±±kõ«ª4\|^§"
TLB Å#N\l?¿N/?¿Ôn/£±ü ¤?1/
=§Ï ±r§Sm/#½ \Åì/N¥?¿
"XJ\/NI¦Ø§TLB U NB\I¤k/=§@
Òvk7|± TLB WÉ~½üÕ73SL"
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 MMì uÔn/
0–512 MB B§@p\±^ kseg1 «A"´3M
Ã{ uù«/§\±rp Ôn;«?¿¡N
BN«§'X kseg2"éT TLB =IAØ^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ØCXMì{§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µXLkMk3§kqØ3§@oÏLN«¯
Mì±3(SC MXÚ¥ëM§3Ù§¹eN^
^?n§S"
ogÒ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
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 ggñµûöXÚ¤õ§3ÜnÏSé<?
E" (J"
´Ò8c5ù§muö§A?Û¹ÑkU¡é"\Á
ãtÃ#;ì+nXÚ§Äk´§t²x;ìN§)¥
yA^^J[NÚ¥yXÚÔ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 Äþ´{ü¢yÌ6uÄNX(5¼
5UØÓ§FPU ´¿÷ M#Ú¦DÛª7NO"
5§MIPS FPU É SGI éÝáu?OÅ3/êÆ5U
I ´J,"2:O3i\ªXÚ¥¦^O ú¶´é
u2:I¦oª³´3ME,5^{ü5Ú´o5m?1ï§
ù²;ï(J£Xm¤¬uÐ"kU§¤k“Ì6A
^”?nìѬlØm2:õU"
7.1 k'2:êÄVg
2:êÆkNõ 5"\Né§Vg~Ù§é[!UÒ
"!0 e2:êâ|¤Ü©±9gL¿Â"ù
·Uù éõ\®²£¶aL!´3¿©"
?n~½ö~ê<S.uæ^ê/ÆPê{¶~X§l/
¥ål
93 × 10 =p
6
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~½éê13[!þØÓ"ùÒ¿X§êO~
§§=¦è§Ù13ØÓOÅþUk O"3,«¿Âe§ù
OØATko¯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¼ê¤Ò´ÏLE%CO"ù~§U3
« CPU þ/Âñ((J§´ CPU é,JUÒ
¬\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\ڰݵ=¦{ü$(JkUÃ{^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¤”ª"éê)
“5z”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·bcp¢y< ²þ
" 2
754 ´½ûÐIOL§;¶mã·b¢Ï±4<é
2 IEEE
134
7.3. IEEE 2:ê;ª 1 7 Ù 2:|±
7.3.2 AϦ^ 3ê
êÚ^5L«{êþ"
E == 0 ^5L"£ê"¤Údu ØU^IO/ªL« æ
^5z/ªL«ê"E "!ê m 5zêL« f §Ù¥µ
f = 0.m × 2−1022
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.1: 2:êâª
¹"
XJ^rÀJ IEEE É~(J)w§@où:k^{§É
~u)ÒAT´ÓÚ¶ gu) §^ròw¤kc¡-Ñ1
4
.§ ¤k2:MìE,?u-1cG§y Y-v
k)?ÛJ"
3 MIPS NX(¥§Mg£X 5.1 !¤«¤DÚþÒ´ù"ù
:( 2:ö6YzŬ§Ï\M(2:öج
)gÿâUJ ¡-" ;O\1m§2:ö7L3Ö
öê 1¨±Ïãû½´Äg"éuõêÉ~(J§FPU
±ßÿ¿ ?ÛUgO Ê6Y¶, XJ\ò FPU5
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 oN5d5U±ù ——U5
´—— ;O/e“¢yö”g ù "
7.4.1 ¤k MIPS CPU ÑI2:g?n§SÚý§S
MIPS NX(¿vk(£ã= O1ÃI^Zý"éu?Ûý
¢^2:è§^2:ý§SÑ´7"
3¢¥§FPU 3§SU)OéÜ©þâ¬g"{ü
¦^2:4kUl5Ñج)M?nØ /"
wþ¹ ·/éв{KXeµ
• MIPS FPU öA)Ø °(ÚÄÑ ?Û IEEE É~
ÚÉ~(JÑu)¢yg"éuÄѧM¬)á½
U£ûuc\ª¤"FPU Mجɽö)
5zê±9 NaN"
• MIPS FPU £Ø @ϱ ¤\Jø^ueÄ IEEE
Àª§é5z£¤(J±gĤ""
¢yg´ MIPS NX(¢yE|§Ú 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 §z2:MìÑ´ 64 §U NBV°Ý
"
@ MIPS CPU k 16 2:Mì"3,«¿Âþ±`´k 32
32 M짴zÛ/ó?Òé|¤êÆü£,)V°Ý
2:êÆ ¤"Ûê?ÒMì=31\1!;Ú3ê2:Mìm
Dxêâÿâ^" XJ\w®?ì\3P CPU )¤è§Ò¬
6
138
7.6. 2:É~/¥ä 1 7 Ù 2:|±
J¶\Iu\?Èì|±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þÒlu)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 k2:^è§FEXR ¹
k\Ö IEEE É~^&E£ÏÚI
¤§FEXR k£¤IEEE É~^¦U"
"X1ÊÙ¤ã§EPC ou)É~-§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å&E3!ù
¢y/Mì FCR0 ¥"
¦^ FCSR Q²¤|§ÏÙrÖ·Ü3å µ¤±3
MIPS32/64 CPU ¥kn9ÏMì FCCR!FEXR Ú FENR ±N´
?nªJøÓõU"
ùÒ/¤ ÐAMì§ë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:|±
• ?Û¹k5zöê½ö(JeÄ£)5z(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\CL
«¶XJ(JTÐ uüL«¥m§\""
1 RZ (Rounding to zero "\)µò(J\Ùýéu½
uð(CL«"
2 RP (Rounding up, or toward+infinity þ\§½Ã¡\)µ
ò(Jþ\eL«"
3 RN (Rounding down, or toward-infinity e\§½Ká
\)µò(Je\eL«"
• 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
)¤k4§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\§Uo§±9£ó¤§´o——ëwã 7.3"
• MìmDx: 32:MìÚÏ^MìmDxêâ"
• nöêâ-µ\~¦Ø"
• UCÎÒµ{üö§©m5ù´ÏÙ{ü¢y[ج IEEE
É~"
• =öµü°Ý!V°ÝÚêm="
• ^©|ÚÿÁ-µ2:üê6Y2g-¡/"
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É~"
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;
´¯¢þ§\®?ÿ§ù ÑØIP4"“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;
®?ìò)¤·-§#NlAkϪ¥?1ÀJ"3 32
CPU þV°Ýê\1ò¬®?¤ü^Åì\1-"
7.9.2 MìmDx
êâ3êÚ2:MìmDx§Ø?Ûêâ=§Ø¬u)?
ÛÉ~"´êâ32:MìmDx§\I½äN2:êâa
.§èãDx3½a.¥Ã¿Â——`ج)É~——ؽ
¬(¤k "ù¦ FPU é2:êâ¦^, £Up°Ý¤
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 */
fpcondition(cc) 2:^èJcÚ^¶õSNë1
7.9.7 !"XJ\ )^Dx-ko^§ë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;
7.9.4 ¦\ö
ù´ A SGI 3épàã/XÚ¥aq?OÅ5UÒ
ð£ 1995 c SGI  Cray Research Inc k'¤ 3 MIPS III \þ"
IBM POWERPC qlÙ¦\ö¼ p`û2:5U"¦+d
ü-¤üók RISC K§Ü¤¦\ö3~E2
:$¥ 2¦^£;.^uÝ ½öþ$¤"d §ÏL;é
¥m(J\Ú#5zÚ½£IEEE 5½ò(J£Mì7LXd¤
! wÍm"
¦\ökõ«/ª§ÑInMìöêÚüÕ(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Ó——ùpAO%Ïz2:
öѬ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?è"=ö
U3Aþ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:ê
w C int§MIPS/IEEE i, 32 ê
-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 ^ "
©|-ÏdIÿÁ^ ý£ ¤½ö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;
149
7.10. ü°Ýé2:-±9 MIPS-3D ASE 1 7 Ù 2:|±
fs1 < fs2
fs1 == fs2
fs1 > fs2
unordered (fs1, fs2) ll
• 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égSm "
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;
• éýé£=ÑÎÒ ¤'öµ
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”
SL§U±ÜndOЗ—SL§éü°Ý2:é
SIMD Âñ5ØÐ"'å^IO recip.s Ú recip.d -(J§
ùCq õ§,[Ñvk IEEE °Ý"recip1 öØ
Éc\ªK£´Å'u“5z”)Ú¦
^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
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:§I2$1g°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:6Y13mþU——´ùéäN
CPU ¢y[!~¯a"
3k Pª£ØoN MIPS32/64¤ CPU þ, OpØ´p£§é
y$(§§S7L;A½-S"3ù«¹e§\?Èì!
®?ì!½ö£ k¤\<§=§S §7Lc[Äe¹eS
¯Kµ
• é2:ÚGMìöµ?U FCSR §%6Y"FSCR
±K?¿U ¿112:$"y\3 FCSR
ÿ§vk¹Ä£®²m©$´Ñ$(J¤2:$"M
ì£U¬'§3Ñü^-5©m ctc1 rs, FCSR ÚÉ
KO-´²"
• 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[§
Ïé^ ÿÁ'\ýOU@±Ï"¤±^©|ØU;
ÿÁ- "
7.12 -SÚÝ
¤k MIPS FPU éõêâ-Ñs¤õu¨±Ï§Ï 6
YC "6YJ±kn«/ªLyÑ5"
• xµ3^ U(ó 7Ly-©m/Ñy"3
MIPS32/64 CPU þé^r?2:èvkx"
=¦3Pª CPU þ§2:êâ2:-mvkx"
• p£µM o öêOÒXl ò´¦^öê¹
eu)"·Süè±Jp5U"
• 6Yµùu)3M3^-¤cÒOm©,^
-£cJ´mvkêâ6¤/"?Èì!j½®?§S ±
Ñ46Y±÷KÖ$=rMóUåu4è"
y MIPS FPU ~~´6Yz§#N3z¨å©£éuV
°Ý-U´zü¨¤éÄ#2:¦{!\{½ö¦\$"
´XJ\3e^-^,^-(J{§Ò¬4§SÊe5
µé 2006 c CPU§Uoʨ±Ï"é{`§2:¦{
kü¨±ÏEÇ´koʨò´"XJU;32:
(JOÐc¦^§§SÒ¬¯ "
é2:5`§¦{Ú\~{¯"Ø{Úm²-úõ¶XJ
\IEرÓê§OÑê^¦{OÒk¿Â "
7.13 =IЩzڦU
E §~¹eò CPU SR MìЩzB¤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½5z(J"
FPU $1å5§\ÒIy3¥äÚþe©Ú¡E2:
Mì"Ïù£é5`¤'s¤m§±éd?1`z"k öX
ÚÒ´ù§{Ò´e¡“¢ þe© (lazy context switch)”:
• $1#?Öÿ%@B2:"Ï?Öy3ØU¯ FPU ,NÝÚ
6ÊÿÒØIÚ¡E2:Mì"
• u) CU1 Ø^g§I£T?Ö2:^r§£c¦U2
:"
• ?uØ%½¥ä~§mN^^¥§B2:ö"
@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Ó
¼z2:-þu)g"ý§S?1-È迤^¦
ö"ý§SóÜ©´^;ì[2:Mì8"
Xùp¤ã§$1ý§Sééöê½)ö7LU
ý2:M1¶ÏNX(k¿é2:M I¹ اý§SÏ
~Ñ´"´§ý§Sy°(oN IEEE § Äóâ¬N
^§¤±ý§SèõÄ´(5 Ø´Ý"
?È2:Çpõ¶ý§Séz^-Ñk5g?n§S!
-Èè!Mìæý¡Øm"´, §\7L#?È
ܧSâU|^Ù5U"
157
7.14. 2:ý 1 7 Ù 2:|±
Uk ?Èì¿ØJø^2:$µMIPS NX({¤å u
óÕ§ óÕÑ7Lk2: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§
£"§XJ1iÎ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);
159
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ë
lbu t0, 0(a0)
addu a0, a0, 1
lbu t1, 0(a1)
addu a1, a1, 1
.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” eIÒ§“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?ѱù"
• ¤kU load/store /ª(addr)µMIPS Åì-o´^M
ìSN\þ 16 kÎÒ £þ )¤ load/store ö/§
1
´ Ú2:è¥õê||"
161
8.2. ®?-9Ù¿Â 1 8 Ù MIPS -8ë
8.2.1 U ÚØ U (Non-U) ÏPÎ
3·m©ckJe§'u-ÏPÎ{k/AON´· "
“u” M3®?ÏPÎþÏ~Ö“unsigned£ÃÎÒ¤"”´¿o´
ù¿g£3vk4/u\å§ØUn)¤ù¿g¤"û
uþe©ØÓ§“u’’ MkAkX© 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) öê)ºK7,)ØÓ(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"éum£ -£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!LkÎÒê§p Ò¬w
·´ÄK"3ù«¹e§·^ lb -rÎÒ EMìÙ
{ "ùÎÒ*Ð"
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§kU3, è¥-"
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©c1L "
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 Ú?ÈìØ3U3õ«
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Ñù
^-koÐ?"
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 éMvkJ§
´ä:É~~§±Ï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 Oc£p ¤
ê"
clz d,s é s ¥ê 32 Oc£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©Oc£p ¤
ê"
dclz d,s é s lMì1 63 m©Oc£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;
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/
ªOYkU´¥ä·Ï"
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;
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;
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
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 1xo—\Iyþ¡-?Û?
nì 0 B^3 -1c®²¤
ÿ¤^-"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´3f§Sc1"
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"õSN1 9.4 !"
lb d,addr 8 \1§ÎÒ*ÐMì"
éu-ÚÙ§ load/store -§±^õ«
ª addr /— 9.4 !—´ load/store -
UOMì\þ 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\1i"ë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§©OkÎÒÚÃÎÒê
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þÐvko^§
´lÉ~£¡E CPU G7Ø"
mul d,s,t ýnMì 32 ê¦{§3 MIPS32 ¥½Â§
3, @Ï CPU þk"°Ý(J,
GSÜ 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
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ý-"¯kUI
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 ÖMMìµ#NA^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
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ìSriÎÒ*Ð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
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-ézp 1S¬$1
-"
syscall B )“XÚN^”É~"
exception(SYSCALL, B);
teq s,t ^g-µXJA^÷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 &EEMì 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'ùpE,"
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
¥1uÿ¥ä¢y"^ØAb½¥
o¬u)½l wait 2½L²´¶-¥
ä—wait -Al=Ì¥N^"
wrpgpr cd,t \cKfMì|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"ØáuL¥,
- .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(Jm å"
• 2:OÚa.=-±É~"ùé{3 IEEE ¿Âe¤á§
uÿ§S Ua,^¶3. NX(¿Âe¤áµMIPS
FP 2:M§3¡éÃ{(?nöêÚ$|ܧҬ)¤
2:“¢y” É~§dd4^ý§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 A2:^©|-§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:=½ekÎÒ 64
ceil.l.s fd,fs ê"
ceil.w.d fd,fs ò2:=½ekÎÒ 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 £©OL 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ê=§IC
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 -§òü©OL 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ì"^uk 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 "Ì^uk 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ìi1gSE—þ¡ 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
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
콤§kA 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 ¤Óö"
ÖMMì
rdhwr ^rJø é, äN CPU &EÖ¯§ë1 8.5.12
!"
4#\-
synci -¤7p ö§¦U /y§?Ûff
\;ì-éÏL I-cache -p öÑ"Pp
-ØÓ§ù^-Ø´A-§^r§S±¦^"ë1 8.5.1
!"
8.4.2 1O\A-
A£Ø%;^¤-8kü?Cz"
f5¥äB/#N
31c§3 MIPS CPU ¥vk{U f5/B¤k¥äµ3
SR Mìþ¦ RMW SU¥ä"\±Ï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¥^"15Jø 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éu3éà 64 >.êâk|"
XJ CPU 7LBL;ì°Ý>.éàêâ§Ò7L1ü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 ¤MDÑo½li!éàêâ"Ü©i
;oÏLM&ÒwSì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!/"
¥/§,±´?¿éà£éà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§¤±keü¶X㤫§ù i!þ;M
ìp ?Òà"
• ldl d, 7(b): 7 ´k:Û%§Vipi!/——, b+8
eVi1i!"ldr '%´m>$k ¶T-
Ñ©êâei!¿r§;Mì$ §ùÒt½
"
XJ\éù«{´Äé?¿éàiÑka~¦§@ÒgCÁÁ
j"5¿3@«¤^/Ù¢fЮ²(éà/e£ù±^^~
5-\1ê⤧uld éÓêâ\1üg¶ùvkoAO¿Â§Ï~
vko³?"
ù¹éS.uàêS<w·Ï§Ï¦Öêâ(
ÿ²~r$k 3>" \ù §-¶¥“”Ò´
㥓m”£,´Xpk £Ä¤"
3à CPU þ§ldl/ldr ^Ðp§èSXeµ
ldr d, 0(b)
ldl d, 7(b)
196
8.5. AÏ-9Ù^å 1 8 Ù MIPS -8ë
197
8.5. AÏ-9Ù^å 1 8 Ù MIPS -8ë
ë1 5.8.4 !ww^uo/±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þg1 ll m©±5
Ö-U-SU f5/¤"XJU§@o t \A §ý
1 £ t "XJØUyöf5§@oØ1;ö§t 0"
b½?È쮲{r¤kCþÑ\1? Mì§~¹e?È
(JXe¡S£ù´3éò´ø?16YNcÜ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
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~~¿÷ p6è éJ#|"
U©|-u)©|©|ò´ø-J"ÏL{Ù
£ã±^-——3 MIPS ¥(JÒÐT-l5vk1L"
ÏL=3©|u)â1ò´ø-§ò´ø-¤ egÌÜ©"
ù?Û̵
loop:
first
second
...
blez t0, loop
nop
ѱC¤µ
loop:
first
loop2:
second
...
blez t0, loop
first
ù¿X·Ao´±W¿Ìò´ø§ü$ ¢S1
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 y3 IDT!Toshiba Ú QED CPU ¥®²¢yöpoN"$
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,
Ö£5zÚ\¤±3¦{Ú\{ã"
?uõê PowerPC 2:ü¥%¦\$Îæ¯ÙA w
â/ §w,ùé MIPS æBùA^-kK"
2:$ madd!msub!nmadd Ú nmsub ´ýoöê¦\-§
?1Xe$µ
a = b + c * d;
201
8.5. AÏ-9Ù^å 1 8 Ù MIPS -8ë
3 '-7Lò´©|wc¿U§1Ä/§Kk
±;Ö-6"
2:ê|OÉÃu«^6Y?ÈEâ§TEârÌÐm§
òUAgÌOk¿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 ý= êâÚ^Up ·¥§ù:Øý
Ù¶, §ýéu.ê|$õUék^§±3gÌ¥ýÑ1
êâegÌO"
pref 1ëê´ê§^±?èk'§SN¦^êâ“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ì§ÒeUY1", §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 pG1?Ö|¤§zÑ$1uØÓ
“?nì” þ¿ S"·U3!Øæ^ E,p 5
{õ?n짴y3kØÄp +n", “?nì”´æ^
^ DMA I/O ìÿ§¬kÓ¯K"
?Û?ÖèFS{6uÙ§?Ö3oÿ¯L
êâµÙ§?Ö3·?UcÖLêâ躧?ULêâíº
Q,z?Ö´îG1kS§où¬¤¯KºÑyù¯
K´Ï CPU 5UN`A5²~ÚSöÜ6^SZ6¶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 XJvkÒ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 Ò¢£XJULk£ yÙ5ép ]
¤" ¿7,}"
30 - PrepareForStore eA1¿?\p § \\ò1
MïAp 1—— ÿ§lSÖPêâÒ
Ø´l;ìÖê⧠´ vk7 "£Â1
òÙ^"W¿¿ IP9" ^"W¿´ÏÙ±c
eT1®² up S§ SNUáu,¯aA
oØ——ØU6Tö ^——4#§Sw±c
ép 1"" êâU¬»S5"
êâ Êî——AL3ö" CPU 3gÿ
Ó;êâÚ/§Ò±röí´¬"XJ CPU @§Ðu
e(@Ö/Ø´ ¶ù:±"
,~f´¢y {l\1 CPU -ÓküÖö3
¹Ä¶ Z5U§A#N;ìXÚÀJk1="
Ø#N±þ?Û«^SUC§îUì§S^S1¤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/ofXÚm¯Ö)¤#üS¶
æ"
k "éuöÚ sync 1éSvky¶==
´rT-cÚ ö©m"sync ØUy)û CPU §S1
Ú ÜmS'X¯K§ù¯K·3 10.4 !¬J"
203
8.5. AÏ-9Ù^å 1 8 Ù MIPS -8ë
3XÚpÞ§sync 3, ¯a.£Ø^p ¯±9
p ¯¤þå^"éõ“~”²Lp ;ìØ´§
?ۮجêâmÑ´S§3?ÖmÖêâ
"
3rkS CPU þ§sync oÑØ^¶ù«/§±Ò´^ nop"
, §Ï~ sync Ñk L¶\ CPU Ãþ"
8.5.10 xo-
^-¦^;E3c¡-(J2²~ØL "36Yz?
n쥧~1^-lMìæÖöêm3c^£c"
@Ø´¯K§Ï MIPS -==3Mì¥D4êâ§?ÑÏ^MìÚ2:
Mìêâþ´²L ´——Ò´`§Miÿù«6¿ Süòê
âcí1-ÐIÿ"
´éu CP0 M죤شù"XJ\ CP0 Mì
§ùN¬K -§MIPS 5½¿ØyùKsõÈ"
kü«a.x"²wÒ´6-^1-Jøµ@
1x"
æ/´ö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 15u1±5§ù«{®²xo-¤
"eret!jr.hb Ú jalr Uo)1x3S¤kB^§ ehb £«
Or no-op¤±m?n1x"
k'xÚoõ?اë1 3.4 !"
£^5¦^#-
XJ\\^3 MIPS32 1½p CPU þ$1§@o
ÒÐ "´ oØØUY$13P CPU þ^§#5
yµ
• ehb u no-op: 3±c¤k CPU þѤá"\±MïÑ«^§
QUUY$1uPª CPU þ§q35¤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-§Sp +n
r,§S\1?S§S¢Sþ\´êâp "C1
-?\-p âU1"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\
1up 1S¬¤óµÒ´`§QSüêâp
D-cache £§qSü-p I-cache ¢"
3^r?¦^ synci§\Ip 1§ù±ÏL^
- rdhwr SYNCI Step le!ùIO“MMì”"
8.5.12 ÖMMì
A£^r¤^Jø 'uMk^&E"
rdhwr
MIPS32/64 58c½Â oMì"öXÚÏL3 CP0 Mì
HWREna ¶-£ 0 ¦UMì 0§" ¤±üÕéz
Mì¯"HWREna 3E Ü"§¤±7L^^²(¦U^r
¯"Aè[±Ö&E§ÃÀ HWREna ¥""
oMìµ
• CPUNum(0): T§Sc3$1 CPU Ò"ù±l?nì 0
EBase(CPUNum) 5"
/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è£Ìöè"¤"
206
8.6. -?è 1 8 Ù MIPS -8ë
d 8IMì§T-?U"ó·¤ rd ±J2\´Ï^M
ì"
shf £ þõ§^3~ê£ -¥"
fd 2:8IMì£d-\êâ¤"
N/M 2:^èÀJì——Ö“N”§d'-\“M”"3
k2:^èPª2:-8¥T"§ÏP®?èvk
ù§\-±ØT§u1"^è"
hint 8.5.8 !0 ý-J«"
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 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 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
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
2 target j target
3 target jal target
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
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 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 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
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
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)
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\we-?è§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 Ù$1s¤
±Ï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
——ÎÒ ——Ep "@Ò´`^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쳬r6YE,z¤"¦{/Ø{(JÑy3üüÕM
ì hi Ú lo ¥"\U^ü^AÏ- mfhi Ú mflo 5¯ù "=¦3
@Ï MIPS CPU ¥§(JMì´p£µXJ\Áã3(JÑ5c
Ö§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 ~êgO=¤
·£ !ùè"´õêóäó¥®?ìUrù?Ö3
?Èì"
Uìزw½§ÿ±Mì zero (J¦{½Ø{
ò)¤©Åì-" d l hi ½ lo ¥Ñ(J¿?17u§Ò´
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¶Ï ØIT
÷-ÃÎÒ——ä(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 (J3 lo
225
8.7. -UõU©a 1 8 Ù MIPS -8ë
Ú hi Mì¥"Toshiba R3900 #Nnöê mad d,s,t§Ù¥\\
(JDÑÏ^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ì3k5K"
• Åì\1-¦êâg,éà£iéàüi!>.§iéàoi
!>.§Viéàli!>.¤"´®?ì|±@\1Ué
àêâ÷-§ù -Ñk“u”cM£L unaligned¤"
¤k(²IO C §SÜ©êâ(Ѭ(éà"´\U-
3$1O/éàêâ!æ^IOó*Ð(²êâ!
l Ü©Ö\êâ"
• z\1-G(JÑ'O-36Y¥±Ï"éu?
Û MIPS CPU §ÏL^^k^vk6-W¿ò´øѬ4
Çz"
3P£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ë
\1i£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¶6YO4§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;«§ÄKU¬¯"
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
IIO/"ÿ± 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ë
ÚuDÚþ^uXÚN^É~a."
syscall:
teq!teqi!tge!tgei!tgeiu!tgeu!tlt!tlti!tltiu!tltu!tne!tnei: ^
É~§â«ü!Vöê^"ù´?ÈìÚ)ºì^§¢
y$1ê|>.uaö"
8.7.10 CP0 õUµCPU -
CP0 õU±©¤±eA«a.µ
êâDx
cfc0!ctc0: rêâ£?£Ñ CP0 Mì§8c MIPS CPU
ÑvkùMì"´ØÈ UNÒ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ì§ÏLur=£#m©/^ jr -
©|ò´øS51"
cache: 1 4.9 !ùõ«/ªp -"
sync: éuUÏS1 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 1S¬þ"\ 1-
^§"synci 17ö£~~¿Xl L1 ?êâp D-cache
£§±9¢?Ûkc®²?\-p I-cache SN¤§y CPU U
(1§Skc\ù¬S-"
sync: o-§3ùp3rN§Ø´^Ø%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®?§
SUwç½ö?U¶XJ\é MIPS ®?¦^Øù
§Ý§\IÖ\ MIPS óäó© "
ÆSÖ MIPS ®?==ÙGÅì-L´Ø "ù̴ϱe
AÏ:
• MIPS ®?ìJø þý½Â÷-§¤±?Èì-8'¢
SÅì-8õ"þÙL) GNU óäó®?ì@£
Ü÷-§ k CPU MU @£Åì-"
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 úio®?ì 2005 cg¤@£÷-§U'úm
]@ "
231
9.1. {ü~f 1 9 Ù Ö MIPS ®?óè
Ó©¶´ M“.s”"¶ù¦+nü«ØÓ/ª®?
©?Ö\N´"
3?ÚÖc§k£Þ§Se1Ù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);
}
ùãЩ/ªè1m¬ÏÑy3zgÌ¥ü^©
|£éAuü if() é¤Úü\1£éAuügê|eIö¤ ÉK¶
zg©|Ú\1ÑÚ\ò´ø§ ÌN¥vkv ó5W÷§"d
§è÷XéiÎG?1§3zéi!'£éAu while() é(
å)Ò¤ÑkrÌ(©|"
=¦3Ȥ®?óc§·±éùèk^U?"
UC´ÐmÌ4zg̱ü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;
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;
}
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?Ú[wc§·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^Ù§~§§Ï ?uN^
LEAF
ä/f0 ——ë1 11.2.9 !¤"f£nonleaf¤¼ê7Lõ
éõ¯5Mì!£/"Ø\94AÏ?§§
Ä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§SS7L´"ù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éØSY§Ò¬±ò´øØĤ"õê
ÿ§ù«1´k^§Ïu`\3®?§SÿØ7ÄW¿
ò´ø"
´XJ·(I°(-^SNo§Ò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^1M
ì§Ï 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Úþ®
?ì§@oÌVgATÑØ))"
9.2.1 ÙÛ!½.ÎÚI£Î
)ù:§\ÄkÙG C ó"Ö®?èÿ5¿e¡A
:µ
• ®?è±1ü §1L«-½«(å"\±31
põ^-½«§´§¥m^©Ò/;0 m"
• l/#01mSN5º§®?ìòѧ"Ør/#03
1µC ý?nì cpp éù1AÏ?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©|-¥/1f0e/1:0§ /1b0c/1:0
IÒ"ùÒØ^¤%@ éáa=ÚÌå¶i "r^¶i·¶
IÒ3f§S\:½öAOa="
• rïÆ\¦^L 2.1 ¥Ñ MIPS MìS.·¶¶d§\
è7L²L C ý?nì?1ý?n§ è¥^ #include ¹
Þ©§¶iU´ 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
§^/5IÒ£½öÙ§½ ÎÒ¤"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ùpnMì±E")¤^ CISC ºVö
ê-§^Ú öêÓ8MìÒ1 "XJ\Ñ s ®?ì
¬gÄ\µr addu d,s addu d,d,s Ów"
neg Ú not ü8$Îo´^½õnMì-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ê5gÄÀ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
238
9.4. Ϫ 1 9 Ù Ö MIPS ®?óè
• Direct+index £\¢Ú¤µ £þ§\þdMìÑIÒ/
"
£~ꤵ)º 32 ýé/~ê"
• Constant
239
9.4. Ϫ 1 9 Ù Ö MIPS ®?óè
la $2, addr($3) ⇒ liu at, %hi(addr)
addiu $2, at, %lo(addr)
addu $2, $2, $3
¯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];
{ü/rA«¶¡3êâÚ-c§Xe~ùµ
.rdata
msg:.asciiz "Hello world!\\n"
.data
table:
241
9.5. 8I©9Ù3;ìN¥ÙÛ 1 9 Ù Ö MIPS ®?óè
.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 ókA5Ò´ØÓ¬¥õÓ¶½Â
´#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
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Ú"
Ö«Uu¬lÖ«;ì¥"
ÒÚæXÚ/m«~§´®?ì½óìéd
)ØÓué .text Ú .data «"ÒÚæ´d$1XÚЩ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(£^
ék8ý馤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°Ä§Saö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ücmÑkO,?§3ù«CzeE,j±¦
±5M/^ØC§ÒØÜn £,ج!¤¤"
10.1 MIPS A^§S. ^µ~¯KAL
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
¥ÙÛkU Ø·£Ø£¤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 !)ºù
¿Xo"
• ;ì¯^SÚ#üSµ3Nõyi\ªXÚ½¤aXÚ¥§
XÚ±Dxêâlå:£Ä ª:mUóªÏLõ
fXÚ"ù fXÚkUgµC NõE,M§\¥yÑ¿
دK"~X§3 CPU Ú I/O mDx&EU½?\
è§ØÓ§Ýò´¶½ö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ÅÆ
"3J4_%´Ö©Ù¥§Cohen 5¿§ÄuéÏ&XÚ¥
i!/Úê½Âª<ÀJ§OÅNX(®²©ü E"
3 Johathan Swift 56iP6¥§“à ”Ú“à ”Ïéu¯È
/Ak=àâé©Ü u |Ô"Swift 3ÀelV
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§·
é1OÅUÄn)1OÅÀÜ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£Þwe"
10.2.1 'A!i!!iÚê
32 êL«¤ ? S§z kØÓ"$k
1 §, ´ 2 !4 ——Ò?L«“!!z!Z”"\;
ì±i!ϧ32 êÓ^oi!"éui!N¤êk
ü«ÜnÀJ"k OÅr$k 3c¡£=$/Si!¤k
rpk 3c¡——Cohen ¡§©OàÚà"· 1976
c1g>OŧDEC .ŴৠIBM .Å´à
¶?ÛÑØ¿4Ú"
rN´ùÀJ ¹3\U Ïi!ÿâu"1960 c
Ïck°OÅÑ´UìüÅìiü |µ-!ê!S
°ÝÑ´Ói"ùOÅvkà¯Kµ3;쥱iS§
iS± S§övk'X"
ÒÈÙ/§V EÑk¿©nd"
·S.ulmÖ?ê£wÿÏ~lm¤§Öê
´µÞ¬'æU¬`“oÚ§”·K`“o"”ùê
ÿ§g,Òkp "3SU±i!Ïc§i!m©Ñy´
«riÎ?i¥{Bª"1970 c@1 IBM §S s¤ )
²{ wþÑÑL§z|iδLL«êi"àê
wþé§*þ´à"´êÿp 3>§i!/
÷ÓO\§ùXJêz? lm?ÒҬص¤±
IBM rip I 0 "¦.Xã 10.2 ¤«"
´â3êa.SÜâé? ?Òég,——=r
Ò n ©â 2 "ù3i! 0 ; 0–7 Ò §\q
n
C¤ à "3ÑÑw«iXØ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.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 Ï&ó´kuxp
§ kux$ "´3 1970 c,ÿ§l i!IO¤ 3O
ÅSÜÚOÅÏ&XÚSÜ£¡“octet”¤Ï^Äü ";.Ï&X
Úli!ï¤k©§k. Mó§â= kux"
Ó?nìXÚm©¦^l 죰ì3pà
¬¤§¤kù Ñk 8 àl 0 7 ?Ò§pk 7"
ØNot§vku)²w»¿§zi!Ñ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 ±ØÓ§¦@gCT^
à"´ Motorola Ã{|᮲ÓÌ/ i!S gSS.½——z
248
10.2. àµi!i!Ú S 1 10 Ù MIPS NX(£^
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;
î5ù§^à´?Èìóäóá5§o±——XJv ñå
ó{——)¤?Û«àJ"´3 MIPS ù±Ï
i! CPU þ§SÜÒ´^ 32 â$§XJr1Mé|¬4à
$§¤±·?Ø CPU à"
, §i!3/mÙÛ¯K·^uØê Ù§êâa.¶¬
K?ÛÓ^Li!mêâ§'X2:êâa.!©iÎG$
kL- 32 öè"âVg§éuÙ¥ êêâ
a.Uk¦^§éuÙ§êâa.Uvk?Û¿Â"
XJ«ó|±, ^Eêâa.§ ù a.LMU+n
§@oùà¯K´X{^½¯K——±^?Û«à
E"·F"y?ÈìöU n)ù:§Ð4^½ÚMgC
½±"
àÚ§S£5
l5ØlO?Ñ\?êâ§\;±ü«ØÓêa.
Ó¬êâ£Òþ¡~f¥k¿@¤§CPU àÒ´Ø
£\èÒ´£¤"y C ?Èìò¦þÏ\uÿù«¹µX
J\Ø%ù §U¬?Èìؽö´w"
´\NÃ{Éù ¶\UØØ?nlO?G\XÚ
5ê⧽ö?n;ìNMMì"-ùü¹?Û
§\ÑI(\?Èì´N¯S"
ùwþÑvko³§´²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 rp IP 0 ½§ã¬Ðwõ§
´y3Ø2ù "
´àUrNl«¡^!ÄÝrOÅSw
i!S"¤±Óêâ(wþã 10.5"à¿ØrOÅê
â̤´ê§¤±ur$ ê£ !i!½öÙ§¤3>"
ØxãéJýn)à¯K§Nõ<uygCo´éJegCS.
½§~X§XJ\S.ulmé ?Ò§s¤é¿åâUl
m?Ò£à(ã4S.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ë§MXÚ¼±£Oà"
\ÏLoDÑõi!êâ§Têâzi!ÑkgCÕá/
"XJêâ¥$/i!÷X$ Òlo£i!Ï´¤D§T
o´ à"´XJêâ$/i!÷Xp Òi!Ï´D
ѧ@oTo´à"
3 CPU “S3”à9ÙoXÚà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{ØATI"´\
XÚ)àØo!CPU!½ö æÒ5 "3ù«
¹eÑÀJýéØ@ot¶XÚO< ØØ“ü³Ù"”
• ± Ò/´i!Sϵ²wÀJÒ´§O< ±U
ì ?Òrüoå5§ùJ´±éàip ?ÒØ
C"´Ï ?ÒÚiSi!^S§ëüàw;ì
i!SØÓ"
Úo°ÝØ´éào>.êâ3ëoþDѬ
áϧzo°ÝüSÜi!"ù«*a'^¯K<s"
^¥àØêâ§éÑêâa.>.vo¯K¶==´êâ
vk¿Â"-ù«M¯K§êâ>.tÏ £Ø-|§êâÑ
éào°Ý“i”>.¤"
ùp¡k ¿¥"XJ²LDÑêâo´éài>.ê§@
o ÒÙÒ¬ùXà O§; ^^=êI"
´Mó§é(3XÚ)·ÏSѬkoêâ
²LDÑ"
• i!//êϵO< ±ÀJÏLrzi!Ï´ë
AÓiSi!/l ±i!/ØC§,di!S
êâëØ"@oXÚé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þwg,Ü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;ì TiSoUi!¥=i! ¬¢S\"
3SܧCPU rzi!ÏÚiSi!/맴@;ìXÚö
Ã'"`§;ì/CPU ¤XÚU« CPU චCPU U
#Ö£5\ê§iSi! 0 ¢Sþ3;ìo/¿Ø" 1
àØom
b½·k¤à 64 MIPS CPU§·Ir§ë
à 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(£^
254
10.2. àµi!i!Ú S 1 10 Ù MIPS NX(£^
à
b½\¬Ì½öo§#N MIPS CPU U±?«
à$1"þ¡ïÆTNí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!/Ϫ——´\gCyù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Ø{ÚØ@£
zOìè1g-à¯KѬ²Lùãµ@ù ¯K
N´I)ûM""¹@o{ü"e¡´A~fµ
• I/O ìµk # I/O ÚXÚ챤
à½àª"3¦^ùaA5c§\4c[/ÖÃþ§
AO´3\Ø´r§^·À£O¤ ´^a£E
¤Àÿ"
é~«¹´§ùA5==K1þêâ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´ØUM?ØU)û^¯K"~X§¢SX
Ú¥NõDÑ´±êâp 1ü "§U¹ØÓ
Úéàêâ?¿·Ü¶XJ\Ĭ§Ò¬²xvko{U
êâ>.3=p§Ò¿Xvk{(½¤Ii!"
^i!==´\ì ·Ï§ÃÉu»þh"ÑÃ^i!Ï´
?Û{Ñ´ô þ^5¢< ¿"
10.2.4 MIPS CPU Và^
\UMïU ($1u?Ûà MIPS CPU þ?
è——N´Ï$13?«à,AÏfþ§½öMï
U$1u?«fþ£°Ä§S"ùk:Jݧ
éUgÞèÜ©UùÒ1 "!Ñ H"
UC MIPS CPU à¿ØIõ"-8¥U @£Øv 32
éÜ©Ò´Ü©i\1Ú;"3Pk 32 o MIPS CPU þ§
-µ
256
10.2. àµi!i!Ú S 1 10 Ù MIPS NX(£^
lbu t0, 1(zero)
ã 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Úèÿ¤§@ý
geÒ±ØNõ65"
¤kl Üêâ ½öÂêâÚ^Ñkd3à6¯K"
´âXÚÙª§±)¤3ü«àeÑU$1è"3ØÓà
mkü«ªµ«±i!/ØC§,«± ÒØC"3XÚA
258
10.3. p 55¯K 1 10 Ù MIPS NX(£^
½«S¯äN Mì§ÙàCz4kUö±"
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 êâol 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(éල
öá\ !{KS§=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——)UI2gõi!êêâ"
10.3 p 55¯K
31 4.6 !§\Ƭ ^5(ЩzÚ$1p ö"!´w
\5¿UÑy ¯K§¿)º\N±)û¯K"
259
10.3. p 55¯K 1 10 Ù MIPS NX(£^
P4:§3p ÚSmDÑo´±·Üp 1
(S¬——;.¹ 16 ½ 32 i!éଗ—ü §¤±p
UÏ CPU ==Ú^Ù¥¹i! Ö¬¶=¦ CPU
l5vk-LÓp 1Ù§i!§E,¬3egDÑTp
1ÿ)¤ki!"
3nXÚ¥§·oU½SG#Uþ CPU ¤k
ö¦§zkp 1)AS °("Ø3´§¢
SXÚ¿oUùn"·b3zgE \ÑЩzp §
\;£ Ø´Áã)û¤ 1 4.12 !ùùp K"lù b
½m©Ñu§ý¢XÚ1Únkõ 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 55¯K 1 10 Ù MIPS NX(£^
UÒ¬Pê"ù±u)3 Dxêâ DMA DÑþ"
^5éGÏp 5¯K^É쥧kA´Äu
MIPS cache -þIOf§S§U4\np /S5¯
K"§3éAu½S«þp þö§±£#
p êâ½ö¢p ê⣽ööÑZ¤"
, §\o±rêâNزp ¯"¢Sþ§k ¸e§
ùÒ1 µ~Xk äì§k73S(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 NMM쯧±r¡IP
زp "XJk<E I/O MìØ3$ 512M Ôn;ì
mM§@où{Ò þ^| "
kù«U§\raq;ì£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 1X\¤§
Ó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`§êâ,IPk§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ýéyuxêâ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 55¯K 1 10 Ù MIPS NX(£^
3 MIPS CPU þ§ÏLrp 1¦^ß Ø´£
§Ò±;?1£ö §ù{Ø——ßoNþú
éõ§ ¬O\XÚõÑ"
ÏLlp /«¯¤k DMA DѦ^S§\±ý
Kp ¢Ú£ö"ù«{Øí§Ï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 §lE,ß²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\èkS\-§, 1ù -§\½(Ä
p 1"
ù±3ü gþ4\a¯ç"Äk§XJ\k£êâp
D-cache§\§SÑ-UvķkoÀÜ>u
Ap 1g£cÑ´Xd"\Áã1\§SÑ-
ÿ§ù -´Ê33 D-cache S§CPU ØU¯êâp "¤
±1ÚÒ´éA\-p 11£ö¶@±
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"
, §\±ÏL3p /«\Ú1#-§±;ù
£Ú¢ö¶´@ï p `³§Ao´
262
10.3. p 55¯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 !"
264
10.4. ¯SgSSü9N 1 10 Ù MIPS NX(£^
Ò±?ù¯K" 4
e, ¯S{§ÒØIu²?ÛÀÜ"
265
10.4. ¯SgSSü9N 1 10 Ù MIPS NX(£^
?Ö Ö?Ö
... keyfield = WAITINGFORWRITE;
/* update entries */ ...
keyfield = WRITEDONE;
sendsignaltoreader();
ã 10.10: êâ(?Ö
• I/O Mì¯S'Xµù¬K¤k CPU"3 CPU 1g
;ö# 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©éò´Oc Àì
——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)§\I1 8.5.9 !ùã sync
-"
• i!Â8µk Àì* ÓSi¥Ü©iö£DÓ
p 1Sö¤rù Ü©öܤüö"
;òp «öÜ¿¤i°Ýö 5Ø
ûA§Ð{Ò´r\ I/O MìN4zMì©O u
üÕi/£'Xµ8 Mìlmoi!¤"
10.4.2 ¢y wbflush
õêè±ÏL1?¿ 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Ü ÀìÓæ"Ic[éÑ\
XÚ¥Ü ÀìÑ uo/§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 AOrA5§Ù§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
267
10.5. ^ C ómu 1 10 Ù MIPS NX(£^
oÄÑv'X"
static int __inline__ mymul(int a, int b)
{
int p;
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
1nöê——ÑѧüÑ\"
3e¡1§·w GCC ¦Èöê %0 ¦µÄk§^“=” ?»ÎL
«ù´£Ò´`vk73§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øþ§\±½ ´ÓÖ
§, MMì¬ÏA½®?SB^ ÿÂ"\
±l GCC Ãþk' MIPS Ü©Ñõ[!"
10.5.2 ;ìN I/O MìÚ“volatile”
õêÖö¬^ C ¯ I/O Mìè——\,ØAT^®?
è§Øko4½¦§ Ï MIPS I/O MìÑ´;ìN
§l C 󥯿ØJ"` ùoõ§\%pP4^§X?ÈìuÐ
½ö\þ¦^ C++§O(/ýÿè ). -SC\
(J"ùpÑ ²LÏ¢uJ«"
268
10.5. ^ C ómu 1 10 Ù MIPS NX(£^
·ãè§uÿGGMì§XJG´ÒXÒux
iε
unsigned char *usart_sr = (unsigned char *) 0xBFF00000;
unsigned char *usart_data = (unsigned char *) 0xBFF20000;
#define TX_RDY 0x40
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;
271
1 11 Ù MIPS ^IO (ABI)
3ÖÜ©§·´l§S úpwMÝ50 NX("
Ù50 eNMïpoN MIPS ?§Sk'IO"
ù IO7XMA55O§´~~k½?¿5——o
^«ª5§´zóäóÑ^ÓªÒ¬5²wÐ?"·
®²-LÙ¥IOµ1 2.2 !0 Mì¦^½"
Ù·we?Èì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µ
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½Â½êâÙÛ´uo"
UÀJêâÙÛÉMUå"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 []"
Ú·¤yOŧMIPS ^?Öè/ªL«kÎÒ
ê——¤±Ø+=êâ°Ý§-1 ?L«Ñ"ÖèL«ÌÐ
?Ò´Äâ$£\~¦Ø¤éukÎÒÚÃÎÒêâa.¢y´
" 2
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
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¿
¶zi!´Ø© 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
ã 11.1: C êâa.3S¥L«
}
rN:´§Eêâa.i! £þØÉàK"
êâ(½öê|3S¥éàÙ¤¹êâa.¤¦
éà>."¤± struct mixed lli!>.m©¶ù¿XXJ\^
ù (N|¤ê|§\I3zê|¤ 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’’ */
}
ã 11.2: àÀw
à CPU ¥(ÚNXã 11.2 ¤«£æ^ ;.à㤶
àXã 11.3 ¤«"
C ó?Èìj±¦§=¦éu §(N¥k(²Óâ$
S/µ\XÚà§\Ir(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
ùko'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;
};
··Üùü«á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 */
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
280
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^IO (ABI)
3êMì¥D42:ÇØp§¤± ´§kAÏÿ
Á^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£¤ëêcc£ë1
11.2.7 !¤"
XJIN^½¿{üÚw ´®?f§S§Uk
^ 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þÐ^ 4E,ªònëê?~5Mì"4·
25ÁeêÆ¥¥N´Ñ~f¶
double ldexp(double, int);
ã 11.5 Ñ Aëê(ÚMì"
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
²Lģ· û½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);
ã 11.6: D4(a.ëê
MIPS C (ÙÛ43;ì¥^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);
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.2.7 l¼ê£
.½öa.£3Mì v0($2) ¥"Uì MIPS ½§M
ì v1 ($3) ´3§¦+éõ?ÈìØ^"´±Ï"^3£
long long £64 ê¤a. 32 è¥"éuÓ^Êli!
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
• ëêøÚ^uëêD4MìÑ´ 64 "áêa.ÑJ, 64
§Ò\1Mì"
• N^öØI3Mì¥D4ëê©Òm"
• ÒÓâclëêø2:ÑÏL FP MìD4§$)
ê|Ú(N¥éà double §TØ3 union a.¥½öØ´
printf() aëêØ(½¼êCëê"
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
«§Ýþ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);
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 §·^uYmª¼ê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§=^51ø¥ëêê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¼ê
ëê¤3coim——#N^½Jø¢SIm"
ã¥ÚÒ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
Ø ëê£ÙÙÛ7LN^¼ê¤ §kÒ(áu¼êh
k"·IIOÒêâ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Áì7LIOÒÙÛ¿'&EU
wzÒv¤ ±9ù ¤ SÜÙÛ"XJ¼ê3Òþ,?
Ï^ s0 s0 §NÁìIl=pé"
3 CISC NX(¥§~~k^E,¼êN^-5oaquã 11.8
Òv§ \þéA·ã¥IP“sp on entry” vMì"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Áìlo/éÑêâ3=pQºk
NÁì4 Û§$U ©Û¼êÞA^-ÑÒv¿½
£/"´õêóäó38Iè¥D4Ü©Òv&E§
d·®?-\8Iè"
Ï·Ü - pÝ6uóäó§½Â¼êÄÜÚÜ
÷§ù±Ø7P4[!§ 7N´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
ú%ëê(§±S33Mì t0–t7!a0–a3 ±9 v0 Ú v1
¥oêâ"XJúI±^Òê⧴U Ar£/
33Mì ra ¥¿£ ra " 13
LEAF(myleaf)
...
<your code goes here>
...
j ra
END(myleaf)
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^,Êëê
¼ê§Ù¥ëê´Ò¥/"ù A4\é 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);
}
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
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Ü©LH"
.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
ùü1w®?ì3ùpd?ÈìKI"®?ìØ£Ä-5W¿©|
ò´ø§½ö)º“÷-”£Åìè¥Ðmõ^-®?-¤"
y3Tw è µ
addiu $sp, $sp, -32
sw $31, 24($sp)
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,ÒIv
3þ¡£ãÒv¥§?Èì^3Mì sp ÒU+nÒ"Ù
GONX(ÖöoæÒ~~I^üMìµÒ sp I£Ò
.ܧvk¼êÄÜMïêâ(", §?ÈìU 3¼ê
ÄÜ襩¼êIÜÒm§ÒU3ÄÜè¥ü$ sp 4§3¼ê
1L§¥Ò¥½ £ "XJù§ÛÜÒvþ
Ú sp m £þÑ´3?È®§ÒØIv "´kÿ\I
3$1öÒµã 11.9 w« MIPS N©v5?nù«I
"
o¬Ã{ýÿÒQº3, ó¥§$ C ó,
*Ð¥§±MïÙ3$1CzÄCþ"Nõ C ?Èì±ÏLk
^Sï¼ê alloca() =©Òm "3ù«¹e§¼êÄÜèÓ^
14
293
11.2. MIPS ABI ëêD4ÚæÒ½ 1 11 Ù MIPS ^IO (ABI)
ã 11.9: ¦^ÕávMìÒv
11.2.10 êؽëêÚ stdargs
XJ\½ÂëêêØ(½#¼ê§^óä stdarg.h ÷
£ANSI IO5½7Lk¤"T÷Jø ÷——Uk¼ê—— va_start()!va_end()!va_arg()"
)No^§we¢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þÝ
\½|§deü鯣'X®²u)3 DVD Âìþ@¤"¬)
·±ÏCá§mum á"
ùÒk gñ"pÝà~MXÚéØ|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Øÿ§´ko{U
.§$kU. £^^-¤5 wľu) o¯§@Òk
^ "
ùÒ´^NÁìó"3E,XÚ¥U^§NÁìIU ¯
^ è!?è§ 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Áì^g5§S1Uå"
MIPS 5½Â Xe¤ã CPU ¡S9ÏNÁü§¶ EJTAG"
´ MIPS CPU 3 EJTAG cNÁA5§¤±3ù ´Ï
§é, a.NÁ^^å5ÙGB§·¬Jù "
l——fâÑu) oº
¼ XÚXÛl“(”rØ1oNL§§éu )XÚ
$1 =Ú´ék^"XÚGJ±+n§¯céJ=
G"é CPU ó§ wC1L-½é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^zU
[!¿Â{§@o¿Ûì3¿ÂÒ´ÏÑfXÚ1
\(J"¬z§SO¢¦(ïXÚ¤U§§ò§S l
CPU äNN1?Ö£ lm5——´éuk½E,ÝXÚ§ù
Ò¿X§S éuUeUÜ´Ä÷¿A´§k
4 Vg"
3ºÝþJøXÚ1ÚmÚO&E^óäÒ¿Ûì"
¿Ûìó´ÏLXÚJ§S±9éãmSA½¯?1Oê5
¤"
EJTAG XÚ¹“PC ”À§UJø k^&E¶
´MIPS CPU kAd8IÅþ^5UOêì"ù Oêì9Ù
ѱ CP0 MìªJø§e¡k?Ú£ã"
mu< $1XÚ?1NÁ!l½¿Ûÿ§Jø. &E
MUUCXÚ1"ù:vkÐ?µ·F"9ÏmuõU¦U
ØKXÚ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Ú
ÌÅ"õÿ98IXÚ^m'uëìÚªXÚ¥
å^mE,Æ"
297
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û
ù«{¬KXÚ1µÐ´küÕNÁë"n¹
e£ ~éXÚOÀ§¿ ïáIO±BuEó䤧NÁë
A5g 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$1vk^"ùÒ´NÁü EJTAG Ï"
´NÁME,±^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 !¤
ã"
,&3XÚ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 ë¬4k^"
298
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û
• ½êþ EJTAG ä:§±Õá?§5/DêâMi
ì " CPU ½öÖê⧽öÖ/Úêâ¹Ä
2
ä:'§eKNÁÉ~"
ä:Mì±kNõ§±uJ±\? CP0 Mì8§¤±ÏL
;ìN dmseg£^u EJTAG Mìf« drseg ¤"
• \±l^NÁä:- sdbbp! Ü&Ò DINT ½ö3
EJTAG &= ,® ÿNÁÉ~"
3
299
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û
12.1.2 N CPU
CPU l dmseg «Ö-ÿ§&Ò¼"ùfå5Ð
\ØØ CPU ^xþ5T«51Ⱨ٢Ø,"
• 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
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Ѭ@
li@NÁÉ~£§¿Ø´^ deret£§U¬4\Ø·/òÑN
Áª¤¶ ´l DEPC ¥¼/, ^^ jr -"
12.1.5 üÚ$1
üÚ$1 Debug(SSt) ¿ ^^ deret -4lNÁª
£§d DERET ÀJ-ò3NÁ¸e1 ¶, U^SÑe5
^-Ò¬u)gNÁÉ~"
Ïk^-$1u~ª§UNÁÉ~¶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
ã 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 ¤«"
EJTAGver: Ö ——L²T¢yÎÜ5="®Ü{µ
0 2.0 9@
1 2.5
2 2.6
3 3.1
DExcCode: \lNÁªpff?n?ÛNÁÉ~Ï——1g?
\NÁª§T½Â"UÒ´ Cause(ExcCode) ½
§3L 3.2 ¥"
NoSSt: Ö ——XJvk¢yüÚöK 1"Ï~ÑküÚö§¤±T
Ï~ 0"
SSt: T 1 K¦UüÚö"
ã 12.1 µ
305
12.1. “EJTAG” ¡þNÁü 1 12 Ù MIPS NÁ——NÁÚ¿Û
DIB: - ^-ä:"
DDBS: - °(;ä:"
DDBL: - °(\1ä:"
DBp: - ?«a.NÁä:£~Úþ¡ÓÑy¤"
DSS: üÚNÁÉ~"
• 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 !"
• ä:±¤âÖêâ ^>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ÁÚ¿Û
BCN: ^Mä:ê"-Úêâ´©m"
)§'åä:“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!"
W: XJOêMì´ 64 K 1"ØU"
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 ù:§rX
ÚÑ“Linux”"
ùüÜ©@Ñ´ u3 1970 cd¢¿mu Unix XÚ"N
´Ï¢¿ú§vkûd§3±¤Ãc~“m” ª
ÆâÅ2©uÙ^"´§¿Ø´“m è” ——Nõ§S 3
Æp Unix ó§(Juy¦ zo¿ §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
@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——Ì´ ym$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§$1og¦#NÝ£Ï,Àܤ§o
D£^r——k@§SØâ¬Ä§"
sÓªSØN´?"\SØèSUÄ3$1
¥ä?n§S¿ 䧴\§Ø¬3\$1¥ÿ
Ù§Ì6SØè¿ ä"´sÓªSØ LÝò´§ü$
A5"
2 ÒSØ3'Ū¥§k31 wait -§"
3 lSÝwNØ´ÐÌ¿§´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§IlAzU§mp^¿^·£?1o"SMP
££A3¤k¹e¤¤3/§TÐÒI#NNÝìÊ
3$1Sا $1,§µù“SØsÓ”"
y3SØ?§Ôö8Ò´éÑèS¥@ 7LB
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 ¥NuP 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
è§$17LÜ\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[/mo ÑU
($1"
·ò31 16 Ù?Ø PIC èÚA^§S/mE"
13.2 SØ© (
l,«*:5w§SØÒ´ÏLÉ~?n§SN^~§8Ü"MIPS CPU
þÉ~u) ?\“É~ª”¸4r mé´§S
éØÐ"¤±3SØz\§\kaq áéÄL§§dz
“ ”Ee 7¸"d §\lSØòѧ\±^S2g
²LÓ §3 eret -£^r§Scá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É~ª¥ØUAi@É
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É~ª¥1AO>&"
É~ªÄþ 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"
kU——,y3é ——4¥ä?n§Sá6$1uÉ~
?§¤ó £"´ù¥ä?n§S3öXÚ?Ø´ý
§7L3,:Ú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¥äò´§zk¢
å°Ä§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"
kUÀ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)31§m¿v
kk7,éX"¥ä/^ äɳ§Ø%Ò¿ M)3T§
¸¥$1"^?u¥ä¸§ Ø7$§¥ä¸è1
É"
Sؤ' ?ÖÒ´NÝì§d§û½egA$1=§"
NÝì´~§§d§N^¶k ¹ed?u¥ä¸§N^"
¥ä?n§S¥ä¸Ü©±ùÚ§4McI¦÷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^´«“kSuf§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Ø1m
?uùª"'X§¥ä?n§S¥NÝóè(work queue)£ë1
14.1 !¤“eÜ”è§Ò?u§¸"
322
1 14 Ù ^MNÓó
4·\ù¯. . .
§Ù¢AT`´4·\ùÐA¯§ÐÐùù MIPS M´NJø
|± Linux SØ. A5"
• ¥ä)·Úmµ,¬M CPU «¿Iì¬u)oºX
J¥äNÝè3,ãè,.ö1´òÙä§
ù¥äkUì<¶kud§k7;s!ùù§!
.«Úf5"
• XÚN^u)oµ^rA^§SN^SØ~§¬u)o§N
yS5º
• Linux/MIPS ¥/´N=µùJ[;±9 MIPS MN
ÑÖ 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 M3z¨±ÏÓÎù Ñ\"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 Ù ^MNÓó
u 0x8000 0180"
1
3N^\èc§ÌÉ~?n§S¤kêMì 3
——§áufâ䧧3ò5,/#NT§UY$1c7
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
¥ä&Ò = ØÓ\:"´·Ä{ü/——NõöXÚ´ù"
3Nõ¹e§É~?n§S±âäNXÚ ÜMì¼k'¥äÒ?Ú&E"
2
324
14.1. ¥ä?nL§Úm 1 14 Ù ^MNÓó
XJXÚ¿ØNÝ,§§·´el¥ä£"·¡E¤
kMì"AO´§·r SR ¡Efu)É~ §ù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þ?¶Ù§
U3¥äNõ?n"´ ISR ØA3¥ä¸¥$1È"=¦
3·#¦UÙ§¥ä §°Ä§S®Ã^ CPU '5§v
köXÚNÝìâÙüÑŬ"3 ISR ¥1óXJkL
A^-/§Ðr¥ä?ní´NÝì±(½´Äk
¯ "
Linux DÚþr ISR ©¤“þܧ”3¥ä$1§Ú“eܧ”í´
#NÝ $1" y3 Linux SØkXÚsoftirq §±Sü$1 32
5
325
14.2. §!.«Úf5 1 14 Ù ^MNÓó
¡k <ãåU? Linux é¥äA5",ü$¹e¥
äò´——lM¥ä&ÒÑy?\ ISR mm——é§ùØ´
Üó"JpA5§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 e4§
wØ¥ä"¥äd«¢öXÚ3/e?n§r Linux ==
¢öXÚ§" Linux B¥ä§¿vkýBM¥ä¶
´Ø4 RTOS NÝ Linux ISR"
Ñ´§ùü«{´pÖ¿——kndϦöo"
14.2 §!.«Úf5
§7L¿£§3öêâkUÙ§¿u¹Ä¤5
Linux
¿"¢yõ?ÖöXÚ-Ì(JÒ´éÑ¿o¤kù«S"¿
u¹ÄU5guµ
• , CPU $1èµÑy3ýõ?nìXÚ¥
• 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ª"XJrE,öt¤f5§Linux K
¦^£" £Ò´ö¬êâ³y§¯êâ¤k^Ñpܧ
6
gk§±öêâ"?Û¿¯ö3Áã¼£ÿÑ
c§(å"
3êâþ1f5öSèã¡.«"¤±·
Ò´4¤k¯¿êâ§ùµ
acquire_lock(contended_data_marker)
£´¿Âþ&Òþ«4{üA~——´l Linux z½Â{ü§
6
m©N´n)"
326
14.2. §!.«Úf5 1 14 Ù ^MNÓó
/* 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ØU1¿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õå±;
U5æ"¯¢þ§<5ÒÏ"¥ä?n§SSØÙ{Ü©
mk{ü ½p"
MIPS NX( o5Ï¢y{üföÚ£Qº
328
14.3. XÚN^u)o 1 14 Ù ^MNÓó
1¤"eï 2.6+ Sؽ CONFIG_PREEMPT À§£^£^B¼
3¼ÚºömBsÓB^"
Ð §ÄþÒù "“A¤k”´x^c"´ó¹e§,
ãêâöþ´ SMP S£²w~fÒ´3Ï CPU Akêâ
¤¤±¿ØI£^£§(IsÓ§ÏÓ 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,"1S5k'——<@
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ìkA
Ïè£8 = “sys”¤". É~?n§Sò¬âTû½eÚZ
o§¿SØXÚN^?n§S"
@´ü\:µA^§SêiëêÀJAzXÚN^õU
¥="XÚN^6uNX(µMIPS þé,õUXÚN^Ò
UØÓu x86 þéÓõUXÚN^Ò"
XÚN^ëê¦U3Mì¥D4§ùk|u;^rmÚ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
?n(Nëê½ö£(N(J"
329
14.4. MIPS/LINUX XÚ/= 1 14 Ù ^MNÓó
?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 ——NkU¬d,
XÚN^¤ÓõU" 9
n§SwÉ~#m©/ uù ¼ê§Ò£°%E
Ø?n§S"A^§SÒ¬uxo°îx&Ò§´SØS,Ã"
lXÚN^£´ÏL syscall É~?n§S( eret -£"
:´£^rÚ£^r-mÓ1"
14.4 MIPS/Linux XÚ/=
3·m© )N¢yc§kéókNÓ+"
ã 14.1 ´ 32 MIPS/Linux XÚþ§;ìN«¿ã" 11
ùN7LMN§¤±^r¯;«7, ueÜ"
AP4e¡A:µ
·fSØo< édÉÓ(/L«“·±ké£Ø L·N¤"”
9
Ù¢´-/L"
10
11
64 MIPS/Linux XÚNÄuÓn§´duMNE,——ëã 2.2
——Ï éæ:"
330
14.4. MIPS/LINUX XÚ/= 1 14 Ù ^MNÓó
332
14.4. MIPS/LINUX XÚ/= 1 14 Ù ^MNÓó
• ÛõÚoµ^rA?§SU¯§S/ u kuseg ;«
£$§S/¤êâ"ù§SUöXÚ#NS«"
d §±üÕ½z¡½o¶öXÚ$±Ê
¿ CXgCè§S"
• §S©ëY;mµk MMU§öXÚ±lÔnþ©Ñ
¡EëY§Sm§#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Øþ£k3OÅÖþ¤`§UINk^´Ïù#N\
$1ÔnSØe§S"XJ\kéõsm{§ù{(
¢Ø§y¢¥XJ§SýI^L¢SSm§Ò¬Ø
ärgCêâ£ÑS§±u$1~~ú"
´UINE,©k^§Ï§S¿÷ þ3g1¥
ج$1)è"N\§SSké\8U^Øêâª
|±¶N§SkéõØ?n觴ù Ø4u)"3UI
NXÚ¥§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 Ù ^MNÓó
Ð §Linux AVg´©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ØàجKXÚ"éuÆp
X$1Æ)§SOŧùw,´ék^5§´=¦î
û¸I3|±²LÿÁuL^Ó§|±Á5½ö.
^"
MMU Ø1´ .!J[;XÚ¶=¦i\ªXÚUl
½ ÚpS©¥ÉÃ"?Û3Ù¥ØÓm$1ØÓ§S
XÚѬuy§XJ±r§S/VgNB^Ô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Ú"yA
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ÙkUJø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 Ù ^MNÓó
a§SJø Sm¥¼ê¦^"
æÚÒmøAü éuXÚ;ì·Ý!|§U;Lõ
XÚN^½öÉ~"´3zXÚN^½É~u)§öXÚѬ
Ŭ5A^§SSÑ"öXÚ±¢±yA^§S
جÏÓ^Sõ %Ù§' ¹Ä"
Linux §3öXÚØ%±gC°§§3SØp$1u?§
¸£'XXÚN^¤§Ù¢´N^°%?~§"
öXÚgCèÚêâ,ØU4^rm§S¯"3 XÚþ§
ù´ÏLrXÚÕá/m¶3 MIPS þ§öXÚ
Ó/m§ CPU $13^r§SA?§éù /¯´
{§¬>uÉ~"
5¿,z?§^rmNgChký¢;§Am
´"¤k?§wöXÚèÚêâÑ uÓ/——öX
ÚSØ´õ§pÞkü/mXÚ——´z?§^r
m/¯gCüÕm"±&?$1u?§¸SØ~§¬S/
Nö§´Ø7&?A^§S"
·JÒЩz#Np^r/µ@±|±¦^þ
;ì§S"Ù(J¦^/ªÝ飥mkãɤ§ù
´ù«/NA§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§S1L§¥§§S\1A^§S/âöXÚ
ýk½YNÔn/"
,4öXÚ3·l?§¸,ÿ::aa?
©n/=&E´U§ù¬~$" ´§·z
¹Ä§;ìN 8 ꧡ/m ID ½ ASID"Muy
/=ÿ§Ïéc ASID 9/=§ ùM 13
±NBØÓm= جt·"y3NÝØÓ/m§^
ÜÒ´\1# ASID EntryHi(ASID)"
NÅ#NöXÚ«©^rmØÓÜ©"A^§Smk
Ü©£Ï~´èÜ©¤±NÖ¶k Ü©3eØN§3¯g
13 ¢Sþ§·±wk =± ASID Ã'§=“Û”"
335
14.4. MIPS/LINUX XÚ/= 1 14 Ù ^MNÓó
§ù¿X§SU¬@:Ê"
?§/mSØÜ©d¤k?§"SØïÒ´ 3A½
/$1§¤±ÄþØI(¹Nŧ±|^ kseg0 «§r;ìN
] 3A^§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§So£;¬¤§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
U´Ðò©"´ 4 KB 4Ê9§ÙKòNõ§S襁¤±·
E,ÄþÑ^ 4 KB"
336
14.4. MIPS/LINUX XÚ/= 1 14 Ù ^MNÓó
÷¿p·¥Ç"£3ù«Yu²ÿ§;ìp Øõ§k
“ À Àì(lookaside buffer)§”¤±;ì=p Ò¤ =
À Àì§= TLB¶ù ¶¡6D e5"¤
1¯K´L¶éu 32 A^§S§/m© 4 KB §
kzêâL§^ 4 MB m"·ý{4L:§ÄK
ÒØe$1§Sm "
·r)ûù¯K?Øí ¡§´Jeéýk§S^ 32
Ï 4GB m"õꥧS3§gC§S/mSÜkã
ɧXJ·U u²«Y§;;@ éAuÉ“ovk”=
L§@o¯UÐõ "
·y3®²¯ DEC Ù VAX .ÅO;ì=XÚ §§
é NX(kX4K"VXã 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 Ù ^MNÓó
/"
• ·3 TLB£/=p ì¤w´ÄkT="XJk§
ÒÑÔn/p §·Ò ^/"
TLB ´;^;짱^«{k/"UkÛ
I w§Ñ, ASID§ù TLB ±^5N,
J[/z§¤ú^"
aq§VPN ±ÚÜ© VPN /Øë ¶- 3
å§#N TLB NJ[/"
ùü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öéÑ«{^¦þMJøÚ VAX ÓõU"
è TLB W¿´Øɧ¤±¦rÑ ÿÚ§rùÜ©
ó^¤"
@Ò¿XØ kMì;c ASID §MMU M´{ü
p!½=L ®"XÚ^±r£Ï~(^¤MMU M
w73SLêâp §¤±rML¡ TLB ´k
¿Â"´ TLB M¥vkp M§Ø :~ µÑ
Ã{=/§TLB >uAÏÉ~£TLB W¤5N^^~§"
Ï^JpǧTLB O!'Mì±9WÉ~[!Ñ
°%Ä"
MIPS TLB o´3¡þ¢y"=¦éup Ú^§;ì/=
Ú½´7L§¤±Äþ?uÅì' ´»þ"ù¿X TLB Nþ7,
§cÙ´3@ϧ¤±7LO|©5ÖÙNþØv"
TLB ÄþÒ´é;ì"é;ìzÑd'
iÚê⤶\Ñ' i§MlT' i£êâ"é
338
14.4. MIPS/LINUX XÚ/= 1 14 Ù ^MNÓó
;ì(¢~Ч´ÙM¤ép"MIPS TLB k 32 64 êâ¶ù
«Nþ;3NO¥Ø¬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
p §,wk:ÆÄí§(¢v"
339
14.4. MIPS/LINUX XÚ/= 1 14 Ù ^MNÓó
l?§Ýù§{ü´ G 3SØL¥ÚÑÑ3
å"´\/=§G qáuÑ\"3 MIPS32/64 CPU p§ü
ÑÑà?1“”ö )¤^§´k¿Â(J§\
7Lyü G "
TLB ÑÑàÑÔnÒÚþ´ ^I µ
¤Xeóµ
• kwwkvk(/=êâ¶XJvk§TgòN^?n/
Ø^"
• XJk(/=§XÚòE¢yT= TLB "
• ÁãéT\§Ò¬u)g¶XÚ^ò@Ñù´Ü{
ö|^ù¯373SL¥“modified(?U
L)” ——ÏT ?u EntryLo(D) §¦ò5ö±Ø
u)É~ ~?1"
• \ TLB ¥ D §ùö±?1£´u TLB
O´ÅØýÿ§±dP4?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 éÑ'LB
´^“MIPS IO”{"MIPS IO{¦3 kseg2 Âþé
¤5L£¢SþجýÓ^õm§Ï kseg2 «/?1N§
L¥ÉجNý¢;ì¤"´ùÒ¦z§|k
gØÓSØN§Linux Øù«(J"
O{´§Linux TLB WL|¤n?L£©O¡“
Û?(global)”!“¥m?(middle)”Ú“PTE”¤"´|©¦^ C ó÷±
Ø^UÄè 4¥m?ØÑy——ü?(éu 32 MIPS v " 17
342
14.4. MIPS/LINUX XÚ/= 1 14 Ù ^MNÓó
tlb_refill:
# (1) get base of PGD into k1
lui k1, %hi(pgd_current)
343
14.4. MIPS/LINUX XÚ/= 1 14 Ù ^MNÓó
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
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) ?·
é vk6-?1O§3 (5) ?Òvk"
(3) lã 14.4 §·^J[/p Ú·¥=/£ u Bad-
VAddr¤ PGD ¢Ú"Ï PGD 3z¥Ñk£oi!¤§
·Ir¢Ú£ i! £þ"\ØU{üm£ 22 §Ï
\U)¤vkiéà§ùé MIPS i\1ö´{
"
(4) ë (2,4,5)"
344
14.4. MIPS/LINUX XÚ/= 1 14 Ù ^MNÓó
(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)"
14.4.10 ;ì/=Ú 64
MIPS NX(u²ÿ§32 CPU ®²Ñy ãm §
§Sê⮲¯O 100 MB ——/me 6 m" Ïd 18
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Åì'è"ÙweÙ§IAÏ
MIPS è/"
cü!9õê MIPS CPU 3?§B5ÚM{ü5mïµÄ
k§MIPS p ~~^^+n§Ùg§MIPS CP0£CPU ¤ö
kIÄ6YJ"·e5òé¯wHk' MIPS õ?n
ì£SMP¤Linux XÚI )£" !yúN^DÛª®?
óè\¦^ªÇépSØ~§"
15.1 +np
3 x86 CPU ¥§Ò´ Linux Ñ)/§p Ĵا
dMo§ÒÐ3ÚS"
MIPS XÚØ´ù§Ù¥Nõ MIPS Øp vk?Ûa.
“5”M"Linux 7L?nÐA¡¯K"
15.1.1 DMA
DMA 죦p SNL¤½öÖ£ULÿ
£p êâ¤;ì"3 XÚþ——AO´ x86 PC þ——DMA
ì¬{rk'êâDÑ&EwMp ì§p ì
7gÄ¢½ö£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 m5§
UGÑ 5Ud"3 MIPS CPU þU¢yÒ´Ø^p
§ùGÑ5Ud´ØÑ"´ À«´?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)3oÿNN^ù ¼ê`²"
éu¢y ýp 5M§“sync”¼ê"
ùã API © ^ck Øþ"k4^ 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”¼ê
kf"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ö11@£±r
p æ^J[/¢ÚÐ?æ^Ôn/I\Ð?(Ü
å"ùUp 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\\11ê
⮲ u L1 ¥1u)K§CPU Ò¬)É~§±^ùÉ~5
1nó"
´Ï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Ú^TJ[/ÑäkÓ
“Ú”£Ò´`§J[/±ØÓ§´§m 7L´p
z|Nþê¤"3“ÓÚ”¥üg?¿êâѬ;3p Ó
¢Ú (?n"y3¤k^rmNÑáuÓÚ´
U——õSNë1 10.3.4 !"
´Pª BSD XÚØÓ§Linux Jø A5¦y(Ú
CØU"ù)@ ÓQk^rmNqkSØmN/£3
MIPS SØþ§Nõ¹eSØ“N”´ kseg0 /¤"¤± MIPS £I
kAÏèuÿù«/§¿nK?ÛPKN"
p /TLB © £=þ!J Documentation/cachetlb.txt¤
]c}Á§Áãrp K¤J[p “,«w
G”?n"§Jø 5¿¯§Ì´NSØ5¦þ?nÚ§N
?nSØ/^rmK"
7p K?ó[ج(å"Lù c§<Ï"
Linux Jøõ-Ä<%õU"§S ££ SX?KU»Ü{
è/§´X#õU\\öXÚ§q¬Ñ#¯K"· CPU O
öy3@£ ^ÑK¬E¤Nõo¯Kµ5õ# CPU
D-cache vkK¯K"
MIPS Q²´ékKåNX(§¤±Ù¿ö§¢/ì §
ض (JQ§Ù§NX(pk p K"
1
1 XJ´ýªÁ«/ª{§@oNX(ؽuóÂ~"
350
15.2. CP0 6Yx 1 15 Ù Linux SØ¥'u MIPS ;¯K
15.2 CP0 6Yx
X·3þ¡~f¥¤w§6u, CP0 Mì CP0 öI
c[?nµ6Yéuù öXÚ;^öØo´Ûõ"öXÚ
,´¤k CP0 öu)/"
3y CPU £ÎÜ MIPS32/64 15¤þ§±^1 3.4 !
xo-£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±Ym§4\
U O7LLõ^-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
lm©OÒéùaXÚO?nì§SGI . MIPS õ?nì
ÑÖì/?OÅÑ´4¤õ¬"
´§ù Eâ¥é´;é MIPS §¤±·´{üJe"
·ù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 \ ;ìò"XJvkNþ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Ŭ"
\Ip ´ù§ÚÏ~ª°Sêâ§O
CPU ¯ÓêâUgÄ£O¿?nù«¹£õêÿ%%/
¢/°Ò1 ¤"ÏéuèÚ^é§ùDZé
p"
tÙäNNos¤:m"8cíÑXÚ´ùµ;ì
±éAp 1£Ï~ 32 i!¤ü ?1+n"zp 1
´Öêâ§Ò±E?¿êþp p¶´ CPU 3
p 18,p ;^"
L5§3z CPU p¢y´z73p 1o²(½
ÂG"oÆ|ªzp 1½GŧG=
d/ CPU ÖÚp muxE>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
ÚSmWÚ£ö5"ùÒ´op k“if
p "”
üoXÚØ´*Ðõ CPU ½öépªÇ"yXÚ¦^\E
,p m!p ÚSmëä¶ù¿X\ØU6i
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\ OUå"®¢^ SoC OÚÿÁ{Ø
UGépªÇ—— §3?Û¹e§$1u 3 GHz!õÑ 70 W ¿
)ûÑ9¯K?nì3¤a¥Äþvk¢^d"éJ3 SoC þ
EüifoaÀÜ"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 ä§ùÒIE,p 5Æ"
4p SMP MUó§Up/ó~(J"3ù
ãåL§¥§) õXÛâUÐD²N¬"3
Linux SØùaèF!õ CPU A^c§ù ÀÜ0 e"e
¡´ ~Þ^¯Kµ
• ÀJØI5+nµp 5dgC?n§´XJö
XÚ±wM@ Ø^½Ø5+n§@o5U¬Ð"
ÖØI+n——§5gS§p ±âIE?¿õ
°",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®ü§êât5+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:¤êâ# "´ \lm7üÏ^o
ïXÚ§éJyÖU±égS"õêÿgSUvk'
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,§Smó,&E¦£ù«¦S
üѤ"
ùp¢y clear_page() æB Ag"§ÐmÌ——zgÌØ
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 yp
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)
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
jr ra
nop
355
1 16 Ù Linux A^§S
è!PIC!¥
$1A^^ GNU/Linux §±Ün/¡§S"õêùaA^3
\1òcpÕáÜ©©3å§ùL§k6u«-?a.
Ã'è£position-independent code§=·IK¥ PIC¤"3·m
©ùK8c§5¿´ Linux SØ¿vkr\^?ÛA½ª?È
ÚïA^§S?èµSØéu^rm¯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¹Óóü¹Ä§Sm£U¤§S
è"ë§Sg±PkØÓ;ìN¶Ø+è uJ
[;ìo/§ègSNÑ7LU ~ó"é{`§
éu¤Äó§Sü?©vk{"·¡“óü(link
1
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
"óü8Ièéù Ü/䵧kÎÒL§ÏLÎ
2ù«`{Lu{z "#NóüèN^ ܼê½Ú^ Üêâ§Ò±r?Û
ÀÜÑ? GOT"
357
16.1. óüN¤§S 1 16 Ù Linux A^§Sè!PIC!¥
ÒÚ¢ÚmNl 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óüØ+3o/ÑUó"
´kUïÑù§S§Ù¥ØÓóüJø ÓÎÒ" 3
u)ù«¹§Äk\1óü“Ñ”§JøCþ"
kù´Ø§¬ó}§´k ÎÒA¿I£kõkS½
3
£\11½ÂѤ"
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
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Ú?èØIE C ¥¼
ê" E,¥~¦{üA^§S/"
• ?¥¥"Ò? ¤k6A^§SµXÚ¥E,
è u¥¥§¤±=¦üXÚUSC ØÓA^§S8ܧ4
¥±ü?©Ó±Ï#E,kÐ?"
• Jø¢3V\ #Àµ\=,¥¼ê½öSؼê
§\±Jøæ^#A5#¢yoN¥"
• ¥3A^§SÚSØmJø l µù4A^§SÚSر
güÕüz"
§Ä¥è'·ó C/C++ Jø «p?mu¸"
Ø ÏL GOT « ÜN^ÚêâÚ^¤51mm §Ä
ó¥kØ|Ï"k Ä\1§A^§SÚ¥Ò\~E,
6'Xm Åصù¦SC#^N´Ñ¯K§íØXÚ¥
Î^ÒN´Ñ¯K"èFÄ¥u¢ÚI£XÚ´7Ø"
@Ï Windows XÚQ²É϶èÍ“DLL /”(6§Ò´ÏØÓ
A^§SéÓ¥¦pØoN"
yXÚ£Windows Ú Linux a¤qE U èl6
'X6êâ¥XÚ"Äóè¬3e§l;m²
LÝ5`§§éukþA^^?Ûi\ªXÚÑé"
360
N¹ A MIPS õ§
õ§M´ 2004–2005 cm9OÅ.“eâ»(NBT
" 2006 cØ2@µJ[zwþФ Tc
——Next Big Thing) ”
Ý NBT§TEâþgQ3 1975–1980 cm¼dÏJ"õ§9,
®²L §õ§Eâ5E,ØQ~ò"
¤±·Áã½Âeo´õ§§, ¯§kok^"·^“õ
§(multithreading)”Ø\ëiΧ^ “MT”L MIPS32/64 NX(
*УMIPS ASE¤"
A.1 o´õ§º
§Ò´Uì§S ¿ã^S1-S"
ù½Âwþýk:{ü§%4“§”¤ U5ÃÀ
Ü£÷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§´7LNA5I¦"k ¯
KPkS3þ¿u5"£nØþ¤\±§S§A^,«õ´À
JN^5eZ¯!éѯ¿ N^A§~§"½ö\±u
²¿u§SOó"
´¿u§SéJ§l5vk«¿uóý2A^"3
1970 c§'uO!?ÚÿÁ?n¿u¯§S¢^5ïĤ
(Ø"ïÄöªÊ33æ^ÏL{ü½ pKõ{ü
§gþ"
éuù ´Aæ^ÄuED4´Ä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 ±"´ù¦Ðõ µ·¯´
Ioº
ÏLw£$1uDÚ CPU þ¤õ§öXÚz§±
&E§±éù¯KYéÐ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§
´\MU $1yk^@òék`Ñå"V?nì x86 PC M
£cÙ´Ù;' x86 .ÑÖìM¤®²Ñ5ÐAc §Microsoft
Windows!Linux!±9Ù§ Unix ®²N|^@«M "¤± Intel
3Ù“§”CPU ¥íÑõ§Uåÿ§§Or MUå¦k
õ§ CPU XÚU Ø^?UÒ±$1V CPU XÚï^"
3 MIPS þ¢yù:§\Iz“J[?nì”üÕJøMì
"
@´ü«ØÓõ§{"MIPS Aæ^=«º3·£ù¯K
c§4·kÖSeoù"
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§;ì¯meü §´==
362
A.3. MIPS N¢yõ§º N¹ A MIPS õ§
o§l 1985 c 180 B¦y3 50 B¦" 1
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{ü8M
ì CPU ] ó"´@®²ØáuNX(§ ´áuäN¢y ¶ù
á\7LÖ CPU Ãþ"
MT 5vkM55½§´¢S MT CPU IU¯§§ÄK
§mU¬¯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$11^-
/"§Ø´ÊG§vkõ¿Â"
• TCStatus: TC “¢3”——SØ/^rG!ASID!±9-8À
I£'X¦U2:I¤"kIL²§Ê-
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 4U´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^§SIz¿u5§\AÄzÉ~——\
±^3 ITC ¯½ö yield ^þ{l§",SüÉ~?n§
S£¦U@/¤7G±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 ÑUA¥ä
É~——\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 5O\ 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 5Jø ùA5§¦+¿vk`²N
¢y"NÝüÑ+nì£policy manager§~ Ñ PM¤´ CPU Ü
¬Ü6§±éäNA^½"PM z TC )¤ 2 `k?"3
Øp¡§o´`k1$1p`k? TC§ Ø´$1$`k? TC"
y3Ò5µØmu< æ^ùY¤õ5L@"
A.3.5 ^rħMfork -
õ§Mkék¿gvkû^z&¢A^§Ò´Jø,
«uy9|^G1{¿15{"~X§Ì±ÏLü§
©O$1ÙÛêÚóêgÌ5`z"
XJù3oö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ÚÏLo©|ÒX´d s TC À³£ÏLI
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 þ´kU"XJ\k®²^ Linux ¢y PThread §
API £¡ NPTL¤A^§S§@o\rTA^§Sù Linux þ$1
ÒU|^õ§õU "
SMP XÚI3 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ÂØC34-K xMlz 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 úiy² ±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 ¢ypA§SO
MT k1öæ^,«{´^;^ TC JøCMUå§Ù
Am±ÕáuöXÚSu)$1uO VPE þ, TC ¥?Û
¯"ùXÚkF"3ü¡ÑZ(Jµéup èJø
B?§¸§éu¯¯A4. MC{ü"
ù«XÚþ$ è4IpÓÚÅ"'å?nì1ݧ
=¦´ I/O ÖÝú´Ú÷1"MIPS MT ½Â ü«Åµ&Ò4
(yield-on-signal)Ú;(gated storage)"
þ¡J` yield -äkVA^µ§Ø´^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«AA?ÒÑ\&Ò"Ù¥
&Òk§3^ yield -þÿ. §á=m©1"
´\UUDÑêâ¿ 3^§m^ÓÚÅ"
XJ´ù«¹§;ìÒ þ^| "MIPS MT ½Â;ì
AÏÔn/«§3Ù¥Ö-¬{l"Ö;ì
§3TÖöþ{l§êâ¤õDÑ."±r1ª¤
ö£4z§ÂÉ~¤"
3pêâ6U¬Ø½êâ¬(^¥ä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(²þ-Ýkni!"
MIPS16 O\ «ª§3ù«ªe CPU ±é½Ý 16
-?1Èè"õê MIPS16 -Ðm ¤^~ MIPS32/64 -§
éw,ùU´É-f8"' Ò3u¦ùf8Up
?è@Ü©§Sv §±¦§SoNwÍØ "
,§16 -¿ØU¤ 16 -8"MIPS16 CPU ´k 32
½ö 64 Mìý¢ MIPS CPU§Ù$Ñ3Mìþö"
MIPS16 Ø´-8——'X§Qvk CPU -§v
k2:$-" ùvk'X§Ïz MIPS16 CPU 7L$1
1
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 §SU' 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 ò¬ Ý å§kU`þ~ MIPS
è"
du5U§MIPS16 è3kþ;ì] Úo°OÅ¥
vkáÚå"ùÒ´o§´«À*ÐÏ"
3ÙA^pà, MIPS16 ò¬^Ø EâÐm¿"ÊÏ
MIPS §S^Ï~©Ø {Ø ? ROM ;ì §ò¬'Ø Ó
MIPS16 è§ 'Ø LÓ MIPS16 èѶ XJ\XÚPk 2
• ¦\\ö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 -8SJ
ø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 ÀJU·ÜuùÄp5U½ö?§B5
|ܧ´Ó^õ7¡¡È"
DSP ASE Ú\·¦ MDMX 3¢S^¥2A^U5
Jø qnd§¤±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ì"
376
MIPS âL
ÄOÿÁ(benchmark): ±$1uNõØÓOÅþ^±'é5
U§S"ÄOÿÁlE^5ÿþA½?Öè¡äüz¤þ
@§ùéuXÚ?n~A^§SݱJø&E"
Berkeley Unix: ë BSD Unix"
377
MIPS âL
©|ýÿ(branch predicaion): « CPU ¢yEâ§Ù¥óu6Y
cà{üÜ6£O©|-¿ ßÿ©8I"6Yãâ
ßÿ?1§ Ø´^S"CPU I, Å3uyßÿØ?
1£ò"
(JL²ØIpE,Ý©|ýÿJÒéÐ§Ø {ü 32
CPU ÊHÑæ^"
ä:(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 ´1P
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 Lo¿
g"
õê C ?ÈXÚ^ “.bss”¶© mvkDÐÛCþ
êâ«"
âuÖ±Ï(burst read cycle): MIPS CPU £Ø é@ÏÜ©
¤3âuÖ±ÏlSgÖõi£~oi¤5W¿p
"
i!(byte): 8 êâ"
i!S(byte order): ^5rNêâ3S¥Uìi!/gS"wþ
Ðé²w§´Ä|¤iÚii!N´4<· "
i!(byte-swap): =|¤ii!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§EC
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 {ü¤±
±$1up¨ªÇ"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"
!{Ï~´éoa,p &E31°§
ÚÌp ¿1#—?ÛCz¯Ñ´o"
EI\¿{âUk^¶§U4o3õê¹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
kNp 5Jp¨ªÇ"y3§uæ^|é
¡þp Ïkp·¥Ç"
p §if(cache, snooping): 3p ¥§fi, O
£, CPU ½ö DMA Ìì¤o¹Ä±éé up
êâÚ^"m©§“f”ùc^5±Zýp §3
p ';ìêâ#¹eJøp ÄKOÌ
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 11g£ö§êââÌ"
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 ÒóéÐ"3yXÚ¥é "
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§Up ¢Ú^$ 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ØÜ©"
382
MIPS âL
pÖé¡7ázÔN(CMOS): ^5E¤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): ú@^ruxEÚÂ^rÑ\ I/O Ï
"
~þ(const): C ó(²á5§L«TêâÖ"~~Ú-
å"
þe©Mì(Context register): 3k 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 Ù"
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"
±Ï(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)"
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 cmíÑæ^ 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±¡½¬ü "
5z(denormalized): 2:ê±Ã{±Ï~Ï~
°ÝL«¡´5z"IEEE 754 ½ÂªéJ4M?n
5zL«§¤± MIPS CPU ^5?n½öO5êÿ
o´g"
Ú^(dereferencing): s ¶c§^5^X5¼¤
;ìêâö"
ä(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 Ú®?ó¥éuV°Ý£64 ¤2:궡"
388
MIPS âL
اÑ(fault, faulting): ¡(page fault)"
2:ü^èFCC(floating-point unit condition code): MIPS I
MIPS III k§ 5 ISA kl"
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(¥§ùUJ£é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"
Û(global): §S éu¶iÚ3§SS±¯êâ
Pª{"kØîí2?ÛPkgC;mk¶êâ
—ù({´·(static)"
Û(global pointer): MIPS gp Mì§3, MIPS §S¥^
é½Â u½§S/ static ½ extern C êâJøp¯"
globl: ®?óél¬ Üêâ½è\:á5(²"
(ICU): ¥äü
(idempotent): êƶc§1ügÚ1gä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"TIOr5½ |Äâ¼ê°(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?¤¡
"
~~kUØ^ ICE ?1mu—ICE B ¯Kõ"
´y§ùck^5NÁ&Þ(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"
ISA: -8NX("
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?"
à(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 þ§kU3@p^ö"
Ì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ê⬼ê"
õ?nì(multiprocessor): kõ?nüXÚ¶¢¥§·r§
^ SMP ÓÂc"
õ?Ö(multitasking): £ã|±õ§öXÚ"3~
gþ§§^ÒÚe^-/x§¤±öXÚIk
,«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û"
400
MIPS âL
ö(nop, no-op): vkö"3 MIPS þ§nop Ù¢´- sllv zero,
zero, zero O¶§Ø)oJ§?-?èTÐ""
401
MIPS âL
öè(op-code): -?L«¥Ü©§é½-ÏPÎØ
MìÀJÜ©!i\~ê T±ØC
öê(operand): ö^"
`zì(optimizer): ?ÈìÜ©§ò§S«(L«/ªC
ØÓdL«§£F"¤o!mo$1¯ "
OS: öXÚ"
ÄÑ(overflow): ö(JÃ{^ÑѪL«¡ÄÑ"
W¿(padding): du?ÈìI÷vMéêâéধ éêâ
(3;ì¥L«m3Ñm"
(page): ;쬧Ï~,g¿ g,éà§ù´/
=XÚ¦^;ìü "õê MIPS öXÚæ^ 4 KB ½
§´MkU ·Ü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ÚKIoÓÚ´g,
"Ø3´§3, )/§¯KJõ"
æ(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=§$
ØCD4"
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"
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)"
£/£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ª"
4p²{§Ð u Xerox Parc§ÙUÚ£.Äþ´du
Adobe System úi@Ø4§?\¯½|U ?õa"
406
MIPS âL
raMì(ra register): CPU Mì $31§DÚþ^f§S£/
"ISA |±ù«^{§jal -^§£Ù 26 8I/vk3ev
m½=MìÉ£/¤"
Å;ì RAM(random access memory): QÖqO
Å;ì" 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
ÖöÚ£ò´¤ö"k1ÖöØ=1UJp5U"
XJ CPU o´Öêâ§@où«^¡Ö`k"´
Ö É\Kÿ§ù¬E¤5¯K§¤k
é MIPS CPU }Áùo£LSI LR33000 ´~ ¤"
Mì·¶(register renaming): «¢yp5UOÅEâ§#
N-Ï~gS1´1gSé§S ±Ø"^u MIPS
R10000"
NÝì(scheduler): 3õ?ÖXÚ¥§NÝìÒ´û½eg1=?
Ö§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): 3kõ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 "
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"
412
MIPS âL
ÓÚÜ6(synchronous logic): Uì3UMìm\“|Ü
Ü6“ã§zMì3½Û¨&Ò=Ïm;&E"ò
Verilog èC¤U^¡Ü6?Èì§õê8§ÛuN
ÓÚÜ6 Verilog è§@´¤k®nÜ CPU óª"
éU^ÉÚÜ6?1nÜ´4à(JÉ ò8I§XJ
¤õ±)5UõÑ'4J,"
ܤ-(synthesized instructions): instruction synthesis by assem-
bly "
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"
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=m1LgÌó"~~U¦§S$1/¯:¶k
dp??ÈìgÄ?1ù«C"
^rm(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?§SpZ6Ú½ö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®²LP"
´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¤Ø^UCD4
Ôn/"
VxWorks: 3i\ªA^¥¢öXÚSاdºàúi(Wind
River System, Inc)muÚÈ"
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'uyOÅN
X(Ö"§ØvÒ´þ §´þkd"éuÄVg
ùãPE,ا±'Ünd<ÃÖ¶´XJ\ú
1ndÜn{§\¬uyT¥#SN(¢Ôk¤"
3\ ïc§ue´ÄÑ 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ØIn)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
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
-"
422
ÈöÖ¢
.gpword Ú .cpadd
ùü^®?«å±)¤ Ã'a=L"d .gpword Mï
/L\±^ .cpp \þ gp ($1/"
.gpword local_symbol
Ðmµ
sd gp, offset(sp)
lui gp, %hi(%gp_rel(label))
daddiu gp, gp, %lo(%gp_rel(label))
daddu gp, gp, reg
Ðm ¤µ
ld gp, offset(sp)
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!
¥¼êó¿ $1L§"
——Randy Allen, Catalytic M©<ÚEâ
oi
• éu Linux 3ý¢Mþ$1 Z
424