Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

CPU exception vector 淺談之一

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-24 20:11:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
因為再深入我也不懂,所以就淺談吧~
$ V1 k( M3 L0 z" r0 v* P8 u( f有錯請指正~
8 U  m: o, }  K6 i5 C& `8 b: d
. N; x1 M( }; X/ r3 I話說,身為一個程式設計人員,常常遇到一些程式跑著跑著就當掉的狀況也很合理的。
" W1 H) J- z  _; [例如:『segmentation fault』。簡單講就是程式寫錯,然後它就當了。. g" f: R3 S* s( ]5 z

! Q  T: }) H  D2 w: k' K大家也應該都聽過,『開機之後CPU就會到固定位置去拿指令,然後開始跑,通+ ^! v1 l3 D8 J- x+ M
常這個位置都是放BIOS,而這個位置通常是0』。
( Z6 y; i8 X& y9 Y4 P
0 y: `+ ], P- J) o& t那這個第一行指令究竟是長怎樣呢?這跟程式當掉有什麼關係?跟程式碼寫錯& p% F% {, r1 w0 L
又有什麼關係?% Z5 M( b' P; ?
. ^& D1 X2 t5 v4 d1 F% o
我們來看通常一般冷開機之後開始跑的程式碼都是怎樣的! p6 ~0 A! }* R$ P. z2 I
( 通常就是跳到bootload or BIOS ), X  k: Y8 d6 O- g# n

& }+ C- J8 A0 Y" _: j- Rb start
& y3 N/ z- X: N! _1 s9 C7 N7 i* oldr pc, _undefined_instruction
) B/ O% z9 O; k, v! ]ldr pc, _software_interrupt
3 v8 v$ z# n' _/ ildr pc, _prefetch_abort8 `0 i5 d, N5 C5 R. u' w% @6 z# G, x
ldr pc, _data_abort: {% L, m0 _! l; b8 y. Y
ldr pc, _not_used5 p1 {+ ]& A* N/ m2 R! G4 V
ldr pc, _irq# C, d7 Q; r& Z* U
ldr pc, _fiq8 A2 t3 `) m( l6 ~( B% s

& [  o8 T5 c: X! J9 d' \  p0 N/ G2 F4 i( X8 g8 R3 b
上面是組語,我們只看兩行,第一行是『b start』,『b』的意思就是branch的
4 ~6 t$ [5 m1 ~. `: _意思,也就是jump到start這個地方開始執行。換句換說,CPU拿到手的第一個$ ~0 U# K) S* ?9 }5 u2 b6 g
指令就是要它去找別人,顯然是相當不負責任的行為。讓人不禁懷疑那第二行第# D. P# v+ }% X
三行到底是幹麼的。* D2 j2 T  \. ]7 Q: p! P
$ U0 d# \, K8 o- H* R. a9 l
我們接著看『ldr pc, _undefined_instruction』,『ldr』的意思是說,將
6 r7 N+ j) b9 Y% x_undefined_instruction這個位址,放到pc這個暫存器當中。大家一定也聽過
0 g! {1 T" n2 G) P, f% T9 mprogram counter這個東西,一個正常的CPU就是靠program counter所指5 Y7 Q) ~  h/ p# O* m# @4 A
的位置去抓指令進來執行。換句話說,第二行程式居然也是要CPU跳到別的地方8 H* E. D5 }8 A7 o4 W- g7 i
執行。而且前面七八行都是做這件事情。很怪吧?!!!1 C9 _! L' _6 q

; D  z5 W( i. |" \1 a; b到這裡我們解答了上面第一個疑問,第一行程式其實就是一個Jump的指令,跳到
3 K/ y2 p" z- c. A) Y* w) _7 b' O" M真正的開機程序。
# c& z& n$ e! b# `5 k5 Z
6 J& f) M- G% V9 n+ G5 x看了程式碼之後,我們不禁好奇這些看起來排列很有規則的程式碼到底是做啥用
+ q7 K. `1 J7 h+ y) g9 @, F的?其實答案就是『exception vector』。3 ~+ }8 J6 w9 f0 x; V

3 S' I2 P! e$ u8 H, M0 [什麼是exception vector呢?其實就是CPU出錯了(其實不完全是出錯),它就會
8 _! y, ]- m  N7 K來這個vector找看相對應的處理函式,例如遇到看不懂得指令,他就固定會抓0x49 ^8 I9 d- w! o. J: v( Y
位址的指令,也就是『ldr pc, _undefined_instruction』,接著就會跳到處理undefined instruction的函式去處理。
# G/ W3 }! E) V" |0 x* x
9 Z, E; t  x: U: {8 w到這邊我們回答了第二個問題,程式當掉的時候,就是會跑來這個地方,接著再
9 d2 u6 i, E5 H2 D  H  zJump到處理的程式碼。同時我們也發現,一個CPU就是靠著這個vector在處理
9 |3 k) D1 p- m3 L6 C8 N& l4 s各種不同的exception。那....萬一這些vector被改掉了呢?
: C: g3 k* h5 g/ b" m例如:你程式碼拿到一個null pointer,然後又對這個null pointer開始做寫入動/ T+ o8 u4 {1 o6 ~% T9 a- x4 G& P
作。
6 `# {6 N4 i1 @5 K# o  n7 `: _5 n. N9 }
char *ptr = NULL;0 u3 j9 Y- O! k+ x5 m' P3 C
memcpy( ptr, 0x0, 10 );1 e! _7 L4 V5 |  W* b) M

