Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 5142|回復: 4
打印 上一主題 下一主題

CPU exception vector 淺談之一

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-24 20:11:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
因為再深入我也不懂,所以就淺談吧~
9 D! t3 b7 c$ p# [. Y有錯請指正~6 j8 N2 [& _# h8 A- F; o# e0 q

% `) D6 Y! W; E3 t話說,身為一個程式設計人員,常常遇到一些程式跑著跑著就當掉的狀況也很合理的。, i+ e- Q/ g2 O$ `1 ?
例如:『segmentation fault』。簡單講就是程式寫錯,然後它就當了。
8 q* B4 y& m  M6 W* S" L$ e3 Q, N) ]/ M8 F0 T
大家也應該都聽過,『開機之後CPU就會到固定位置去拿指令,然後開始跑,通* [3 O4 h2 a9 w  @: a: o1 c4 r
常這個位置都是放BIOS,而這個位置通常是0』。
9 k5 R. w/ u  i) N, c6 V) Q2 O( z8 E9 z) d2 ?5 \5 W' m* V
那這個第一行指令究竟是長怎樣呢?這跟程式當掉有什麼關係?跟程式碼寫錯8 \/ Q8 _: T# h: _6 Z1 g) j
又有什麼關係?
4 Q% K0 C. E7 t/ p. j! e* F: w4 t6 A9 p' l
我們來看通常一般冷開機之後開始跑的程式碼都是怎樣的
! V: m! g" F  _3 ]. J: `( 通常就是跳到bootload or BIOS )
: ~' N/ U' S3 n3 @, e$ I) v0 Y& _. ]: H. J0 @
b start
, X2 @! _& V* m3 s" B3 m. `ldr pc, _undefined_instruction
- R3 U# n* z2 O1 T' X8 y% Qldr pc, _software_interrupt4 p; ?. E1 D. s
ldr pc, _prefetch_abort. O2 s  `+ D; P$ l. Z* s" u
ldr pc, _data_abort9 x% ?, M& H/ i6 A2 c5 n( c$ d, c
ldr pc, _not_used
; n! b3 v! {7 ?ldr pc, _irq
) @# g3 I7 e, Sldr pc, _fiq( ^1 {1 w8 N  y& ?

% \5 n, J+ \. o- q, R% u) v
: h% |: n- x2 ^上面是組語,我們只看兩行,第一行是『b start』,『b』的意思就是branch的
6 E+ A3 B- @6 L- X' A" K, {意思,也就是jump到start這個地方開始執行。換句換說,CPU拿到手的第一個! c, m' B7 m) V/ V& |
指令就是要它去找別人,顯然是相當不負責任的行為。讓人不禁懷疑那第二行第, L# L" K) t( \3 O% `% O
三行到底是幹麼的。& O% G5 K* W0 G8 T

