Chip123 科技應用創新平台

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

作者: gogojesse    時間: 2008-7-24 08:11 PM
標題: CPU exception vector 淺談之一
因為再深入我也不懂,所以就淺談吧~
8 E; F4 ]* L- m# u- |% J! T5 ?有錯請指正~6 ~8 d3 u. v6 B' L
# E, n2 E  p# S: k0 M
話說,身為一個程式設計人員,常常遇到一些程式跑著跑著就當掉的狀況也很合理的。
  J% }; P; Z8 a  F- L例如:『segmentation fault』。簡單講就是程式寫錯,然後它就當了。' J7 A3 D9 n1 L4 Q6 ?- i/ n

& I1 Q- Y  J2 a% I/ b大家也應該都聽過,『開機之後CPU就會到固定位置去拿指令,然後開始跑,通5 ]7 V1 `. J6 G. J# J
常這個位置都是放BIOS,而這個位置通常是0』。
% b: m3 m9 t7 l  D1 M$ n: B  l0 F9 ?
那這個第一行指令究竟是長怎樣呢?這跟程式當掉有什麼關係?跟程式碼寫錯9 t, _! V) R+ D& H
又有什麼關係?
+ E" h8 L6 p) O# G: `7 x
1 J5 s+ E0 K+ c. I# E我們來看通常一般冷開機之後開始跑的程式碼都是怎樣的1 W1 v# @* O3 y( P5 ]9 {
( 通常就是跳到bootload or BIOS )
- A. V- ^3 H% ~* T- m1 U' x4 g" y
b start
  V; x0 k3 u. Gldr pc, _undefined_instruction
( q: `( l# p4 b, Gldr pc, _software_interrupt
. H# K0 ?1 l/ lldr pc, _prefetch_abort2 C/ c! l% q: j, c
ldr pc, _data_abort$ f  @8 W- {2 D" L
ldr pc, _not_used
2 s: u: }& m5 `0 ~" ~ldr pc, _irq
) \7 }2 y  [2 P; O9 H2 |: qldr pc, _fiq
! b" ]6 S& v* P* b1 j& D
- [  {6 q0 q0 s, V8 N
, H' |" h: j. H# d上面是組語,我們只看兩行,第一行是『b start』,『b』的意思就是branch的0 l( r' \" X0 F& c3 c* k
意思,也就是jump到start這個地方開始執行。換句換說,CPU拿到手的第一個
1 t) e. c* `, @" P指令就是要它去找別人,顯然是相當不負責任的行為。讓人不禁懷疑那第二行第+ X; a' u* t5 J
三行到底是幹麼的。, m' V$ @: v' \+ X: b
; I' G/ |" g4 e7 N; x5 Q# q
我們接著看『ldr pc, _undefined_instruction』,『ldr』的意思是說,將
! [1 W( [; W2 I. T& @6 V; D_undefined_instruction這個位址,放到pc這個暫存器當中。大家一定也聽過; }" k+ k7 o/ h3 d4 X0 H' e( L
program counter這個東西,一個正常的CPU就是靠program counter所指
5 ]9 k" q, N/ N1 Z" m2 _9 d/ ]的位置去抓指令進來執行。換句話說,第二行程式居然也是要CPU跳到別的地方3 j5 V8 E4 l6 o2 o' M# ?9 ?
執行。而且前面七八行都是做這件事情。很怪吧?!!!
" r/ ^7 e- C5 n% U( L6 M, K1 Z# J0 \. p; K3 i
到這裡我們解答了上面第一個疑問,第一行程式其實就是一個Jump的指令,跳到
0 q! U4 P7 B9 n2 C! m9 I6 o真正的開機程序。
7 Y( Q2 l* t$ U9 x9 _6 W9 u1 q3 A- \( `* m4 p3 M2 m: w- a8 }
看了程式碼之後,我們不禁好奇這些看起來排列很有規則的程式碼到底是做啥用
3 S3 ?, m9 v2 c) j! k的?其實答案就是『exception vector』。
: V; D& b. q/ B- Y( @
' u" y" [! ^& q) |6 C" {  K什麼是exception vector呢?其實就是CPU出錯了(其實不完全是出錯),它就會
2 P. F; G- Z% x$ ?5 A來這個vector找看相對應的處理函式,例如遇到看不懂得指令,他就固定會抓0x4
  L7 l1 s" B9 k位址的指令,也就是『ldr pc, _undefined_instruction』,接著就會跳到處理undefined instruction的函式去處理。$ i: w" }2 b# g/ u% E/ i- F; ^
