Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

CPU exception vector 淺談之一

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-24 20:11:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
因為再深入我也不懂,所以就淺談吧~
# |7 ^) @; r  r( C/ n; Y有錯請指正~
  L: V' I4 k8 \+ A- Z  a8 S' Z& L! G( r& S. d
話說,身為一個程式設計人員,常常遇到一些程式跑著跑著就當掉的狀況也很合理的。
/ c+ {, _; w) j  K例如:『segmentation fault』。簡單講就是程式寫錯,然後它就當了。/ j5 Z9 N3 g3 D! z
, X" D$ J" M) o" Y& e$ [: G$ |
大家也應該都聽過,『開機之後CPU就會到固定位置去拿指令,然後開始跑,通
: L- p4 J& U5 ^: X/ V常這個位置都是放BIOS,而這個位置通常是0』。
' i% h0 [: S+ d8 s
) q' T$ `; V% O; w5 z% s0 X6 ~那這個第一行指令究竟是長怎樣呢?這跟程式當掉有什麼關係?跟程式碼寫錯# V4 s1 k! n8 J5 }. a1 O
又有什麼關係?. [/ u$ t7 F4 ?2 P% N! w. O5 Y
3 D+ J) w+ z6 l" Q5 v% w9 T
我們來看通常一般冷開機之後開始跑的程式碼都是怎樣的
5 }0 x3 M* l3 C; E( 通常就是跳到bootload or BIOS )# U; I2 u1 [* ~$ _" V+ d# e, |% Z9 R5 v

