Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

CPU exception vector 淺談之一

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-24 20:11:41 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
因為再深入我也不懂,所以就淺談吧~* @$ ^  k3 ]8 `6 S9 H, X
有錯請指正~
$ _5 p, B0 _1 S) r( {! D
" T. B' [/ V, N/ g0 H- P& y/ n話說,身為一個程式設計人員,常常遇到一些程式跑著跑著就當掉的狀況也很合理的。
2 N6 u9 d& r4 a3 o, K- q/ u, P9 c& }例如:『segmentation fault』。簡單講就是程式寫錯,然後它就當了。
" N- P& f# ?. P: ?/ m! Z; h2 H( F$ R4 {: i5 e) J: O
大家也應該都聽過,『開機之後CPU就會到固定位置去拿指令,然後開始跑,通
' L: [7 ]0 @0 |0 w0 r常這個位置都是放BIOS,而這個位置通常是0』。% t- _1 t+ X: Z4 j
6 V! S5 K: O, }/ f9 Y2 u2 \
那這個第一行指令究竟是長怎樣呢?這跟程式當掉有什麼關係?跟程式碼寫錯8 @! g. T4 w! [5 o7 [4 _1 D
又有什麼關係?+ V/ M) t8 N* ~& S5 X

; A( E3 v% U  P- b* u2 Y我們來看通常一般冷開機之後開始跑的程式碼都是怎樣的% ]1 L/ g# t% n
( 通常就是跳到bootload or BIOS )
; e( _0 `4 R2 q8 P) z/ O9 S1 F' o, e' M  w  C
b start
0 [- A$ e- E" s4 qldr pc, _undefined_instruction
3 ]3 n" M5 a1 {+ g0 W4 Z+ _ldr pc, _software_interrupt
' J& t/ r- h$ j# Vldr pc, _prefetch_abort
2 S! H4 N+ J5 _/ Q# ~! {/ a. dldr pc, _data_abort% Q3 O, I) E# x( V
ldr pc, _not_used
/ h' z3 }! h* e$ p% J6 Z) E/ K+ Wldr pc, _irq3 J" k/ s+ J" Y. y) Y
ldr pc, _fiq8 D% L4 f& F7 ]( |' r

. _0 G6 }3 [, l1 h2 U% D' V, Y5 ?, I, H* w5 G8 |
上面是組語,我們只看兩行,第一行是『b start』,『b』的意思就是branch的( f# P& ^: v) ~! }
意思,也就是jump到start這個地方開始執行。換句換說,CPU拿到手的第一個, a! F. Q7 c9 G3 Q# Z1 c( U
指令就是要它去找別人,顯然是相當不負責任的行為。讓人不禁懷疑那第二行第
- b/ Q9 ?2 H1 A6 r三行到底是幹麼的。3 H& O3 U0 C/ h6 w- W. a' i+ x
. ]& V9 B5 X, A- x3 m
我們接著看『ldr pc, _undefined_instruction』,『ldr』的意思是說,將
9 k! t  w. E3 C/ q_undefined_instruction這個位址,放到pc這個暫存器當中。大家一定也聽過
/ y5 _8 ~! h+ v) O& ^& hprogram counter這個東西,一個正常的CPU就是靠program counter所指
$ B) w  a: d( m2 J" j5 ?的位置去抓指令進來執行。換句話說,第二行程式居然也是要CPU跳到別的地方. `* M* H3 r1 o+ }- P. H( V
執行。而且前面七八行都是做這件事情。很怪吧?!!!
+ l8 @+ }. @# [) K  I
" S, Y/ C& V' ]: m到這裡我們解答了上面第一個疑問,第一行程式其實就是一個Jump的指令,跳到
: D" c% X: w3 C' n  F- j# @5 _真正的開機程序。
9 _- v8 z' H9 d
& i  E# b& S1 z; l看了程式碼之後,我們不禁好奇這些看起來排列很有規則的程式碼到底是做啥用3 i* x3 x- ^6 j. I0 D. k; L
的?其實答案就是『exception vector』。" w9 R9 ?5 D$ O

9 y7 W8 N7 l9 L! s! h' U什麼是exception vector呢?其實就是CPU出錯了(其實不完全是出錯),它就會, x( E  j' r& s' q
來這個vector找看相對應的處理函式,例如遇到看不懂得指令,他就固定會抓0x4
3 A3 |6 d/ \- P: z: u" F位址的指令,也就是『ldr pc, _undefined_instruction』,接著就會跳到處理undefined instruction的函式去處理。3 B; J0 q% e9 L2 |8 l

  {# `% {: h$ ^到這邊我們回答了第二個問題,程式當掉的時候,就是會跑來這個地方,接著再/ a9 Z, ~: h3 Z, x0 {$ s! y
Jump到處理的程式碼。同時我們也發現,一個CPU就是靠著這個vector在處理7 t) F" H5 t3 T- j4 x
各種不同的exception。那....萬一這些vector被改掉了呢?$ G0 n1 d% Q- _9 ]. V, ]
例如:你程式碼拿到一個null pointer,然後又對這個null pointer開始做寫入動. c, n: b4 Z& G+ v' s
作。3 D% v1 G0 j+ h# C+ t" p$ b2 m  o