$ a; k4 s$ e% s% x1 E4 y4 L: @) y
到這邊我們回答了第二個問題,程式當掉的時候,就是會跑來這個地方,接著再
& I0 V% ^7 I% Q  `Jump到處理的程式碼。同時我們也發現,一個CPU就是靠著這個vector在處理+ p4 X7 b8 e% B7 \
各種不同的exception。那....萬一這些vector被改掉了呢?+ a5 X  V5 `8 v! z+ E! [
例如:你程式碼拿到一個null pointer,然後又對這個null pointer開始做寫入動
, H' O9 A6 \6 ^: {) r* n+ b作。9 r) D8 \6 q" ~+ l
+ C1 x) N& S3 I1 F
char *ptr = NULL;$ {( \1 S' Y7 o$ W$ {0 m: v
memcpy( ptr, 0x0, 10 );  O% m- Z0 {1 n/ O/ l$ n

3 U# O- I, Y4 Y9 U6 g  ~那整個OS就完全不能動了。可是我們也知道我們現在這樣寫,頂多 segmentation+ e; Q0 v  J: k% O0 p9 F
fault,並不會怎樣,OS還是照樣活著。why why why?
% ]7 h* R. K; ^4 u* f原因很簡單,就是這些區段被一些方法保護住了。一般常見的有兩種方法,一種是
6 _$ u6 G6 H1 Y2 y  vMMU,一種是cpu有兩個exception vector存上的位址。) `$ @  `* y0 g# t. p- B4 }

- H8 G% W" z9 S7 }( {MMU可以設定某個區段的存取權力,只能readable的話,那就不會有被改掉的問
! p* s3 u; ^9 c% I& T9 u0 |; I9 f題,另外一個方式是可以將exception vector的位址擺到不容易改到的地方,通常
0 ?7 S9 O5 ^" ]$ w4 W是往高位址的地方擺(high vector address),例如,0xffff0000接近4GB的位: `* b6 }" Y6 {- N) C* f4 x! J
置。(32bit 最多只能定址4GB)
9 y4 K2 @: C1 e  O* v; Q5 j! g0 \0 [9 s4 D0 g
第二種方式,通常是一開始開機vector還是從0x0那邊抓,可是經過設定CPU,可  k0 L: S9 E  y9 N7 Z9 A+ [% H9 q
以改變,在不斷電的狀態下,發生exception就會跳到高位位址去找exception  ^& {; _, o: e5 r0 w
vector。
& i4 Y  W$ ]  h6 t& P) X0 a! F) g+ P9 F
p.s. 關於定址模式可能有些人沒感覺,可能要懂整個CPU的memory map之後,/ t6 a4 ^9 K3 q) x! o" R9 @/ V: d
會比較有感覺。
, r, E. h" [& U# x6 h3 p  M/ Y! \) N( x8 g! |4 Q. y
p.s. 眼尖的人一定覺得很怪,為什麼vector第一行用『b』,其它卻是用『ldr』,9 t) }3 o7 v& Q& _. m! B1 t( X
這個牽涉到本身指令的不同和程式碼是不是relocatable的程式有關,將來有機會
, a" N# q: u3 w: D0 I再深入討論吧!!
( w7 f7 [3 l( L+ I7 q4 i. ~  D' k3 o' U, K
---: ~: m; Q0 x2 u5 Y. B
想知道答案的朋友趕快call in進來
. b# `. T; F1 z' }前五名我們有優惠
. K/ u  J% ^! j7 o8 x) |! \, y現在進一段廣告~
作者: gogojesse    時間: 2008-7-25 10:02 AM
標題: CPU exception vector 淺談之二
上面貼文本來的用意是要點出,為什麼一個CPU需要有擺放兩個exception vector的# }, J, c7 i" m3 X& E
功能。如果有看懂的話,答案很簡單,就是怕被程式人員亂改改到了,這樣會讓整個OS
7 X  E+ K: l+ n4 N% @當掉,很容易一個null pointer亂填,整個系統就掛了。可是一開始不知道怎麼帶出這
" b3 s7 n9 ]& [, V! k3 c麼問題,所以文章就變長了。恰巧,也提到一些其他的東西,我們就稍微聊一下CPU
/ U7 U1 F; b4 c9 m: H的模式吧。  ]  ^8 y  p3 ]2 l$ E
7 f& i3 M$ V- r* M
從 exception vector 看得出來,CPU本身除了拿到指令一直run以外,還會接受一些
0 E, m* p  A$ Yexception發生,發生之後呢,便會到這個vector來拿相對應處理的指令。: X, E8 [+ r6 {; t& X1 B4 z

% |1 X/ S3 n  B" K2 v; b" n% f, A舉例來說,一個程式碼被compile成使用某個硬體的特殊指令,可是卻剛好被放到沒支' D+ j5 j6 [1 A( d, V
援這個指令的 CPU 上執行,那CPU跑著跑著發現一個自己看不懂得指令,就會發出一
) r: p- p0 M/ d8 w$ g6 u個undefined instruction 的 exception,exception發出後,依照CPU的設計,以8 f) A3 c" u% t3 H' `$ g. X2 C  i
ARM來說,就會抓位址在0x4地方的指令開始執行。
" x# f( F4 G8 u! O, e
9 Z% t/ O- t6 B/ k; J! D而這時候,我們的處理函式就有機會可以透過這個exception hanlder去模擬這個指令1 m7 e! A$ x+ Y6 f/ U
,利用多個指令或運算計算出那個特殊硬體指令的值。這是其中一種undefined. P, O* n* c' z: X3 g
instruction exception 的應用。* {" F, G* Y- p
/ S' v$ R3 v- v2 n0 S. _
另外,我們要提的是,這許多的exception其實隱含著CPU的運行模式,例如我們以前5 j% E0 g! ?. ^5 F$ S  Z4 r+ w5 C
常聽到x86 CPU切到什麼保護模式之類的,其實就是因為發生了一些exception,為了
! f6 U/ w8 p& Y處理這些exception,所以切到相對應的模式去做處理。- o( n; B/ I8 J6 ^8 n" `# `
; y! a' F' [" r/ R" |! d' }
切換模式聽起來很單純,其實對實作OS來說,牽涉到的事情還不少,例如切換模式之8 Z/ j& k, ^7 j2 }
後,為了要讓處理完exception之後,原本的程式能夠繼續執行,相對的exception
. U: Q8 o7 ]) \4 f$ Chandler必須將目前狀態存起來,所以就必須實現stack來存放目前的register status5 @) m6 Z- l2 e1 n- j" D) M$ P
(context),以便將來可以resume回來。
3 |( P! H! R! q3 y" s$ T1 [3 O+ u3 r2 e, R# w) S
看到這邊,應該有人會問想說,了解exception vector的意義何在?當你要了解如何, ]# I$ `2 G- f8 P5 q& u' U% @
實做一個OS的時候,其實就是要去控制CPU,而CPU的運作,其實就是控制這些模' k4 _6 O: J  X+ x
式。而exception vector就是這些模式的進入點。當你對一個OS可以有透徹的了解
# t6 G6 }4 t" N+ n& C的時候,對於系統表現出來的行為,會有更新的了解和解釋,對於debug application
9 F! `2 l6 Q- |  R% p) k% l和 driver 其實是有幫助的。
& T- U/ B7 C8 @
- n/ L8 [% y4 g% L7 G9 K) v. r對於各個cpu mode的說明,例如一些有趣的問題:有哪些模式?每個模式有什麼不
  D  q7 |+ s( q6 t同?它是專門處理那些問題?有哪些種應用?這些因為要牽涉到很多assembly的程
' c: A5 l: v  \+ }5 C9 D式片段,所以就先不深入探討,有興趣的朋友可以call-in進來,前五個有優惠喔~~
作者: gogojesse    時間: 2008-7-25 10:10 AM
以上兩篇是以前貼到朋友網站的文章~/ }# m$ N: D; @- P: S0 p7 G0 j" N. ~
所以口氣比較~~恩~~怪怪的
; T+ B8 u, X( z# @8 _1 ^' m" R請大家多多包涵~
作者: rogeryang    時間: 2008-7-31 08:42 PM
哇.大大很厲害.                       
3 {, \, u- {- A3 H& B6 b( _看完你的文章讓我受益匪淺.
作者: gogojesse    時間: 2008-8-1 10:52 AM
....! q: c$ \2 g% u+ m" I; D
....
" p6 c! R/ U) {....7 K% [6 j$ P: l/ v2 b% S; r" c) f
....
- Z7 B2 w; A/ G& i% K3 z....
; j. t: d# k" Z) z' u9 G....* O3 v8 @" }/ {) q
....
: o3 z3 n- V1 c5 |....$ K3 Y1 P# s1 w& |: z0 p. N
....
1 E, s" D% r) s....
6 i9 y& H7 K+ L8 a: j....6 T' s8 p0 h7 c6 B& V
....
# z! O- S5 R5 n....
- ]5 j6 l3 q- G2 ^, R....
$ N, x2 s7 H! Y....: ^. D3 U# s' G2 k/ N: e5 z
....
/ M7 n7 E  i* I; o文繞圖模式
3 o$ P; Q6 a& h; `8 Z/ Z6 M加點字讓它避開一下
/ E) K. f( x, ~3 f7 A
原帖由 rogeryang 於 2008-7-31 08:42 PM 發表 8 s. M0 k! D! K+ @$ x! i
哇.大大很厲害.                       5 J  ~1 d, Y$ z1 ^2 S! |8 l
看完你的文章讓我受益匪淺.
3 l% q+ C% z) Z% s2 N! u
" k  c8 i8 `3 ^) d$ r
呵~ 感謝捧場ㄟ
0 j- Z, r# d- n/ D3 ^' s之前都沒人回文
- _5 ^3 ]% g2 J不知道文章是不是沒寫好
8 q! g0 V% t6 F: U7 L; xanyway, 有交流是好
/ K. e( Z; L: \4 S- d8 `4 i有時候會一個東西不是因為很厲害- f* f8 L4 y+ ^7 N: Q$ q1 b
只是碰巧碰過所以就會了
9 G% c! S$ }  b5 G, j
% t1 P1 ]1 A! D1 f* j9 j: `+ k會貼文的目的 (以前大多是潛水居多)& ]" z: E; l+ ~! u6 k
就是還沒遇上的人可以多了解
' P6 x. e' R) W& E1 a4 E會多一點的人可以進來指導一下 ; c) g% G1 i1 U! J5 `: l
9 \( b/ h# O8 ?; s8 P
[ 本帖最後由 gogojesse 於 2008-8-1 10:58 AM 編輯 ]




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