Chip123 科技應用創新平台

標題: CPU exception vector 淺談之一 [打印本頁]

作者: gogojesse    時間: 2008-7-24 08:11 PM
標題: CPU exception vector 淺談之一
因為再深入我也不懂,所以就淺談吧~4 R6 k9 W; I+ r* X8 L. X
有錯請指正~
2 ?, D3 e# j8 ^8 i& _8 s
2 T0 N7 Y- e+ U" c$ [) H話說,身為一個程式設計人員,常常遇到一些程式跑著跑著就當掉的狀況也很合理的。
  @. }4 ^+ u. i; E例如:『segmentation fault』。簡單講就是程式寫錯,然後它就當了。/ A2 t; V. m. C/ ?' \+ ~% ~

6 ?: A) S& ^5 H/ C: i. g大家也應該都聽過,『開機之後CPU就會到固定位置去拿指令,然後開始跑,通
. A7 `) h4 P& z' n! k常這個位置都是放BIOS,而這個位置通常是0』。
9 @. q' r8 ^5 Q' W; u' d3 _3 b+ |5 T7 R, y9 e( }, I0 I; q/ }% w
那這個第一行指令究竟是長怎樣呢?這跟程式當掉有什麼關係?跟程式碼寫錯
- h$ l. ]! s# A0 c! A% l又有什麼關係?3 h. P: H. J: |$ S' X

/ n2 R. O8 I4 g- o$ d$ ?6 h" F我們來看通常一般冷開機之後開始跑的程式碼都是怎樣的6 [* n% T$ g. d0 x  {, N1 r
( 通常就是跳到bootload or BIOS )
8 O+ |' }" ?2 y9 s6 S' p7 u0 R5 b
b start3 D; d! v6 C8 M6 P' l+ o
ldr pc, _undefined_instruction% d6 a' d, f8 z  T, _9 b1 f; Q0 O: F3 _
ldr pc, _software_interrupt; S1 n9 r' F. p8 u* c; n2 w
ldr pc, _prefetch_abort5 i# B0 L, [% I' I4 b+ M
ldr pc, _data_abort4 B5 X& u& m* G
ldr pc, _not_used
  [7 i# _+ u; k# C# A) |ldr pc, _irq& V* `4 ~' }0 {' D
ldr pc, _fiq1 v& d% Q" i& R& y# b7 Q+ [5 I) D

7 M* o! g4 v- n. _# X. t# `4 o5 t$ H5 a6 f& t
上面是組語,我們只看兩行,第一行是『b start』,『b』的意思就是branch的
7 R6 q7 s. h3 W5 l$ e% J0 l意思,也就是jump到start這個地方開始執行。換句換說,CPU拿到手的第一個
  T/ F. d6 P  d' c' ?6 |指令就是要它去找別人,顯然是相當不負責任的行為。讓人不禁懷疑那第二行第  f. w# @/ H0 @1 x% g