! K% D2 ]' k2 R( G6 ]char *ptr = NULL;
2 a' O4 _) R9 `1 ?2 i. Omemcpy( ptr, 0x0, 10 );
& `2 Y+ \3 e# N
- i: {0 j3 H0 t. H! K% U1 `! e7 r那整個OS就完全不能動了。可是我們也知道我們現在這樣寫,頂多 segmentation) S. C  X9 h; u: P6 m1 u
fault,並不會怎樣,OS還是照樣活著。why why why?; h& ~1 m- K) d& s: R/ w1 b
原因很簡單,就是這些區段被一些方法保護住了。一般常見的有兩種方法,一種是! ]# B/ {/ n& w9 y' {
MMU,一種是cpu有兩個exception vector存上的位址。* {, r/ G( a0 m

' W. a& w7 ~4 e& w" }MMU可以設定某個區段的存取權力,只能readable的話,那就不會有被改掉的問
" W; w1 q+ z: }8 h7 U3 d題,另外一個方式是可以將exception vector的位址擺到不容易改到的地方,通常8 t8 x7 n& m( }& d5 k
是往高位址的地方擺(high vector address),例如,0xffff0000接近4GB的位% M% C0 @  R( u% H( ]' @
置。(32bit 最多只能定址4GB): N) I* D3 h5 C6 Y6 B' ?
# p! P, K! [* O' V7 ]
第二種方式,通常是一開始開機vector還是從0x0那邊抓,可是經過設定CPU,可& l1 m) }5 f' x
以改變,在不斷電的狀態下,發生exception就會跳到高位位址去找exception' D9 t5 E1 X# J7 a* t2 n; w* I  `
vector。* W$ n, T* K& P4 J+ u6 o- @