3 G1 Q0 |& K, B+ L0 z8 N; Db start8 }  Q8 o' [/ E4 b( n5 C( \9 h
ldr pc, _undefined_instruction) r. r; u6 y/ w2 b6 o: R  F
ldr pc, _software_interrupt+ B0 B$ r! `* D+ J
ldr pc, _prefetch_abort8 w' Z) Z; y0 j
ldr pc, _data_abort' C' N0 K" `+ k7 n: {
ldr pc, _not_used
5 r3 t& x' t0 `# L4 s: }0 e$ ]9 bldr pc, _irq9 r  b& G2 X: y5 r5 E
ldr pc, _fiq
# D" X' p; X: r9 c) A9 n0 L& b" x# u2 l  n2 @+ K0 T

+ ?+ |% s4 z* w8 |% \) c5 Q% b上面是組語,我們只看兩行,第一行是『b start』,『b』的意思就是branch的
8 n8 _7 a5 E* l! D4 G意思,也就是jump到start這個地方開始執行。換句換說,CPU拿到手的第一個8 f# ^# H( j/ ]. x9 }' P
指令就是要它去找別人,顯然是相當不負責任的行為。讓人不禁懷疑那第二行第; c' l1 g% K$ d# F: q- v) {9 W
三行到底是幹麼的。
5 Y. n( G0 E5 Y& v" F' [2 Y3 y# D! S6 Z0 G3 r0 u+ M$ v
我們接著看『ldr pc, _undefined_instruction』,『ldr』的意思是說,將8 w5 a9 h& A( I; Y
_undefined_instruction這個位址,放到pc這個暫存器當中。大家一定也聽過8 T# H- W; w+ W4 z4 A! m$ M
program counter這個東西,一個正常的CPU就是靠program counter所指5 M# i6 q% f. C/ w0 S1 k. O
的位置去抓指令進來執行。換句話說,第二行程式居然也是要CPU跳到別的地方3 S4 b: M3 Y8 O  N( D; P  Y: f" M$ X
執行。而且前面七八行都是做這件事情。很怪吧?!!!* T2 V! P; s4 \0 ~

! W5 m: }! G1 S, a1 K1 _到這裡我們解答了上面第一個疑問,第一行程式其實就是一個Jump的指令,跳到
! ]9 v  u( o& t8 z9 W真正的開機程序。% p, c6 {  e7 w$ r2 a4 w

! ^! Y" G: c8 A: c看了程式碼之後,我們不禁好奇這些看起來排列很有規則的程式碼到底是做啥用* ^, |" @$ c$ G3 L( T: R( B
的?其實答案就是『exception vector』。: }: T) }2 b3 j+ I0 M
  }. S1 L. Y: e  G4 a7 r
什麼是exception vector呢?其實就是CPU出錯了(其實不完全是出錯),它就會
8 N) H) ?1 e" \( I來這個vector找看相對應的處理函式,例如遇到看不懂得指令,他就固定會抓0x4+ \- ?" G+ U8 d, g8 O
位址的指令,也就是『ldr pc, _undefined_instruction』,接著就會跳到處理undefined instruction的函式去處理。
/ p+ V9 T. C9 _4 h; C
8 ]+ T- o+ L0 p. j1 P* r( D到這邊我們回答了第二個問題,程式當掉的時候,就是會跑來這個地方,接著再
2 b) E3 [* H( H; a/ @' JJump到處理的程式碼。同時我們也發現,一個CPU就是靠著這個vector在處理
* T4 I" j5 e2 g1 B: o; H1 j各種不同的exception。那....萬一這些vector被改掉了呢?
  d" c" f7 `6 t3 ~4 p, A2 L& @例如:你程式碼拿到一個null pointer,然後又對這個null pointer開始做寫入動
' Y6 Y! j. S# m2 w作。# t1 m  T8 G! m$ @- s$ ?
. x6 |# ~* o! S: o! @; d
char *ptr = NULL;
, y9 K4 \5 C/ _( Qmemcpy( ptr, 0x0, 10 );
- j* l( R2 l: T9 L2 q% b& G0 h% R% m% u7 c  ~* _- b% s, ]* ~
那整個OS就完全不能動了。可是我們也知道我們現在這樣寫,頂多 segmentation
: K% P0 w# O0 h/ R8 c7 [7 @fault,並不會怎樣,OS還是照樣活著。why why why?; L7 u& L! L+ B, M
原因很簡單,就是這些區段被一些方法保護住了。一般常見的有兩種方法,一種是
; c- [0 u9 D! M3 D5 M6 q) Z. s1 LMMU,一種是cpu有兩個exception vector存上的位址。1 s* @/ r. v0 V  b% a. X
- o$ r; r4 ]9 b+ n
MMU可以設定某個區段的存取權力,只能readable的話,那就不會有被改掉的問
; D( p3 D) l- N8 `  O& u8 L題,另外一個方式是可以將exception vector的位址擺到不容易改到的地方,通常
/ p* G" k0 C8 M* v& ?# K+ Y是往高位址的地方擺(high vector address),例如,0xffff0000接近4GB的位
6 i& |) y- v) z4 F' s/ F置。(32bit 最多只能定址4GB)+ k3 q; n6 G& N5 T  B9 ~
" P0 f0 Q5 v4 l) R- X
第二種方式,通常是一開始開機vector還是從0x0那邊抓,可是經過設定CPU,可3 Y0 `4 p/ X. B
以改變,在不斷電的狀態下,發生exception就會跳到高位位址去找exception
1 N/ _0 v( [3 C/ Z" q# {$ a4 A" wvector。. Z+ j) j; _  h+ t6 N" [

8 v4 }: n# ]$ y/ J) F7 Q4 I- k+ W- tp.s. 關於定址模式可能有些人沒感覺,可能要懂整個CPU的memory map之後,; k5 Z- m1 Q- p# k$ o3 ?# g$ B% q
會比較有感覺。
7 s5 }* A& i" c
! m! T" K, t  H" Ep.s. 眼尖的人一定覺得很怪,為什麼vector第一行用『b』,其它卻是用『ldr』,
' [$ u! l8 y9 f% b4 d. x% g這個牽涉到本身指令的不同和程式碼是不是relocatable的程式有關,將來有機會9 Y9 P5 E/ O9 A! d% D
再深入討論吧!!
+ O9 ^. i6 G, ^( X( b. Q' \+ l
3 N8 x( e; p  j  f---5 i! [$ P! W" P' i
想知道答案的朋友趕快call in進來7 W3 Z6 l: N5 X( G3 e  a
前五名我們有優惠: X' C5 y2 Y, z; J
現在進一段廣告~

評分

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

查看全部評分

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

CPU exception vector 淺談之二

上面貼文本來的用意是要點出,為什麼一個CPU需要有擺放兩個exception vector的
% ~! B7 V  ]* `* \; g  Q1 M( m功能。如果有看懂的話,答案很簡單,就是怕被程式人員亂改改到了,這樣會讓整個OS2 b8 `# _( s* ~% r0 r9 T
當掉,很容易一個null pointer亂填,整個系統就掛了。可是一開始不知道怎麼帶出這" V! }$ b8 l4 d0 W
麼問題,所以文章就變長了。恰巧,也提到一些其他的東西,我們就稍微聊一下CPU
* Z2 y  D3 J7 y, k& x$ L的模式吧。
) D+ a- S9 ?% K5 E; ^0 U
, M) T# K/ c7 J* V- R從 exception vector 看得出來,CPU本身除了拿到指令一直run以外,還會接受一些
. Q  |3 {) S, n8 J, |, Uexception發生,發生之後呢,便會到這個vector來拿相對應處理的指令。2 F& t! `0 Z! V* u5 v/ ~$ g8 J' f
4 O; \4 N$ @( H6 R* }% t3 ~
舉例來說,一個程式碼被compile成使用某個硬體的特殊指令,可是卻剛好被放到沒支
# h( r3 n" Z4 e$ E援這個指令的 CPU 上執行,那CPU跑著跑著發現一個自己看不懂得指令,就會發出一
/ g; k; A6 R0 W; t7 l- v) M個undefined instruction 的 exception,exception發出後,依照CPU的設計,以
  r; a1 \* U: N0 |! ]ARM來說,就會抓位址在0x4地方的指令開始執行。