三行到底是幹麼的。; J" x+ h. Q% u5 p$ e
0 {8 q" u  L# E
我們接著看『ldr pc, _undefined_instruction』,『ldr』的意思是說,將2 J7 @+ l2 z. O4 w- r7 M" m4 A0 b3 U
_undefined_instruction這個位址,放到pc這個暫存器當中。大家一定也聽過; [9 z/ v; |. B9 k
program counter這個東西,一個正常的CPU就是靠program counter所指
6 \6 w, [# r& [的位置去抓指令進來執行。換句話說,第二行程式居然也是要CPU跳到別的地方
# K" M& p- \/ N1 k執行。而且前面七八行都是做這件事情。很怪吧?!!!: L9 X% F; f) }4 G8 r

' [  f$ O1 z5 F+ O  g" H' ^5 i: j3 Y到這裡我們解答了上面第一個疑問,第一行程式其實就是一個Jump的指令,跳到5 i* D! n3 j' l2 d
真正的開機程序。- V( P5 O% y& \) O" Q* Y+ C& ^
6 h# H( i6 V; ]$ U0 r
看了程式碼之後,我們不禁好奇這些看起來排列很有規則的程式碼到底是做啥用7 z# |$ `& I; B5 i% n5 g. n
的?其實答案就是『exception vector』。; C( y# I$ [/ U/ o6 W2 A( Z9 {! i& \

4 s  H' S8 G( I* ~6 m什麼是exception vector呢?其實就是CPU出錯了(其實不完全是出錯),它就會
1 Y9 V$ g) p/ q; b) }來這個vector找看相對應的處理函式,例如遇到看不懂得指令,他就固定會抓0x4
1 h) U  q- L3 ~/ r! Y# p位址的指令,也就是『ldr pc, _undefined_instruction』,接著就會跳到處理undefined instruction的函式去處理。9 k* m8 a% |: M" h
! B7 I$ S) C8 w, U! o
到這邊我們回答了第二個問題,程式當掉的時候,就是會跑來這個地方,接著再# u  u6 D  S5 o$ U' q
Jump到處理的程式碼。同時我們也發現,一個CPU就是靠著這個vector在處理
" ]7 I1 K" A1 H1 \8 u2 l4 g. K各種不同的exception。那....萬一這些vector被改掉了呢?5 u5 G  O$ g: @3 r
例如:你程式碼拿到一個null pointer,然後又對這個null pointer開始做寫入動
8 h2 h8 o; D2 Y& B& r1 D: ]" ^作。4 w! `( T" y. j, S4 q% B
7 V; i* Y2 U2 S) g
char *ptr = NULL;
% m. h* `0 Z; {memcpy( ptr, 0x0, 10 );8 \9 ^# S  Z: z( S6 ?0 z

) f9 S$ C& ]) [) _那整個OS就完全不能動了。可是我們也知道我們現在這樣寫,頂多 segmentation
( k# A6 m$ y: c2 z2 I. Ffault,並不會怎樣,OS還是照樣活著。why why why?2 ~: g0 d9 _- z- ^: Y: d
原因很簡單,就是這些區段被一些方法保護住了。一般常見的有兩種方法,一種是
* W% D- o# _, n: p* Z% d% kMMU,一種是cpu有兩個exception vector存上的位址。5 b  _- m9 q- f$ P) \# Q: Y9 w

1 z1 @& Z( i3 c+ r/ P! tMMU可以設定某個區段的存取權力,只能readable的話,那就不會有被改掉的問
/ W7 A2 m. J8 A1 [/ [題,另外一個方式是可以將exception vector的位址擺到不容易改到的地方,通常
* q. f8 q* B7 ?+ y/ B, ]8 U是往高位址的地方擺(high vector address),例如,0xffff0000接近4GB的位
$ o* a& t" Z- {$ ^置。(32bit 最多只能定址4GB)& S1 D, P: Q" p+ M; W2 A

! q) \5 N$ k& c9 r第二種方式,通常是一開始開機vector還是從0x0那邊抓,可是經過設定CPU,可* [* ]! A) l7 \  d0 t! T4 q2 E
以改變,在不斷電的狀態下,發生exception就會跳到高位位址去找exception
( X5 j. H4 S7 ovector。
  ^; w! a4 F0 Z6 [; o" R# a+ {& F$ `! c& K" M8 T% Q+ C/ y  ?3 c