; L" b$ w' ]8 ?2 F5 w! ]% p那整個OS就完全不能動了。可是我們也知道我們現在這樣寫,頂多 segmentation
) A; r7 ~' F/ a+ {1 C# ^fault,並不會怎樣,OS還是照樣活著。why why why?
7 g  k" J8 H) y9 g1 r- W! p: T. F原因很簡單,就是這些區段被一些方法保護住了。一般常見的有兩種方法,一種是
8 _/ R- ]+ \6 u2 IMMU,一種是cpu有兩個exception vector存上的位址。
9 c8 w; n) O/ v/ R  S7 i) r
: z0 j8 `: P- m! L, jMMU可以設定某個區段的存取權力,只能readable的話,那就不會有被改掉的問( h$ V+ M% b  L2 T9 m+ W8 n4 y- B0 X/ }
題,另外一個方式是可以將exception vector的位址擺到不容易改到的地方,通常
  @+ s" c2 O: w, m是往高位址的地方擺(high vector address),例如,0xffff0000接近4GB的位
6 B+ R& H: i" O9 D' c置。(32bit 最多只能定址4GB)2 F3 M9 z" p6 t: y1 |, x6 F
: c) B  L: x! x6 Y/ ?! G( q0 n
第二種方式,通常是一開始開機vector還是從0x0那邊抓,可是經過設定CPU,可
4 J7 c& B. V% y9 n! H8 z. R3 O以改變,在不斷電的狀態下,發生exception就會跳到高位位址去找exception
" Y6 C: M3 w& u; \; g5 R# Lvector。
8 w6 s, [8 v7 e1 K- R9 X+ P' d# `
, ]1 o: D- t7 [+ Q5 v8 cp.s. 關於定址模式可能有些人沒感覺,可能要懂整個CPU的memory map之後,8 k4 ^# ]* {* N" m) C
會比較有感覺。' R' `" F/ ]  U8 n, G

; |4 N6 D# d# Bp.s. 眼尖的人一定覺得很怪,為什麼vector第一行用『b』,其它卻是用『ldr』,
/ G& S% w$ t$ O) k8 L" r# m0 M& K這個牽涉到本身指令的不同和程式碼是不是relocatable的程式有關,將來有機會
2 p5 P" }" ?" _& A7 ]7 d$ }& {' f! L再深入討論吧!!& K+ H- F6 u: A9 f' |! N6 ]3 w

& g( a, Z2 C+ X1 K% S; j5 W% U. ~% ~---% r: M& E* p2 l: q& {
想知道答案的朋友趕快call in進來7 q, z* t- J4 v; H
前五名我們有優惠& J, p6 D9 i( Q
現在進一段廣告~

評分

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

查看全部評分

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

CPU exception vector 淺談之二

上面貼文本來的用意是要點出,為什麼一個CPU需要有擺放兩個exception vector的; g: d$ W. ^- M  {- }3 W' v0 V
功能。如果有看懂的話,答案很簡單,就是怕被程式人員亂改改到了,這樣會讓整個OS5 E$ J1 J5 b5 q4 \
當掉,很容易一個null pointer亂填,整個系統就掛了。可是一開始不知道怎麼帶出這' `1 \1 ]% R- m
麼問題,所以文章就變長了。恰巧,也提到一些其他的東西,我們就稍微聊一下CPU
% @, [+ ?- }1 @( s# T0 @的模式吧。
) x4 W/ Q* o' T8 V  M2 C8 z
, X; |% |7 W9 c" o( G3 R從 exception vector 看得出來,CPU本身除了拿到指令一直run以外,還會接受一些/ W  o7 }8 ^6 m  T; l9 K
exception發生,發生之後呢,便會到這個vector來拿相對應處理的指令。" Y0 N8 b6 }& r