- F( I( v+ s& f6 J$ N& o6 n, ip.s. 關於定址模式可能有些人沒感覺,可能要懂整個CPU的memory map之後,
& p; [3 _# `: R3 u會比較有感覺。
, Z- o5 c, Z1 ]( ~4 v
* d8 A+ o; a. j' }p.s. 眼尖的人一定覺得很怪,為什麼vector第一行用『b』,其它卻是用『ldr』,, A( b3 H( \& c* l- J* Z7 j
這個牽涉到本身指令的不同和程式碼是不是relocatable的程式有關,將來有機會
/ ^: p) Q& X- O  a: ?再深入討論吧!!
9 b6 G3 u/ C' j) I- v, B5 |8 b9 `
---% t, L6 n- P1 a
想知道答案的朋友趕快call in進來
- K( l- d) a( y' I前五名我們有優惠
0 n' n  Z' r. b現在進一段廣告~

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
5#
 樓主| 發表於 2008-8-1 10:52:38 | 只看該作者
....9 L- U9 h: c! H$ `
....
1 y2 y8 J, R' g) u0 |....) q- W, `* T7 V: ^! h
....1 c/ n( z2 P  T$ w6 H
....
' M. _$ Z# [8 |0 i$ c9 o....
3 D& I+ x8 K) X3 z: U+ m....
9 A; A- ^+ G  }  x....7 p. ~( V3 W/ l; {# s! j' g
....6 {4 I1 g4 ]. |7 s3 u5 U; Q
....
) x+ p. W' h1 a  `/ [/ {....
: G1 s- q7 k7 ]  j& H....1 [4 b4 u: s! C* m7 O; N/ c5 v  A2 C
....
, `# ?' q# `' e+ @. S....% K" g7 ]( Q+ b" D  P
....! K- I! A) P; u7 L4 G6 P' a
....
* J* |. @. O$ C# l: u% E, I" s6 J文繞圖模式
: V$ @4 `1 ?7 e+ Y8 l加點字讓它避開一下/ e( ~: j. c! h8 m* [3 r0 b. L2 p
原帖由 rogeryang 於 2008-7-31 08:42 PM 發表 3 g! a  o* q4 \/ E
哇.大大很厲害.                       
3 y" e+ V; t( O1 i- `$ Q, [看完你的文章讓我受益匪淺.

% ?0 m0 t% Q+ b& i
. ^- b. O% B5 }# Z4 g, w呵~ 感謝捧場ㄟ
- d! y: Y0 Z& p4 d( Z" z2 n; G3 y$ @之前都沒人回文7 T& A9 B; y  {5 h- t
不知道文章是不是沒寫好" h  c7 D, A$ F* X' i
anyway, 有交流是好
9 B8 q! j5 `5 y. k6 ~3 [2 H有時候會一個東西不是因為很厲害& X# w; x* o( z
只是碰巧碰過所以就會了
" i+ E8 M0 s5 Y6 ]7 ]+ @2 a
0 @0 G3 n7 t0 i6 G6 [0 U6 S會貼文的目的 (以前大多是潛水居多)$ _( g. q' {7 A+ d% E* g. E
就是還沒遇上的人可以多了解+ Z8 Y$ z) ^9 E" @' k; V" \
會多一點的人可以進來指導一下 5 s4 Z8 F" [. q( f- u6 Z
, s7 Q: z0 a6 U. ~1 ~
[ 本帖最後由 gogojesse 於 2008-8-1 10:58 AM 編輯 ]
4#
發表於 2008-7-31 20:42:13 | 只看該作者
哇.大大很厲害.                       
% F# M- K3 G4 F( T* c. n0 X* c看完你的文章讓我受益匪淺.
3#
 樓主| 發表於 2008-7-25 10:10:00 | 只看該作者
以上兩篇是以前貼到朋友網站的文章~$ x$ b" J6 W2 ]  B! Q
所以口氣比較~~恩~~怪怪的1 g3 `7 c! s4 z( ~  r$ B2 @3 s$ {
請大家多多包涵~
2#
 樓主| 發表於 2008-7-25 10:02:50 | 只看該作者

CPU exception vector 淺談之二

上面貼文本來的用意是要點出,為什麼一個CPU需要有擺放兩個exception vector的+ h! z2 a; D* U" D
功能。如果有看懂的話,答案很簡單,就是怕被程式人員亂改改到了,這樣會讓整個OS6 c; z- W1 D' T' R4 P
當掉,很容易一個null pointer亂填,整個系統就掛了。可是一開始不知道怎麼帶出這. x7 k; j7 G9 i9 b8 O( W
麼問題,所以文章就變長了。恰巧,也提到一些其他的東西,我們就稍微聊一下CPU2 ~% e  {: f: }' t
的模式吧。; C' b+ |7 K# Z6 u

; l  M7 d; y  d( Y3 t從 exception vector 看得出來,CPU本身除了拿到指令一直run以外,還會接受一些7 R4 L9 o! _! X# d$ K& z  v0 y
exception發生,發生之後呢,便會到這個vector來拿相對應處理的指令。
' ^! `' Q1 ^/ u+ P, {( m4 }  W( i
5 H2 k3 D& v" k' Z舉例來說,一個程式碼被compile成使用某個硬體的特殊指令,可是卻剛好被放到沒支4 I% `) b' F" l. `7 L3 G# X
援這個指令的 CPU 上執行,那CPU跑著跑著發現一個自己看不懂得指令,就會發出一
6 d1 s2 ?* h# ^& d4 Z( m個undefined instruction 的 exception,exception發出後,依照CPU的設計,以7 [0 @9 b+ ?. a; O7 p9 S0 s( C! W$ K( [
ARM來說,就會抓位址在0x4地方的指令開始執行。
- L/ }: ?) y) \8 k1 Y( L) o' ~) L( G" Z) m" r5 m2 z# g
而這時候,我們的處理函式就有機會可以透過這個exception hanlder去模擬這個指令8 s8 D& w& c! O0 I
,利用多個指令或運算計算出那個特殊硬體指令的值。這是其中一種undefined
1 c0 E- |! U6 u. ~, h+ `instruction exception 的應用。( D  r* o/ N. G! `4 F  j' {

# h% t7 s- X: L" D另外,我們要提的是,這許多的exception其實隱含著CPU的運行模式,例如我們以前( a$ U" W5 O6 \3 z
常聽到x86 CPU切到什麼保護模式之類的,其實就是因為發生了一些exception,為了8 C  H$ k, ^$ @* ?3 ]. |2 h$ K) J
處理這些exception,所以切到相對應的模式去做處理。" N) h$ Q! O; w2 Z* t4 ]

$ \0 e& L# K: @切換模式聽起來很單純,其實對實作OS來說,牽涉到的事情還不少,例如切換模式之$ R- r5 s0 h/ {9 O' R% x) N" X
後,為了要讓處理完exception之後,原本的程式能夠繼續執行,相對的exception
! B& y" U* i9 W- J& }/ q' xhandler必須將目前狀態存起來,所以就必須實現stack來存放目前的register status9 a: W4 O) m# l) @0 I1 K4 U
(context),以便將來可以resume回來。, Y+ T1 J- o5 C2 a

: A' C- D8 b; h" v5 z看到這邊,應該有人會問想說,了解exception vector的意義何在?當你要了解如何" g+ n% E# f: v( R0 q0 Q5 }
實做一個OS的時候,其實就是要去控制CPU,而CPU的運作,其實就是控制這些模
9 M! N1 f- b4 O1 |! q* @, O式。而exception vector就是這些模式的進入點。當你對一個OS可以有透徹的了解5 X- M/ Y- ]$ T
的時候,對於系統表現出來的行為,會有更新的了解和解釋,對於debug application
( p0 e5 K! `6 m$ {$ J+ J9 _和 driver 其實是有幫助的。
. l. C6 @# g; b! i/ A8 x$ Y: C8 p) X# q2 t5 a# ?3 z! I
對於各個cpu mode的說明,例如一些有趣的問題:有哪些模式?每個模式有什麼不
, Z: d; f$ ~& \+ u6 m同?它是專門處理那些問題?有哪些種應用?這些因為要牽涉到很多assembly的程8 m  e3 H. I. P  v% }
式片段,所以就先不深入探討,有興趣的朋友可以call-in進來,前五個有優惠喔~~
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-1-23 12:58 AM , Processed in 0.156000 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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