p.s. 關於定址模式可能有些人沒感覺,可能要懂整個CPU的memory map之後,+ n; k/ Z. `  K2 v8 z* M% y* e; ?
會比較有感覺。: w8 a+ C4 M; U* \6 p

9 O* U& ^/ T8 n1 O, P' Z/ kp.s. 眼尖的人一定覺得很怪,為什麼vector第一行用『b』,其它卻是用『ldr』,4 t( d) @" O- `
這個牽涉到本身指令的不同和程式碼是不是relocatable的程式有關,將來有機會2 r8 V) F, C" D7 L
再深入討論吧!!
9 }! ?" X! e, R  w
( Q( o$ q' }3 P. ~---( }% `/ [. q  s
想知道答案的朋友趕快call in進來9 z$ o/ |& m  [2 [. L' x, s" O! x
前五名我們有優惠) n" K! F  c' E. Z/ f3 z. k8 f; x2 z
現在進一段廣告~
作者: gogojesse    時間: 2008-7-25 10:02 AM
標題: CPU exception vector 淺談之二
上面貼文本來的用意是要點出,為什麼一個CPU需要有擺放兩個exception vector的6 s2 Y3 `0 A  O* h/ R0 `) \1 Y) G( l
功能。如果有看懂的話,答案很簡單,就是怕被程式人員亂改改到了,這樣會讓整個OS, p2 L. F6 }8 A6 e
當掉,很容易一個null pointer亂填,整個系統就掛了。可是一開始不知道怎麼帶出這
  g" R+ m+ T9 B5 F: l8 E* ^. T9 P麼問題,所以文章就變長了。恰巧,也提到一些其他的東西,我們就稍微聊一下CPU8 r& Q  d! H% s7 l" m
的模式吧。
- d, `, X) c( `, F7 |, g+ r" p6 W4 @" _3 G: l3 {. [
從 exception vector 看得出來,CPU本身除了拿到指令一直run以外,還會接受一些
# J* [+ G3 |. r1 j1 C9 H1 sexception發生,發生之後呢,便會到這個vector來拿相對應處理的指令。
! E+ ]7 Y) E- a7 }$ E  ?6 F6 T. r9 j$ W' q; ^
舉例來說,一個程式碼被compile成使用某個硬體的特殊指令,可是卻剛好被放到沒支: o2 A" i' `% k# }6 e
援這個指令的 CPU 上執行,那CPU跑著跑著發現一個自己看不懂得指令,就會發出一
: p' ~" w; [# F  q個undefined instruction 的 exception,exception發出後,依照CPU的設計,以2 k: L) X) G9 R1 q+ W% ?) E
ARM來說,就會抓位址在0x4地方的指令開始執行。
! C4 F; I3 g) K
& E1 i5 c7 h* C% O! a' S; D  V而這時候,我們的處理函式就有機會可以透過這個exception hanlder去模擬這個指令5 F3 \- E& U. Z1 ?
,利用多個指令或運算計算出那個特殊硬體指令的值。這是其中一種undefined
- @3 G. j+ n! Q: \+ I  hinstruction exception 的應用。# l, X) l  o. [

