Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

CPU exception vector 淺談之一

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-24 20:11:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
因為再深入我也不懂,所以就淺談吧~* P# Q4 N; [- S7 f, g7 F
有錯請指正~
# y- J/ x" Y; N
8 o/ }$ Y# y/ i, q) }話說,身為一個程式設計人員,常常遇到一些程式跑著跑著就當掉的狀況也很合理的。
- w) }9 c( H+ o$ T7 l例如:『segmentation fault』。簡單講就是程式寫錯,然後它就當了。
) b) g# ^# i. I1 T- Y
" ?6 w: r% {7 {3 ?3 q" H8 X+ F0 n大家也應該都聽過,『開機之後CPU就會到固定位置去拿指令,然後開始跑,通2 I5 [  p/ O1 p- \" O7 y! l, X
常這個位置都是放BIOS,而這個位置通常是0』。
/ Z1 K, E; ]& F1 `! n) j  \' d3 _1 M
, Y# T' _1 t$ G, ?那這個第一行指令究竟是長怎樣呢?這跟程式當掉有什麼關係?跟程式碼寫錯
  W8 }2 G! l' H又有什麼關係?
4 [: F0 d- B% z7 N# B* J2 ^- V+ k/ [/ Q
我們來看通常一般冷開機之後開始跑的程式碼都是怎樣的
' F' E0 x: r( Z3 z6 k2 J: ^( 通常就是跳到bootload or BIOS )' i. ]* ^9 I8 l8 r( y
9 v: P) h2 _- p% c* ], {* Z
b start" D5 n$ r  [6 y( q
ldr pc, _undefined_instruction" A" _0 {0 ?1 d) t) ~4 ~
ldr pc, _software_interrupt
. o" P* Q! Q+ e3 S- Oldr pc, _prefetch_abort
0 a) V& t& W9 n+ T& U; m3 ~ldr pc, _data_abort: T0 D7 W& u" R: M6 p/ ^5 G2 {7 B
ldr pc, _not_used
$ y, ?) }9 N, Vldr pc, _irq9 ]: J. U9 ]2 Y) \
ldr pc, _fiq$ ]2 U5 u& i5 f: n4 g, o" W

3 ^% ^% z. X" J- a: ^! i: |! {+ b1 \' ]% N0 O7 s7 e
上面是組語,我們只看兩行,第一行是『b start』,『b』的意思就是branch的
7 M9 ?7 S0 H/ z& v意思,也就是jump到start這個地方開始執行。換句換說,CPU拿到手的第一個
' c- D% ]; H# m指令就是要它去找別人,顯然是相當不負責任的行為。讓人不禁懷疑那第二行第
1 e9 O) ~+ C  [/ W0 r$ q' N三行到底是幹麼的。
# n9 r7 ?  [/ s( X, k+ O; N4 [$ ?' r* }4 h1 [4 U' \8 H9 O
我們接著看『ldr pc, _undefined_instruction』,『ldr』的意思是說,將
& o3 O- l- U, J. [( ]_undefined_instruction這個位址,放到pc這個暫存器當中。大家一定也聽過
1 v* Y! k* i0 Cprogram counter這個東西,一個正常的CPU就是靠program counter所指
5 ]1 J2 z  M  q5 q. ?' d4 C的位置去抓指令進來執行。換句話說,第二行程式居然也是要CPU跳到別的地方
/ D7 \1 a4 i% Y5 M% X8 z) I執行。而且前面七八行都是做這件事情。很怪吧?!!!, c0 b5 n+ y( F" {9 A. a

7 j9 x" ?# g9 M5 T: ~! y到這裡我們解答了上面第一個疑問,第一行程式其實就是一個Jump的指令,跳到
; w3 _* `8 ]( ?5 Y0 D真正的開機程序。
7 f& v  t* K" C8 [* F
" J8 ~+ _8 p' X  v+ m# S4 E看了程式碼之後,我們不禁好奇這些看起來排列很有規則的程式碼到底是做啥用
. z2 Z7 {  G( i* x+ |; a* T" g的?其實答案就是『exception vector』。* l2 C( r) y2 z  e6 Y0 a2 P
' e0 G4 R; {  b/ i+ |- s
什麼是exception vector呢?其實就是CPU出錯了(其實不完全是出錯),它就會# d7 `+ y8 `7 l# i" S' t
來這個vector找看相對應的處理函式,例如遇到看不懂得指令,他就固定會抓0x4/ ^5 p( n+ g+ g3 y* R8 c
位址的指令,也就是『ldr pc, _undefined_instruction』,接著就會跳到處理undefined instruction的函式去處理。
4 {, b  b( F3 x( T
% ]1 M; A( g. i5 N/ e! t! D到這邊我們回答了第二個問題,程式當掉的時候,就是會跑來這個地方,接著再
0 f: [( O+ z# {2 nJump到處理的程式碼。同時我們也發現,一個CPU就是靠著這個vector在處理
: i2 r4 o/ s+ z8 c& |各種不同的exception。那....萬一這些vector被改掉了呢?
% o. K3 ?) z& ~" Z0 s9 ?例如:你程式碼拿到一個null pointer,然後又對這個null pointer開始做寫入動
2 P1 Z; ?, e! d6 N8 O4 j8 E作。
) Z8 \1 W5 {% r
$ a7 U. C" p9 ]char *ptr = NULL;
: h8 Q+ Y- Q- U* R. R6 Bmemcpy( ptr, 0x0, 10 );
9 A, S/ u! X/ _5 [5 P* S9 O$ T, J$ v" W4 d5 y( M
那整個OS就完全不能動了。可是我們也知道我們現在這樣寫,頂多 segmentation
% f' s5 v  n& S; v; C1 Z8 Z! Lfault,並不會怎樣,OS還是照樣活著。why why why?" b: ~1 Z8 U. S. }" z6 p
原因很簡單,就是這些區段被一些方法保護住了。一般常見的有兩種方法,一種是
8 ^  S8 }3 O5 J# Y! eMMU,一種是cpu有兩個exception vector存上的位址。' G( A- }: Z9 N2 }

) F6 }1 L$ k% a7 M5 hMMU可以設定某個區段的存取權力,只能readable的話,那就不會有被改掉的問  z8 m" w6 P" H4 j* \
題,另外一個方式是可以將exception vector的位址擺到不容易改到的地方,通常1 X) f6 ~; L" Y4 @  [0 X
是往高位址的地方擺(high vector address),例如,0xffff0000接近4GB的位
. m5 s) ^. M6 E( T置。(32bit 最多只能定址4GB)
0 M3 ?9 r. R4 O( @- K) d% I# k$ J, D8 L
第二種方式,通常是一開始開機vector還是從0x0那邊抓,可是經過設定CPU,可  J1 b) M' l# m2 t) \; ]( N
以改變,在不斷電的狀態下,發生exception就會跳到高位位址去找exception
3 l- g+ |6 E2 B  N# @% ^vector。
" x# s" Z& i1 }1 ]: v6 b3 k
. S/ ~) @$ i! h; Fp.s. 關於定址模式可能有些人沒感覺,可能要懂整個CPU的memory map之後,
6 f; X' h4 b6 n8 K會比較有感覺。2 g0 ?0 O1 c9 k7 B$ f$ N, z
0 X8 F9 ?) t* L' v9 F# t
p.s. 眼尖的人一定覺得很怪,為什麼vector第一行用『b』,其它卻是用『ldr』,
; N0 {! u  a" c. ]0 Y) H這個牽涉到本身指令的不同和程式碼是不是relocatable的程式有關,將來有機會
& `+ ]" y/ i8 X0 n# t" p再深入討論吧!!
. {0 d! w/ d9 }3 q3 B* O. r+ I" N2 ]
---
" |# s* G3 T$ q4 x0 j8 |0 M& z想知道答案的朋友趕快call in進來
& @- D" W: S  g, l前五名我們有優惠
* w7 l( J* U) Z- I& D現在進一段廣告~

評分

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

查看全部評分

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

CPU exception vector 淺談之二

上面貼文本來的用意是要點出,為什麼一個CPU需要有擺放兩個exception vector的
5 T# T8 S3 A7 V+ a# L# b, |功能。如果有看懂的話,答案很簡單,就是怕被程式人員亂改改到了,這樣會讓整個OS
* @6 }) ?4 N6 m3 v4 M) p5 w+ ?當掉,很容易一個null pointer亂填,整個系統就掛了。可是一開始不知道怎麼帶出這6 ~; l3 j  |# v, a" z+ g
麼問題,所以文章就變長了。恰巧,也提到一些其他的東西,我們就稍微聊一下CPU. _8 H! @3 _6 A9 B1 t
的模式吧。
& h  X/ _+ R$ Y5 `1 g$ C  d2 k9 F2 Q- r8 f$ G
從 exception vector 看得出來,CPU本身除了拿到指令一直run以外,還會接受一些
; q7 v7 v! D# g' i, |# X7 Fexception發生,發生之後呢,便會到這個vector來拿相對應處理的指令。+ N" h- w! u, w/ m
$ f  K! ^: T) E. I
舉例來說,一個程式碼被compile成使用某個硬體的特殊指令,可是卻剛好被放到沒支2 Q4 N, n/ K0 F* S3 I
援這個指令的 CPU 上執行,那CPU跑著跑著發現一個自己看不懂得指令,就會發出一
% I' p% S, s" S* \, w個undefined instruction 的 exception,exception發出後,依照CPU的設計,以3 x, `4 D, ]8 ~$ d; I% @
ARM來說,就會抓位址在0x4地方的指令開始執行。
. T% u9 J0 d1 \0 @! I0 @2 o! @; Z$ \- o! x$ d/ X- x* ^
而這時候,我們的處理函式就有機會可以透過這個exception hanlder去模擬這個指令
: K) t3 W) p- \; D; l' G,利用多個指令或運算計算出那個特殊硬體指令的值。這是其中一種undefined
' C+ o, S4 b" d& Xinstruction exception 的應用。  C7 m+ b3 `8 S3 \% j0 {% B
# y" _  R8 X: P
另外,我們要提的是,這許多的exception其實隱含著CPU的運行模式,例如我們以前( Z, V7 i7 N$ H3 v  {' n
常聽到x86 CPU切到什麼保護模式之類的,其實就是因為發生了一些exception,為了
: W, i4 [, F: ^處理這些exception,所以切到相對應的模式去做處理。, }! e% H0 M4 c: M

/ D+ i7 Z" [. ?7 n7 p切換模式聽起來很單純,其實對實作OS來說,牽涉到的事情還不少,例如切換模式之2 N1 ^6 c) j! f2 C' e* z6 O2 l- f
後,為了要讓處理完exception之後,原本的程式能夠繼續執行,相對的exception
) I. D  Y( m' x, y  Chandler必須將目前狀態存起來,所以就必須實現stack來存放目前的register status
2 p9 @7 \* Z- j' P8 ]: u6 x(context),以便將來可以resume回來。( |% R: M! u; T( X3 ?" X/ X3 q; w0 Y4 ^! T

4 s! ~+ u" [9 n看到這邊,應該有人會問想說,了解exception vector的意義何在?當你要了解如何
4 O$ {5 _2 I) ]" ?實做一個OS的時候,其實就是要去控制CPU,而CPU的運作,其實就是控制這些模- m3 G: U! Y" T+ a. q! p! f( @
式。而exception vector就是這些模式的進入點。當你對一個OS可以有透徹的了解
' z/ o' d/ G$ r1 X, m/ j的時候,對於系統表現出來的行為,會有更新的了解和解釋,對於debug application# t) u' f/ W- F! Y) g7 |
和 driver 其實是有幫助的。( I8 U% W0 I' {( H
! ^1 c4 W, x0 k- M! G7 P
對於各個cpu mode的說明,例如一些有趣的問題:有哪些模式?每個模式有什麼不
9 h6 o2 C; [! i$ U7 z! i" O同?它是專門處理那些問題?有哪些種應用?這些因為要牽涉到很多assembly的程* J# b1 y$ G9 G/ p& S$ \" Z, U
式片段,所以就先不深入探討,有興趣的朋友可以call-in進來,前五個有優惠喔~~
3#
 樓主| 發表於 2008-7-25 10:10:00 | 只看該作者
以上兩篇是以前貼到朋友網站的文章~
. C* o: h6 m2 Y& [' W所以口氣比較~~恩~~怪怪的' B6 p* n& W$ Z) \: K
請大家多多包涵~
4#
發表於 2008-7-31 20:42:13 | 只看該作者
哇.大大很厲害.                       8 U- ~0 E" _; H$ ^
看完你的文章讓我受益匪淺.
5#
 樓主| 發表於 2008-8-1 10:52:38 | 只看該作者
....( Y0 R, L' p5 F) Y1 w
...., u- q' O5 n" r" r8 P& \( d
....  \0 S! v% F( B  A+ b0 M6 ~( e
....
" B  n6 I+ m, v+ ^4 s6 y....6 l; e. v5 \* W  n. ~' C
....
# Q4 U# C% g0 Z' N. h: Z..... |0 g# u) c* F' O. P
....' ]( V6 \: O# s& w9 I/ G
....
( r. w# z; q$ b5 @, @( n3 ]: p3 a- Y....
3 z3 @0 h" ^' j* ~1 v..... y. R4 z7 p& w' \; r9 C
....; _7 R6 f! w# t$ E  w8 z
....
9 m" A/ m; L/ E( _....$ E8 {  q9 T! E, M) ?. g, ]
....
% P- p. i# s. k....
" E4 x+ O6 B+ E1 {+ D文繞圖模式( M* O: S1 Z; y( ]# M3 c9 W
加點字讓它避開一下  f9 s, E% Z6 M2 }' ]0 {, G7 v
原帖由 rogeryang 於 2008-7-31 08:42 PM 發表 & `$ i/ |0 H- Y4 H- n
哇.大大很厲害.                       ; I% H4 \  R. j/ X* ~+ y1 d1 X
看完你的文章讓我受益匪淺.
& d/ P$ q) i( w. C( f

' l; q- H1 Q$ s呵~ 感謝捧場ㄟ% J4 J9 Q" f3 I" g& O; \$ S
之前都沒人回文
" Q5 n! q) g4 R不知道文章是不是沒寫好
# n4 C: N* F6 m# j0 kanyway, 有交流是好* p( S* i; z' E) K/ M
有時候會一個東西不是因為很厲害3 ^4 E0 p% v# |, c6 \( C- `
只是碰巧碰過所以就會了' y6 m) Z" x, ^+ a$ d
. b* G! s9 ]+ S1 ~* |
會貼文的目的 (以前大多是潛水居多)! r( Y& |- y9 f) X* @. K* N5 C, z
就是還沒遇上的人可以多了解+ [& Q  A1 _& D/ _* T" H3 r
會多一點的人可以進來指導一下
8 N( O* g5 y4 ~
& }; T. U: ~7 B) d2 S6 D8 o1 d[ 本帖最後由 gogojesse 於 2008-8-1 10:58 AM 編輯 ]
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-1-23 12:54 AM , Processed in 0.156001 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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