- H. U, t; r+ v  ]' ]0 |舉例來說,一個程式碼被compile成使用某個硬體的特殊指令,可是卻剛好被放到沒支1 O1 Z+ y# G+ {. B
援這個指令的 CPU 上執行,那CPU跑著跑著發現一個自己看不懂得指令,就會發出一
( {8 m4 D  V( f; ]% t: C個undefined instruction 的 exception,exception發出後,依照CPU的設計,以
$ Z; b  U4 R+ Z. V+ wARM來說,就會抓位址在0x4地方的指令開始執行。
& c4 ~1 \9 a5 V2 _! z; M) z( D5 u4 J2 r
而這時候,我們的處理函式就有機會可以透過這個exception hanlder去模擬這個指令: L5 U# D' v) J, e% E
,利用多個指令或運算計算出那個特殊硬體指令的值。這是其中一種undefined; b+ l. ~6 g# ?* Y8 t" y
instruction exception 的應用。
$ j5 z8 z* D( n- G' m5 b5 [# f: O. K' c
另外,我們要提的是,這許多的exception其實隱含著CPU的運行模式,例如我們以前
* G8 G% K2 B5 Q1 O常聽到x86 CPU切到什麼保護模式之類的,其實就是因為發生了一些exception,為了+ b, H& t1 A1 w
處理這些exception,所以切到相對應的模式去做處理。$ A) }& h' n4 |8 b# p0 E- {

% V; \1 Q1 K5 y# `, J- n* G切換模式聽起來很單純,其實對實作OS來說,牽涉到的事情還不少,例如切換模式之) ]& v- q3 _1 V5 `
後,為了要讓處理完exception之後,原本的程式能夠繼續執行,相對的exception
1 C3 l5 _/ l/ Whandler必須將目前狀態存起來,所以就必須實現stack來存放目前的register status8 ]% b( n8 d5 W! a8 P
(context),以便將來可以resume回來。
' Z) \2 P4 z% v
4 a5 q3 C" j7 A( ]看到這邊,應該有人會問想說,了解exception vector的意義何在?當你要了解如何
  }, n  X4 U" \6 L* e實做一個OS的時候,其實就是要去控制CPU,而CPU的運作,其實就是控制這些模
  G. l1 F8 e7 D, i式。而exception vector就是這些模式的進入點。當你對一個OS可以有透徹的了解( F/ M- R1 B) Q/ t3 \, i) w
的時候,對於系統表現出來的行為,會有更新的了解和解釋,對於debug application7 t1 L; p! K' Q7 W, T5 l% Y
和 driver 其實是有幫助的。
3 o5 D$ G6 ^, h: |( p2 @1 p/ s" V1 M6 h+ l" F. P3 Y) {
對於各個cpu mode的說明,例如一些有趣的問題:有哪些模式?每個模式有什麼不
- l  Q  @4 q" C! j! {同?它是專門處理那些問題?有哪些種應用?這些因為要牽涉到很多assembly的程4 x6 x; \' M' M' B: f
式片段,所以就先不深入探討,有興趣的朋友可以call-in進來,前五個有優惠喔~~
3#
 樓主| 發表於 2008-7-25 10:10:00 | 只看該作者
以上兩篇是以前貼到朋友網站的文章~5 b4 G$ m7 M+ V
所以口氣比較~~恩~~怪怪的" J6 ]. b: G: @
請大家多多包涵~
4#
發表於 2008-7-31 20:42:13 | 只看該作者
哇.大大很厲害.                         s* G1 S) e0 J: X* k* C& j
看完你的文章讓我受益匪淺.
5#
 樓主| 發表於 2008-8-1 10:52:38 | 只看該作者
....
6 |1 ]1 T! \7 ]# T9 b$ |....5 f% I: Q: i) H9 c
....# o2 M* N; x7 p
..... _6 q4 S* k* ], P; \  I/ @) W
....! s) G4 A8 v1 r
....4 j7 h" V7 h: G+ h* v% A: `" x
....
/ \, X$ Z: E( d....
4 N% _8 `7 i2 H8 N6 o..... v. t- ^4 R" l4 U6 ?3 u/ n8 ^
....
% i! L, l! E* V+ Z! h2 ]! t...., j; H6 ]) S# L5 ~. a
....- o5 U3 r  E1 s4 M& l
....
& c% s1 R/ W9 `$ _9 |9 B...., q7 a+ O: J" j
....9 {& `# D+ B$ x
....
; C* q8 C5 K! Q1 n2 j# j文繞圖模式
+ |1 B) L6 R+ t% g. a加點字讓它避開一下% W: I8 _0 U  i7 Y1 L' H" N
原帖由 rogeryang 於 2008-7-31 08:42 PM 發表
7 J0 C2 S+ i$ C. F. w8 {3 T$ [; G哇.大大很厲害.                         d. o# {8 {: l& F/ e2 D* ~: m9 ]
看完你的文章讓我受益匪淺.

) X: K) q$ _, u# ~" l7 ]0 o2 b5 W7 R3 T7 M8 _5 [
呵~ 感謝捧場ㄟ7 ]( g% C0 z+ U1 e0 s9 d1 U/ }
之前都沒人回文% Q; s! M" J; x3 P" [% k/ |
不知道文章是不是沒寫好  h0 g, [8 s, y, C3 r
anyway, 有交流是好- v' W- e$ h# A! _. f1 k
有時候會一個東西不是因為很厲害
/ C4 S+ D% J0 I只是碰巧碰過所以就會了5 \3 }- P. @0 D+ q* Z/ F
0 j/ K& a- y& Q( b% w
會貼文的目的 (以前大多是潛水居多)
' X! [: _; K- S: j  L  @- P, Y, t4 U就是還沒遇上的人可以多了解
/ c$ ]; h, R: u! }) K6 y8 q" E! l- {會多一點的人可以進來指導一下 9 T/ P- g$ e3 m3 E" `* Z' X

; `% l* N& o4 [1 l5 U5 h[ 本帖最後由 gogojesse 於 2008-8-1 10:58 AM 編輯 ]
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-11-16 07:03 AM , Processed in 0.163009 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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