/ Q2 }% N! r. \5 ]另外,我們要提的是,這許多的exception其實隱含著CPU的運行模式,例如我們以前2 g' L# J( I* O) A1 H) |5 D0 Z
常聽到x86 CPU切到什麼保護模式之類的,其實就是因為發生了一些exception,為了
( _. o/ X0 z+ H" ^3 i" Y8 t# [  U處理這些exception,所以切到相對應的模式去做處理。
, @9 R7 g/ U0 X7 Z3 W% k2 r& G5 j+ O* P3 e  D& }/ p% h6 ^/ _7 n3 Q/ N2 V
切換模式聽起來很單純,其實對實作OS來說,牽涉到的事情還不少,例如切換模式之
1 m1 T  @! W: r* ]! n  M後,為了要讓處理完exception之後,原本的程式能夠繼續執行,相對的exception
$ p% ]/ B5 N* E, L# K7 Qhandler必須將目前狀態存起來,所以就必須實現stack來存放目前的register status$ q3 o! F$ }! d- W4 d+ D5 @
(context),以便將來可以resume回來。
7 u9 g; @2 L; T8 _  o% w, k4 p
* d: t2 g9 p2 ~$ K1 P) o5 j0 ?看到這邊,應該有人會問想說,了解exception vector的意義何在?當你要了解如何! j; P2 L5 K1 q4 u7 k3 b
實做一個OS的時候,其實就是要去控制CPU,而CPU的運作,其實就是控制這些模% @# h2 f' p( a' b; A! c2 Y
式。而exception vector就是這些模式的進入點。當你對一個OS可以有透徹的了解9 B' |# |8 T' T0 l
的時候,對於系統表現出來的行為,會有更新的了解和解釋,對於debug application
' T$ p' e% K% f: d, e" B$ {和 driver 其實是有幫助的。
9 P# v7 O/ N# r: V5 F0 Q
2 m$ d  l0 u- d  k; ^對於各個cpu mode的說明,例如一些有趣的問題:有哪些模式?每個模式有什麼不. L. u0 o: e, ?; y2 r/ c
同?它是專門處理那些問題?有哪些種應用?這些因為要牽涉到很多assembly的程+ S1 L/ G) x$ s" n) w2 H
式片段,所以就先不深入探討,有興趣的朋友可以call-in進來,前五個有優惠喔~~
作者: gogojesse    時間: 2008-7-25 10:10 AM
以上兩篇是以前貼到朋友網站的文章~# v8 a* }  h! h5 N: N9 B! w) @
所以口氣比較~~恩~~怪怪的5 g7 w0 s: ^" Z
請大家多多包涵~
作者: rogeryang    時間: 2008-7-31 08:42 PM
哇.大大很厲害.                       $ w& s4 o) C5 ?: N" w' w
看完你的文章讓我受益匪淺.
作者: gogojesse    時間: 2008-8-1 10:52 AM
....
! l' @3 v5 ?  V$ v* k/ I2 @....
$ T2 ^2 R* l/ J....8 u: S3 l7 m, ]* {$ z
....5 n) _8 n- \! e  f! v
....
, L7 l8 M2 g! C) i....
+ c+ a- o! v4 `4 s# S: I....
3 Y8 O4 X9 J& C....) U8 f; }9 M: m5 G9 L; P1 P
....
% d0 c5 e; [* Z....
( l- S& b! t1 }. N....# s8 B3 b1 D, y! V- y
....
( \  B" d  k; Q....
- |$ L: ^( z6 U$ i) d....: T* c. N2 L9 @
....
& m4 y5 n/ }7 c* I2 i: F" `....
: H6 `/ q- S9 R2 J文繞圖模式
4 L5 ?* `! ^- D2 C% P" P: k" n加點字讓它避開一下. B0 v, g2 y/ e2 N+ a
原帖由 rogeryang 於 2008-7-31 08:42 PM 發表
  [4 e6 ~; ~) l; F1 V! {4 O哇.大大很厲害.                       
; o; N/ f/ X4 F看完你的文章讓我受益匪淺.

- S, g1 G8 n5 ?& {
* I3 w# d; t9 ?) z1 |呵~ 感謝捧場ㄟ  P7 ~) g5 \: c! o8 ~
之前都沒人回文
; c7 ^+ J" z* a7 j不知道文章是不是沒寫好" j4 I! S5 [3 }, u7 n8 z
anyway, 有交流是好
+ \& E3 g' n9 D7 c1 |有時候會一個東西不是因為很厲害
! L' U, Q$ K! R/ t  h! f; B7 `只是碰巧碰過所以就會了5 x9 b- W( \1 W+ r  T5 T

. E- z0 R$ S1 V  X  }4 Y會貼文的目的 (以前大多是潛水居多)
5 P+ e4 \- ]' b! G% q6 V就是還沒遇上的人可以多了解3 I9 b6 u2 G/ E2 f0 w
會多一點的人可以進來指導一下 % o9 s. N" X% |6 W+ R- @6 f5 ~
) Y' h+ v' [+ Y" k/ D; @+ B4 O
[ 本帖最後由 gogojesse 於 2008-8-1 10:58 AM 編輯 ]




歡迎光臨 Chip123 科技應用創新平台 (http://chip123.com/) Powered by Discuz! X3.2