* o% G) `' T3 q3 U- l" H我們接著看『ldr pc, _undefined_instruction』,『ldr』的意思是說,將0 g% P4 A8 u  l7 k3 L" M6 @2 H8 y
_undefined_instruction這個位址,放到pc這個暫存器當中。大家一定也聽過8 V# E! v3 q1 Q2 U* Y
program counter這個東西,一個正常的CPU就是靠program counter所指
7 ]- C& \* t1 K/ W9 Z1 M! R的位置去抓指令進來執行。換句話說,第二行程式居然也是要CPU跳到別的地方; J1 ^; S8 n* P6 ]
執行。而且前面七八行都是做這件事情。很怪吧?!!!! M5 D7 s4 V; \" n& h

# U* P8 G4 L* ]$ g$ A% w到這裡我們解答了上面第一個疑問,第一行程式其實就是一個Jump的指令,跳到* z/ \6 e' w" z$ Z8 [* s
真正的開機程序。
6 i, J% ~* r6 W; u+ F6 g4 w
0 ^* A$ ~+ L+ M看了程式碼之後,我們不禁好奇這些看起來排列很有規則的程式碼到底是做啥用. o8 @% s2 V. |/ P
的?其實答案就是『exception vector』。: x  i! k  e1 _; U6 d
8 L% T  D* i/ I/ _$ p3 C# i
什麼是exception vector呢?其實就是CPU出錯了(其實不完全是出錯),它就會
; G. t; x3 v' K+ A% l; p來這個vector找看相對應的處理函式,例如遇到看不懂得指令,他就固定會抓0x46 B$ C# V- f8 @, W2 R
位址的指令,也就是『ldr pc, _undefined_instruction』,接著就會跳到處理undefined instruction的函式去處理。
* N! }2 I6 r5 G, z, |+ A/ [3 N
! [& q# W; Q% t到這邊我們回答了第二個問題,程式當掉的時候,就是會跑來這個地方,接著再
7 @& b5 R! r& CJump到處理的程式碼。同時我們也發現,一個CPU就是靠著這個vector在處理. v$ }9 x0 |7 s0 {9 c' S
各種不同的exception。那....萬一這些vector被改掉了呢?
3 b* R" p- f0 D3 ]例如:你程式碼拿到一個null pointer,然後又對這個null pointer開始做寫入動
! U9 U/ |" E6 e. v  U作。
% K) o2 j  m2 l# g- n3 Z2 x+ m3 N" I# C9 w4 b9 y
char *ptr = NULL;
& K  h& _& Y) \7 b  wmemcpy( ptr, 0x0, 10 );& }" h( A( Z/ m( \* A* c
3 @" `. F1 t, w. j  c- [9 \
那整個OS就完全不能動了。可是我們也知道我們現在這樣寫,頂多 segmentation
  O- z6 g; z( U! efault,並不會怎樣,OS還是照樣活著。why why why?  v6 Z4 s9 g7 L, a* F' Q6 H7 u! i/ ]
原因很簡單,就是這些區段被一些方法保護住了。一般常見的有兩種方法,一種是2 U" I* d. f3 @% O
MMU,一種是cpu有兩個exception vector存上的位址。
: N: s' I; V  I% r3 p8 {1 F
. ~6 T3 {1 L( i; Q: }: zMMU可以設定某個區段的存取權力,只能readable的話,那就不會有被改掉的問: d1 i5 w& h9 N0 z+ G
題,另外一個方式是可以將exception vector的位址擺到不容易改到的地方,通常' M4 }; R( Q, Q. O
是往高位址的地方擺(high vector address),例如,0xffff0000接近4GB的位: C- x: R/ a7 S- E2 ^: N
置。(32bit 最多只能定址4GB)
8 ?- I: T- @) c1 M9 k5 ^2 {" m' c2 ~2 n/ t, D  f8 T
第二種方式,通常是一開始開機vector還是從0x0那邊抓,可是經過設定CPU,可
' n. S. M  p4 s6 ?; R3 ~5 Z" x  |& a以改變,在不斷電的狀態下,發生exception就會跳到高位位址去找exception9 \# s9 M* P/ _& R, T' ?
vector。
6 N, z, H: s* Y$ y( |, S. ~, }% j3 X5 C
p.s. 關於定址模式可能有些人沒感覺,可能要懂整個CPU的memory map之後,
$ a% o& i: Z: G) p% H1 X- n" }會比較有感覺。
9 t8 ~9 n# t8 U
/ a0 T" u3 E& {3 |$ X5 wp.s. 眼尖的人一定覺得很怪,為什麼vector第一行用『b』,其它卻是用『ldr』,
6 N9 i; r4 p7 }這個牽涉到本身指令的不同和程式碼是不是relocatable的程式有關,將來有機會: E1 |! r6 V8 R
再深入討論吧!!
4 F9 H: U+ o0 O4 D7 i  p5 ?1 a( q6 B$ z% O
---# q* w' M, I, c7 ]
想知道答案的朋友趕快call in進來
$ w8 H4 n! @/ `2 H) t- r前五名我們有優惠, j# P6 V# V; f2 P; s
現在進一段廣告~

評分

參與人數 1Chipcoin +5 收起 理由
jacky002 + 5 以資鼓勵,再接再厲!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-7-25 10:02:50 | 只看該作者

CPU exception vector 淺談之二

上面貼文本來的用意是要點出,為什麼一個CPU需要有擺放兩個exception vector的
( k8 I* H, z* [) {0 l! g功能。如果有看懂的話,答案很簡單,就是怕被程式人員亂改改到了,這樣會讓整個OS" P" u9 l8 m2 ^& }* W4 w( W
當掉,很容易一個null pointer亂填,整個系統就掛了。可是一開始不知道怎麼帶出這
) Q- u4 J$ g8 p# n麼問題,所以文章就變長了。恰巧,也提到一些其他的東西,我們就稍微聊一下CPU$ T- q# p6 q% b4 s, |# N+ d
的模式吧。: Q9 ~$ |" q% T" y

; k+ ]! l9 S1 C. ]0 s  Z8 w: G8 A5 P從 exception vector 看得出來,CPU本身除了拿到指令一直run以外,還會接受一些% F  ?3 H, j/ d& P
exception發生,發生之後呢,便會到這個vector來拿相對應處理的指令。3 z/ h! s* `$ J! v

9 `- Q/ W7 r, M) S4 h; `舉例來說,一個程式碼被compile成使用某個硬體的特殊指令,可是卻剛好被放到沒支6 d6 U. f  X" j, d3 M! n2 k
援這個指令的 CPU 上執行,那CPU跑著跑著發現一個自己看不懂得指令,就會發出一
& n, ?5 |. G$ L0 C+ n. `個undefined instruction 的 exception,exception發出後,依照CPU的設計,以
3 `5 p: j+ s6 \" f& J, wARM來說,就會抓位址在0x4地方的指令開始執行。$ A# [3 k+ [+ M* F) R$ s
/ j; z: L9 ]& M; }& V
而這時候,我們的處理函式就有機會可以透過這個exception hanlder去模擬這個指令
+ y2 C' R" }4 v: I6 O,利用多個指令或運算計算出那個特殊硬體指令的值。這是其中一種undefined* k/ R! M% p0 B' ]6 L9 o2 ]
instruction exception 的應用。/ @( Z+ Q6 t: s# [. a$ Z0 [
3 V( X8 Y. O0 X; f  Q$ @$ j
另外,我們要提的是,這許多的exception其實隱含著CPU的運行模式,例如我們以前
9 h  R+ U( h/ H& y! ]9 W- F# _8 t7 L常聽到x86 CPU切到什麼保護模式之類的,其實就是因為發生了一些exception,為了
& i5 p; H" `5 @8 w+ M# d7 O處理這些exception,所以切到相對應的模式去做處理。
, t7 Y& {: r! x$ ^2 P/ U; }) [! S& I
切換模式聽起來很單純,其實對實作OS來說,牽涉到的事情還不少,例如切換模式之
3 T. ^: H+ j: x7 S9 D: f+ r後,為了要讓處理完exception之後,原本的程式能夠繼續執行,相對的exception
& N1 r8 ]" D8 _4 m9 whandler必須將目前狀態存起來,所以就必須實現stack來存放目前的register status
% N/ _# F4 [4 j, o(context),以便將來可以resume回來。+ q) p; O+ O; B9 p9 L4 I9 a) [7 }
5 ]; g2 P* V8 l: N+ e  V/ g; w
看到這邊,應該有人會問想說,了解exception vector的意義何在?當你要了解如何
2 D( u/ f! j7 [0 g0 \: n/ e實做一個OS的時候,其實就是要去控制CPU,而CPU的運作,其實就是控制這些模
, S9 ~+ u/ m- W式。而exception vector就是這些模式的進入點。當你對一個OS可以有透徹的了解
7 ^: a+ \9 @4 K, N( s的時候,對於系統表現出來的行為,會有更新的了解和解釋,對於debug application/ m+ |, u9 @' @) }- ]0 y2 h
和 driver 其實是有幫助的。
7 x# d$ a, o/ I5 t1 _) K
2 S" @& P) w9 @3 Y, U7 F對於各個cpu mode的說明,例如一些有趣的問題:有哪些模式?每個模式有什麼不
/ o- M0 |* Y1 A/ w/ U- @& w4 Y同?它是專門處理那些問題?有哪些種應用?這些因為要牽涉到很多assembly的程% f: s" C, I* a( E. Y& V2 z. T7 z
式片段,所以就先不深入探討,有興趣的朋友可以call-in進來,前五個有優惠喔~~
3#
 樓主| 發表於 2008-7-25 10:10:00 | 只看該作者
以上兩篇是以前貼到朋友網站的文章~
" o: H$ \, Z7 Q- j( `所以口氣比較~~恩~~怪怪的& R8 V6 Z" o* Y& z: c
請大家多多包涵~
4#
發表於 2008-7-31 20:42:13 | 只看該作者
哇.大大很厲害.                       ( T; B% C2 P. Q( U7 j& ~6 R
看完你的文章讓我受益匪淺.
5#
 樓主| 發表於 2008-8-1 10:52:38 | 只看該作者
....
7 M! p3 ^2 Y4 E7 Q" U; C....  b1 a6 c  F6 z$ f
....% d$ t3 ^; h2 x! m! O& \/ J
....
& S; M( Y) g6 a4 l....1 W3 Y% n3 R  _, ]; f% q
....
1 ]! \! i2 w9 m" r1 g....8 u6 G  q7 w) A1 p4 Y0 }
....
" D5 U  s' J1 m8 D....
5 D. V, p* C; u" t* U% u5 `...., P  R+ k$ L# r; N
....' q5 n8 E0 \3 [% b) R7 R; u
....& u) U# r! [! T! K( O% t7 S* ]
....
" N( D! b0 O7 b6 k6 M3 g....
8 O, `5 y% f; o3 l....* [6 S5 `/ [3 j$ C. N
....
! ], R1 e+ Q# r5 M文繞圖模式* N9 f& ?9 q" w; H& c" B; X( l/ E
加點字讓它避開一下1 T1 P9 R" i" r3 K
原帖由 rogeryang 於 2008-7-31 08:42 PM 發表
, V1 p" }% Z- }. W' b! g哇.大大很厲害.                       
$ c9 c  j; b( c3 f- k, e6 {) s看完你的文章讓我受益匪淺.
( G# g/ {4 \- ?) Z' f7 X
0 _/ o' o! o. ^5 }* o% Y
呵~ 感謝捧場ㄟ
# [' \" u1 |0 q4 N( o6 U3 z之前都沒人回文
3 m9 S- X0 d4 C6 O  c不知道文章是不是沒寫好
/ s- I7 n) q9 {: s4 Y+ \" z- e8 aanyway, 有交流是好
* Q: t) U' x. K2 s+ x, m有時候會一個東西不是因為很厲害
/ ^! m) D' ]! w8 J$ t0 V只是碰巧碰過所以就會了
" }# }8 T) s! h" p+ e& m+ B
& n& O" ]% G, L會貼文的目的 (以前大多是潛水居多)3 `# U8 u0 o. A
就是還沒遇上的人可以多了解3 u% y) ^; Z* p+ z! ]
會多一點的人可以進來指導一下
* m, T+ X; H4 C0 r/ M' R  r+ s3 a* H: u3 y* C7 i
[ 本帖最後由 gogojesse 於 2008-8-1 10:58 AM 編輯 ]
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2025-1-22 09:47 PM , Processed in 0.171601 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表