Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

CPU exception vector 淺談之一

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-24 20:11:41 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
因為再深入我也不懂,所以就淺談吧~
! r$ [0 c0 j1 V9 p2 \& D! e6 I有錯請指正~
4 {. o& d8 k+ _& ^
5 \+ N. W3 Q. Y: c0 X+ W話說,身為一個程式設計人員,常常遇到一些程式跑著跑著就當掉的狀況也很合理的。* }8 {( y! M8 g# X
例如:『segmentation fault』。簡單講就是程式寫錯,然後它就當了。
6 U3 v, Y  ]8 R& n7 d# u( U
: ?% M7 g) _: E7 w4 @大家也應該都聽過,『開機之後CPU就會到固定位置去拿指令,然後開始跑,通
7 Q  z5 h- A, e7 y1 ?4 F1 s常這個位置都是放BIOS,而這個位置通常是0』。" [! X7 x& B! y7 W2 N$ ~9 ^$ e% x

+ O' ^. a3 D/ ?那這個第一行指令究竟是長怎樣呢?這跟程式當掉有什麼關係?跟程式碼寫錯* N9 {" m1 z0 w% k* K
又有什麼關係?, y/ ]+ m0 V; @& l

3 B) S9 n+ u- \1 h# e" {我們來看通常一般冷開機之後開始跑的程式碼都是怎樣的
, d: H' A  [$ s% `- _4 u( 通常就是跳到bootload or BIOS )/ p$ ?) [  l( I1 G; l
  G3 L8 w5 {. [. \9 J# _+ I
b start2 K3 P  d3 O& h9 h; o) N
ldr pc, _undefined_instruction
  u! M' l0 {  y) ]+ P  ]ldr pc, _software_interrupt* m1 I! R# R  [7 O' F
ldr pc, _prefetch_abort
; s) F  {7 T( h- e7 k' t& B4 Eldr pc, _data_abort: a5 t) e8 k* E9 U6 t. h
ldr pc, _not_used  l. x9 \( }6 R/ U. P: _
ldr pc, _irq) l( Z$ g9 G$ N) J* F4 h4 d5 I
ldr pc, _fiq
0 f' E' L% S0 q: y- Z# w2 L. y1 @- w: l+ B! n

  G* }9 Q  H5 p0 f7 {上面是組語,我們只看兩行,第一行是『b start』,『b』的意思就是branch的
) S+ M2 Z; W% W+ l8 l/ w$ P意思,也就是jump到start這個地方開始執行。換句換說,CPU拿到手的第一個# n( y) z$ k" p
指令就是要它去找別人,顯然是相當不負責任的行為。讓人不禁懷疑那第二行第& N- h$ h, c2 O5 K% X& H" ~
三行到底是幹麼的。
2 i. a( W, l( n+ B  P" k
# r: m& J6 T1 S8 Q' P1 n我們接著看『ldr pc, _undefined_instruction』,『ldr』的意思是說,將6 k- A- ?+ P; i4 g% ?+ |
_undefined_instruction這個位址,放到pc這個暫存器當中。大家一定也聽過& i+ \& N+ ^( z+ P( p# y  a$ G
program counter這個東西,一個正常的CPU就是靠program counter所指1 f0 j" X+ D; n, q: y/ T! D3 m. d: X& ^
的位置去抓指令進來執行。換句話說,第二行程式居然也是要CPU跳到別的地方( G  w1 V3 U: k. M) }. b
執行。而且前面七八行都是做這件事情。很怪吧?!!!
$ L; _! y0 K( C$ P/ z- N; d4 b6 E) ?& i& n
到這裡我們解答了上面第一個疑問,第一行程式其實就是一個Jump的指令,跳到
0 `: H) k6 x- p1 Q- b, N- n7 o' ~真正的開機程序。
! ]$ k$ Q7 V4 j3 o
0 R) o0 J% L: U3 Q" Q9 E看了程式碼之後,我們不禁好奇這些看起來排列很有規則的程式碼到底是做啥用" i1 g& f$ L/ Z% k; Z8 w9 e
的?其實答案就是『exception vector』。: f! Q  r6 E4 G6 ]- D/ H8 i
* \: n/ L. x/ Z* ]
什麼是exception vector呢?其實就是CPU出錯了(其實不完全是出錯),它就會: f! f$ j6 I6 u- h& i! C7 }
來這個vector找看相對應的處理函式,例如遇到看不懂得指令,他就固定會抓0x4
" f$ s0 C. r# c1 c" a9 g位址的指令,也就是『ldr pc, _undefined_instruction』,接著就會跳到處理undefined instruction的函式去處理。
1 f( t+ \$ J2 p! U' v7 n# B& U/ Q) ?2 B+ U! {
到這邊我們回答了第二個問題,程式當掉的時候,就是會跑來這個地方,接著再+ o* _( Y  j7 }2 N$ S# m) r
Jump到處理的程式碼。同時我們也發現,一個CPU就是靠著這個vector在處理; C  K+ T6 H" I! |9 B4 Y
各種不同的exception。那....萬一這些vector被改掉了呢?# {. G" B! V* H+ f6 U! E1 V! o
例如:你程式碼拿到一個null pointer,然後又對這個null pointer開始做寫入動4 B8 N6 K1 y4 [- f2 |/ H
作。
2 @2 M4 e3 r! a3 ]' }7 Z( u" l
char *ptr = NULL;
+ @' Y0 ?+ E, E0 p% C& Ymemcpy( ptr, 0x0, 10 );
3 g/ S2 H+ X1 E5 f+ v, s- d( y3 ]7 N4 \3 _
那整個OS就完全不能動了。可是我們也知道我們現在這樣寫,頂多 segmentation
( `, j4 O6 N7 r2 h& Dfault,並不會怎樣,OS還是照樣活著。why why why?$ P5 s; M$ k4 g+ Y5 x  p
原因很簡單,就是這些區段被一些方法保護住了。一般常見的有兩種方法,一種是
3 r8 N2 Y3 Q5 M3 @8 bMMU,一種是cpu有兩個exception vector存上的位址。
8 _5 Y: Y. m7 O0 i
( D$ z. F9 U0 u6 x9 @" `MMU可以設定某個區段的存取權力,只能readable的話,那就不會有被改掉的問' n$ A  u. y7 e& G
題,另外一個方式是可以將exception vector的位址擺到不容易改到的地方,通常
  F4 o7 V% v  @. D/ v# K是往高位址的地方擺(high vector address),例如,0xffff0000接近4GB的位
% h5 r/ h0 i% W  }8 A; t, q( c置。(32bit 最多只能定址4GB)' y% M5 Z" I" i* B

1 _1 S: ?4 K9 K9 X3 L第二種方式,通常是一開始開機vector還是從0x0那邊抓,可是經過設定CPU,可5 n0 z/ ?3 p1 ^$ k5 q+ y
以改變,在不斷電的狀態下,發生exception就會跳到高位位址去找exception
7 I& D0 Q+ n' W3 Evector。9 |8 r0 k- n( R7 [+ I" r
- B- i) F; s6 C
p.s. 關於定址模式可能有些人沒感覺,可能要懂整個CPU的memory map之後,
- w" j# E+ F' I, O$ d- q會比較有感覺。$ D- t, B) M' H/ h" {5 x
/ s( h# A3 {% T. s7 i8 ?3 H2 H
p.s. 眼尖的人一定覺得很怪,為什麼vector第一行用『b』,其它卻是用『ldr』,
6 i7 y1 x1 L* q/ q這個牽涉到本身指令的不同和程式碼是不是relocatable的程式有關,將來有機會
: G7 I9 L, ?* a3 j! h再深入討論吧!!' _1 F3 N  x( k
# ~5 h  A; q8 J, F' L
---2 l: U% @7 Y: g$ ~& d. R9 o
想知道答案的朋友趕快call in進來% M- f# E% C' T' W# i0 O/ x# @
前五名我們有優惠' f$ D8 ^$ D& H0 n0 n' G
現在進一段廣告~

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
5#
 樓主| 發表於 2008-8-1 10:52:38 | 只看該作者
....
5 A" w* G" F9 [( o, ^....5 `# k' o  K; y
....$ R+ Y9 ^  i. x- E4 @1 }
....( O4 z- e. Q7 x5 v0 Q$ Y0 a5 P8 `5 K
....
; W+ `  N  E: M2 g2 ?....8 O; k3 P; Q, L& Q) p+ D7 u
....0 S& C; w" d' ]
....0 l* Q: t2 M2 @- e
....
8 g% ?/ F+ q1 A) N4 ?* f....
2 e0 I: _) v+ c0 V: l4 _....& N, _; l" d1 {+ e
....9 t0 F, ^+ ?1 C* |  \6 ]# C
....& a2 _9 d0 i$ C6 S! A/ V
....1 P8 x9 Y, q. Q, V' Z* v
....+ v1 U5 O5 F0 }; J0 n; l7 t
....( }9 I4 ?( Q$ S, ^" J. p; K
文繞圖模式, x8 w, {3 @7 X- l
加點字讓它避開一下3 e0 h, p; N- M. J
原帖由 rogeryang 於 2008-7-31 08:42 PM 發表
/ Y% i: J% z( [& O哇.大大很厲害.                       ; ^% p) v! x5 l' l5 T
看完你的文章讓我受益匪淺.

6 ?+ ~- ~+ h0 v& l: a
% R* ]# f% z2 E4 d0 ~; @呵~ 感謝捧場ㄟ$ [; y/ [: s  B7 a
之前都沒人回文* S8 V. m1 |' e& z5 e+ I
不知道文章是不是沒寫好
6 v  Q& K3 r. [, D% s& n/ ~anyway, 有交流是好2 |/ i3 Y- N3 R) B
有時候會一個東西不是因為很厲害# A* b) ]7 B0 R, K5 I3 E
只是碰巧碰過所以就會了$ I6 h+ d- i# A  w6 S& [; |
) N# P% f7 U6 i& `$ x% H( i8 @
會貼文的目的 (以前大多是潛水居多)
7 m3 g+ w, [( n& C8 ^( V就是還沒遇上的人可以多了解
5 {2 G4 t) }! G' ^會多一點的人可以進來指導一下 ' {- q* E# L3 {, V- Y
$ _) ]( L& f& c* \
[ 本帖最後由 gogojesse 於 2008-8-1 10:58 AM 編輯 ]
4#
發表於 2008-7-31 20:42:13 | 只看該作者
哇.大大很厲害.                       
! M0 ~0 z: F6 z看完你的文章讓我受益匪淺.
3#
 樓主| 發表於 2008-7-25 10:10:00 | 只看該作者
以上兩篇是以前貼到朋友網站的文章~
6 |/ m9 r' K1 E8 C2 K* Q! `$ x; Z所以口氣比較~~恩~~怪怪的
) A. z0 E  Q0 U( A! z  l4 d請大家多多包涵~
2#
 樓主| 發表於 2008-7-25 10:02:50 | 只看該作者

CPU exception vector 淺談之二

上面貼文本來的用意是要點出,為什麼一個CPU需要有擺放兩個exception vector的' b: K5 L5 B8 S
功能。如果有看懂的話,答案很簡單,就是怕被程式人員亂改改到了,這樣會讓整個OS8 \& r. i$ M$ \
當掉,很容易一個null pointer亂填,整個系統就掛了。可是一開始不知道怎麼帶出這& J) C" ^4 S8 |9 K; N
麼問題,所以文章就變長了。恰巧,也提到一些其他的東西,我們就稍微聊一下CPU& M. a; t  }7 d, _/ U1 R
的模式吧。
2 ]1 P0 c0 p) ]" I) B5 U6 f0 {6 d6 Q
/ p0 i5 _5 C2 t$ y  A  j從 exception vector 看得出來,CPU本身除了拿到指令一直run以外,還會接受一些
- H8 T( @) A2 Oexception發生,發生之後呢,便會到這個vector來拿相對應處理的指令。4 e' M1 B" l0 A. U4 W3 R
1 ^0 J( x; S. x# [- [
舉例來說,一個程式碼被compile成使用某個硬體的特殊指令,可是卻剛好被放到沒支
7 B0 J0 |3 C. D' R$ N+ J援這個指令的 CPU 上執行,那CPU跑著跑著發現一個自己看不懂得指令,就會發出一; F9 U: w6 v; Z" ^2 I% Z6 b0 {, J
個undefined instruction 的 exception,exception發出後,依照CPU的設計,以  h9 P( \8 ^7 S; C
ARM來說,就會抓位址在0x4地方的指令開始執行。& P& g% f- x& C' E+ r
6 a# C/ v  {) Y' {& B4 |9 R
而這時候,我們的處理函式就有機會可以透過這個exception hanlder去模擬這個指令/ N  X/ I2 W; b# O
,利用多個指令或運算計算出那個特殊硬體指令的值。這是其中一種undefined' e* }' V. ]$ L: i* L- p
instruction exception 的應用。
. a7 }( [/ @, l$ U5 c3 }
) l9 f1 C2 g/ N8 n9 R5 u& c. q$ E另外,我們要提的是,這許多的exception其實隱含著CPU的運行模式,例如我們以前3 G$ y# M5 @8 B% c: i5 t$ D& o- K' p
常聽到x86 CPU切到什麼保護模式之類的,其實就是因為發生了一些exception,為了
8 I& h- a& |* E處理這些exception,所以切到相對應的模式去做處理。- x( M- z6 g: o4 w

( X1 z  X& |' w切換模式聽起來很單純,其實對實作OS來說,牽涉到的事情還不少,例如切換模式之
5 |) c0 v$ _7 d! V* }後,為了要讓處理完exception之後,原本的程式能夠繼續執行,相對的exception
# `# c8 t* U$ B/ w$ R! Shandler必須將目前狀態存起來,所以就必須實現stack來存放目前的register status
3 E2 n+ N: E0 C/ D9 t# z! e5 k4 G4 H(context),以便將來可以resume回來。
9 D$ j4 v3 }' x  ^2 r  l* M
. l6 R! S+ b! q7 U0 @# _看到這邊,應該有人會問想說,了解exception vector的意義何在?當你要了解如何
1 {1 B2 |5 z4 C* a實做一個OS的時候,其實就是要去控制CPU,而CPU的運作,其實就是控制這些模- ~0 l& p* ]' A& j3 F
式。而exception vector就是這些模式的進入點。當你對一個OS可以有透徹的了解
' B! F$ P& l+ Z- s; w0 g的時候,對於系統表現出來的行為,會有更新的了解和解釋,對於debug application" a6 M% s" \2 @. ^4 u7 F
和 driver 其實是有幫助的。
! s$ |) E& D" s$ v2 E  x. K
) k' e/ c; y; [6 z) p, S7 z9 c3 H對於各個cpu mode的說明,例如一些有趣的問題:有哪些模式?每個模式有什麼不
* a4 ^0 K7 |5 Q  ~- Q+ n+ h4 U9 `2 S同?它是專門處理那些問題?有哪些種應用?這些因為要牽涉到很多assembly的程) w9 d% x* Q! Z! K6 s
式片段,所以就先不深入探討,有興趣的朋友可以call-in進來,前五個有優惠喔~~
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-21 03:36 PM , Processed in 0.175010 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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