% O8 s: H/ m6 d* P
. J8 Y* L5 N5 C: N1 x而這時候,我們的處理函式就有機會可以透過這個exception hanlder去模擬這個指令2 `5 y% R- B. v4 M8 u- }
,利用多個指令或運算計算出那個特殊硬體指令的值。這是其中一種undefined" t8 @% M6 w$ p9 e: P, Y5 w
instruction exception 的應用。, c2 n9 u4 R0 G' R
0 }+ L. I5 G% v/ k' n1 a
另外,我們要提的是,這許多的exception其實隱含著CPU的運行模式,例如我們以前- f! ^, D- G$ B3 a+ X
常聽到x86 CPU切到什麼保護模式之類的,其實就是因為發生了一些exception,為了' u, Z) {1 h& Q0 G, H$ d/ D. V
處理這些exception,所以切到相對應的模式去做處理。
+ u  f% |$ n! L* C1 r! m
7 t! }8 u: Q5 d% ]切換模式聽起來很單純,其實對實作OS來說,牽涉到的事情還不少,例如切換模式之
$ L1 W- C8 ^( z9 Z9 J後,為了要讓處理完exception之後,原本的程式能夠繼續執行,相對的exception
4 k" t% u. P' S" j9 bhandler必須將目前狀態存起來,所以就必須實現stack來存放目前的register status! O& d1 M) Q( o  z* v
(context),以便將來可以resume回來。3 s0 P' E3 m0 |9 t% {

, y$ t1 |# @4 o* I$ v! G看到這邊,應該有人會問想說,了解exception vector的意義何在?當你要了解如何
' q% X* ^, Y4 ?* Y& W1 N- q+ x實做一個OS的時候,其實就是要去控制CPU,而CPU的運作,其實就是控制這些模
. w% k- F1 X$ W& a- Y' |3 V" p式。而exception vector就是這些模式的進入點。當你對一個OS可以有透徹的了解* c: N+ b2 Z. t* L3 n5 N! L5 c# x0 M  h
的時候,對於系統表現出來的行為,會有更新的了解和解釋,對於debug application8 R7 o4 t; W& R
和 driver 其實是有幫助的。5 Z- Z4 G1 ^0 C5 q
% E5 ^: {2 U( w+ o
對於各個cpu mode的說明,例如一些有趣的問題:有哪些模式?每個模式有什麼不2 x' p3 c/ r  N7 I$ m! g+ h: A
同?它是專門處理那些問題?有哪些種應用?這些因為要牽涉到很多assembly的程1 X" x/ c8 _  ^0 S
式片段,所以就先不深入探討,有興趣的朋友可以call-in進來,前五個有優惠喔~~
3#
 樓主| 發表於 2008-7-25 10:10:00 | 只看該作者
以上兩篇是以前貼到朋友網站的文章~( e6 M! X1 d! B6 S) [+ D
所以口氣比較~~恩~~怪怪的
+ K2 x7 ^9 }% {請大家多多包涵~
4#
發表於 2008-7-31 20:42:13 | 只看該作者
哇.大大很厲害.                       % ?# q5 ]* b1 O' r
看完你的文章讓我受益匪淺.
5#
 樓主| 發表於 2008-8-1 10:52:38 | 只看該作者
....
! k9 W1 j* C4 @2 V# ~....
, i- ?# q( D  }4 Y% r..../ u. n6 ^3 G+ C. m0 \! n% L
....6 c- r# Y) s9 ^- Q) j! u
....% Y9 A" D* ~1 D; |2 c+ M
....9 O* ~# u+ G5 D0 i' l
....
& a0 E. i5 |1 Q! v0 n....
' l- w7 m2 O- Q) a) @* z* q....6 P9 E9 A+ ]  S8 G. ^" S) m
....
# v  A. F2 R1 \% W/ Q3 ~...., K7 g/ s( C5 o9 m3 m% |
....
4 g) f2 _- `  ?, F2 c) O....
) z2 L& ?" [1 y2 n; a* v2 \; f....) R+ b" q. }0 B' q; {
...., d2 S+ t7 R- W
....& |9 l/ H0 N8 @! F
文繞圖模式
& [8 A% B/ R5 _. y2 \5 F- f. l) P加點字讓它避開一下
9 Q' {9 V, `+ t; K  v
原帖由 rogeryang 於 2008-7-31 08:42 PM 發表 ; h; c0 w' q7 ?( Z- }/ F
哇.大大很厲害.                       & ~/ ?0 s, f4 c/ p$ s8 a; z3 D5 i
看完你的文章讓我受益匪淺.

8 F# l/ g# E% Q! n+ H1 L6 g
9 T9 l5 }) U4 F  |呵~ 感謝捧場ㄟ/ \( C; c3 p: P- t
之前都沒人回文
1 N3 @& z6 a0 @+ y$ ]: s, ]& L/ r& i不知道文章是不是沒寫好
& c- T( X" ]5 J0 e, n5 O$ uanyway, 有交流是好
' W$ B" ?8 g- t  v( M5 X有時候會一個東西不是因為很厲害
  o% a9 C/ q5 S# d% b. V只是碰巧碰過所以就會了& C* ]7 B% x; c1 F% T5 f) N4 `
: Q, o% H: E, V  ~  R8 n
會貼文的目的 (以前大多是潛水居多)
; {+ x6 ^! K( y& d7 G+ N就是還沒遇上的人可以多了解
# T0 a4 _" c, J2 f0 f$ ?( Q3 w會多一點的人可以進來指導一下 " E8 E0 K6 _/ B+ W. q4 m9 [* j9 Q
+ p' r9 ]4 M6 q/ [; ?& `
[ 本帖最後由 gogojesse 於 2008-8-1 10:58 AM 編輯 ]
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-21 01:54 PM , Processed in 0.176010 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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