Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

CPU exception vector 淺談之一

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-24 20:11:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
因為再深入我也不懂,所以就淺談吧~6 a9 K, e: H: F1 |/ A- o
有錯請指正~
) E8 N) \6 H7 c" D+ H2 m( R! D% [( O
話說,身為一個程式設計人員,常常遇到一些程式跑著跑著就當掉的狀況也很合理的。
' O( P" n" v2 O例如:『segmentation fault』。簡單講就是程式寫錯,然後它就當了。
4 H/ o& {3 H; i1 ^2 c
1 Y% S2 z8 G2 I. h; D( o大家也應該都聽過,『開機之後CPU就會到固定位置去拿指令,然後開始跑,通. P" N7 H$ f( p5 c
常這個位置都是放BIOS,而這個位置通常是0』。) f/ n4 ^1 F( [( `+ p9 Z

; L  g$ U& x* V3 n4 E那這個第一行指令究竟是長怎樣呢?這跟程式當掉有什麼關係?跟程式碼寫錯. f6 [+ n- I- E# a, P& g
又有什麼關係?/ |+ o5 T( m1 B
9 U) b% w; x# J2 A, @) p+ ]
我們來看通常一般冷開機之後開始跑的程式碼都是怎樣的" n: Y$ w" x' f& [; m4 E
( 通常就是跳到bootload or BIOS )
) \9 y9 [+ m( A5 ]4 H
9 N6 c: r% X* f7 u3 Pb start
7 W( }3 U, G, L8 Z0 j1 v" R+ bldr pc, _undefined_instruction& K" y7 D: W% l0 j2 h( e! p$ [- H1 g
ldr pc, _software_interrupt0 \7 D" B3 Z1 I* L' t
ldr pc, _prefetch_abort
, o9 {& m# A" x" }+ zldr pc, _data_abort
% ^* S" M" a3 Dldr pc, _not_used6 [* u4 H2 i& B/ v1 H1 x
ldr pc, _irq
/ t" E" e% G4 v5 Jldr pc, _fiq' W% G+ N6 u9 v4 ]3 e

6 B4 b1 w9 L) y! S
' G( J- t2 b- R) `" z6 j上面是組語,我們只看兩行,第一行是『b start』,『b』的意思就是branch的
( S4 r$ D2 q3 |0 Y& R9 {$ M8 j意思,也就是jump到start這個地方開始執行。換句換說,CPU拿到手的第一個0 Y: `- g/ [- V7 {' }
指令就是要它去找別人,顯然是相當不負責任的行為。讓人不禁懷疑那第二行第
. q: \! H2 u  \6 @6 i三行到底是幹麼的。2 e2 V( s* F+ ~8 a
7 v9 `# b. z4 U2 k! ?. y8 M
我們接著看『ldr pc, _undefined_instruction』,『ldr』的意思是說,將0 f" J: C5 ]+ }+ q
_undefined_instruction這個位址,放到pc這個暫存器當中。大家一定也聽過1 n  D8 O  E  Z7 k9 K0 t
program counter這個東西,一個正常的CPU就是靠program counter所指5 @" w% H6 j  o0 Q. z/ E
的位置去抓指令進來執行。換句話說,第二行程式居然也是要CPU跳到別的地方
5 T+ H7 t' U6 Q- P( m! ]執行。而且前面七八行都是做這件事情。很怪吧?!!!  `) y! {4 Q" ~6 `

, x  r* q3 Z; H% E到這裡我們解答了上面第一個疑問,第一行程式其實就是一個Jump的指令,跳到; X3 \0 x" M7 N1 l, p3 e" c8 ~
真正的開機程序。
# E7 m. `: Y9 `9 B& }$ ?" ], c8 U; Q, C' o- u/ X. `' @
看了程式碼之後,我們不禁好奇這些看起來排列很有規則的程式碼到底是做啥用7 M% @6 n+ x3 ?9 }# [1 L2 m
的?其實答案就是『exception vector』。  a: e  Z+ u* }' P  ~3 ~

1 L9 W! ]" ^6 R7 e( ?- \什麼是exception vector呢?其實就是CPU出錯了(其實不完全是出錯),它就會: k3 k: m4 a* ?1 R
來這個vector找看相對應的處理函式,例如遇到看不懂得指令,他就固定會抓0x4
9 }( O; ^" n# {4 F+ g0 }位址的指令,也就是『ldr pc, _undefined_instruction』,接著就會跳到處理undefined instruction的函式去處理。# X  T- Y; P. o6 Y+ Y

* s+ ]2 O6 w9 P. `9 P. E到這邊我們回答了第二個問題,程式當掉的時候,就是會跑來這個地方,接著再
: b8 g( w' o3 S' G0 J* G( y! i  PJump到處理的程式碼。同時我們也發現,一個CPU就是靠著這個vector在處理
# K* S& {% j7 A1 M3 [各種不同的exception。那....萬一這些vector被改掉了呢?- c3 }& s4 B2 p% c
例如:你程式碼拿到一個null pointer,然後又對這個null pointer開始做寫入動
5 y2 C. A' {" i& |; g作。
( }0 g- z% s3 }8 Z) o- D$ ?! R
. ?& T% E; y4 i) a: t* e" bchar *ptr = NULL;  _* s0 f- j: `0 e/ Y( _
memcpy( ptr, 0x0, 10 );
9 [8 n( i7 d( y, E* x; W( o( i+ b; U" D3 s' j5 s3 R# l
那整個OS就完全不能動了。可是我們也知道我們現在這樣寫,頂多 segmentation
5 z; E% \5 S/ [3 O4 j( z% Mfault,並不會怎樣,OS還是照樣活著。why why why?4 p: R4 Z( P- e( ~
原因很簡單,就是這些區段被一些方法保護住了。一般常見的有兩種方法,一種是
5 ~1 ^5 F. o# h: r5 _) k- H9 N2 ?MMU,一種是cpu有兩個exception vector存上的位址。0 N0 G( m8 r3 Q4 I# V% k" n9 M

  G, ]" U- b( t* u; K1 I2 xMMU可以設定某個區段的存取權力,只能readable的話,那就不會有被改掉的問
" i: [" O2 X; }) X- B題,另外一個方式是可以將exception vector的位址擺到不容易改到的地方,通常7 O+ P+ `* I: y& L
是往高位址的地方擺(high vector address),例如,0xffff0000接近4GB的位
1 w! r) ^; C1 \' ?/ J+ v5 {8 w置。(32bit 最多只能定址4GB)$ z/ M2 d5 h* M3 o6 L

8 ]" u: g/ C6 i/ b# t5 w第二種方式,通常是一開始開機vector還是從0x0那邊抓,可是經過設定CPU,可
1 K+ z' ]7 b+ F- L) {1 |以改變,在不斷電的狀態下,發生exception就會跳到高位位址去找exception6 C7 r- E; ?2 C6 R
vector。
  O0 f* ]7 D# e2 x4 j+ G0 C) J/ v& k$ F& S
p.s. 關於定址模式可能有些人沒感覺,可能要懂整個CPU的memory map之後,& l, y; ^/ b+ x4 u
會比較有感覺。& c2 S3 j# U, ?$ l) `7 S1 a

  ]7 Q4 ]' `; n) f$ Np.s. 眼尖的人一定覺得很怪,為什麼vector第一行用『b』,其它卻是用『ldr』,
( K8 {# Q% R& Y3 R- d3 @這個牽涉到本身指令的不同和程式碼是不是relocatable的程式有關,將來有機會) J, ~4 N) i) H6 F% D
再深入討論吧!!% g* c8 a  F( @  N8 B

' l' g) R+ u* Z9 |2 [1 \---
/ r" C% j. O  a) I4 G' r! V$ d+ Z想知道答案的朋友趕快call in進來
  j# ^+ l- G, a$ i前五名我們有優惠0 I0 O6 ]: F% E" r7 T/ v
現在進一段廣告~

評分

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

查看全部評分

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

CPU exception vector 淺談之二

上面貼文本來的用意是要點出,為什麼一個CPU需要有擺放兩個exception vector的2 g* m! J% d$ k$ g9 S
功能。如果有看懂的話,答案很簡單,就是怕被程式人員亂改改到了,這樣會讓整個OS( E  A$ k* p+ P" V
當掉,很容易一個null pointer亂填,整個系統就掛了。可是一開始不知道怎麼帶出這$ }7 \) P) q# C. |' Z% \
麼問題,所以文章就變長了。恰巧,也提到一些其他的東西,我們就稍微聊一下CPU3 |1 u8 W6 a- ~4 G) x/ X& g
的模式吧。
2 Z3 Z" ]; z! v2 H4 d' @" d; K0 r1 c
從 exception vector 看得出來,CPU本身除了拿到指令一直run以外,還會接受一些! p, z, a, d) P* p% w
exception發生,發生之後呢,便會到這個vector來拿相對應處理的指令。! @3 M$ R% N& O. ~/ _; w
! s* ]5 X+ x' N% A3 Z! z8 q
舉例來說,一個程式碼被compile成使用某個硬體的特殊指令,可是卻剛好被放到沒支
3 U- @. u# {/ A$ s援這個指令的 CPU 上執行,那CPU跑著跑著發現一個自己看不懂得指令,就會發出一. @( @9 b% f( `! v2 W/ n5 e* x# G
個undefined instruction 的 exception,exception發出後,依照CPU的設計,以
; y+ G2 s  h) e& t  S0 @6 aARM來說,就會抓位址在0x4地方的指令開始執行。. y6 _& @6 E! W5 v
8 E" q9 ?) C) h, u3 l) x& h
而這時候,我們的處理函式就有機會可以透過這個exception hanlder去模擬這個指令
* w$ x! a( y, V' e& k+ D2 x  S,利用多個指令或運算計算出那個特殊硬體指令的值。這是其中一種undefined( Z$ @1 n8 S) Z; B3 ^
instruction exception 的應用。7 j( h; x4 k' |( a' V! n

( [5 j( Z0 |% s& r! R4 p& e6 {另外,我們要提的是,這許多的exception其實隱含著CPU的運行模式,例如我們以前; V6 }3 @2 \0 @# O. h5 a
常聽到x86 CPU切到什麼保護模式之類的,其實就是因為發生了一些exception,為了
. A5 X% U0 _3 F5 b1 W- y處理這些exception,所以切到相對應的模式去做處理。
. p& b; o& Z, O6 g: y+ T7 B1 x' |
切換模式聽起來很單純,其實對實作OS來說,牽涉到的事情還不少,例如切換模式之( C' I9 H4 A! `) C' j: q2 ]( a
後,為了要讓處理完exception之後,原本的程式能夠繼續執行,相對的exception1 P' U1 J9 w! V) Y; U2 {
handler必須將目前狀態存起來,所以就必須實現stack來存放目前的register status
' i# Z  g6 ~! J: X) P# `: ](context),以便將來可以resume回來。8 K/ p  C6 m. U7 E6 }/ X- w: C
5 Q3 m9 v* |! {, f/ o
看到這邊,應該有人會問想說,了解exception vector的意義何在?當你要了解如何. o* ^: c; [% i  R2 B
實做一個OS的時候,其實就是要去控制CPU,而CPU的運作,其實就是控制這些模
/ x/ d" n3 F/ \) {+ R式。而exception vector就是這些模式的進入點。當你對一個OS可以有透徹的了解* g1 d9 F6 D% H( h5 ?5 z% L! M
的時候,對於系統表現出來的行為,會有更新的了解和解釋,對於debug application$ g6 X; b9 R* z) u" P
和 driver 其實是有幫助的。
% @- d( U. R8 H3 B
; Z6 U+ p: V3 [  ~對於各個cpu mode的說明,例如一些有趣的問題:有哪些模式?每個模式有什麼不
" {4 \4 Q7 h1 P% g: m同?它是專門處理那些問題?有哪些種應用?這些因為要牽涉到很多assembly的程
& T7 E# r9 T. d. y! J, z式片段,所以就先不深入探討,有興趣的朋友可以call-in進來,前五個有優惠喔~~
3#
 樓主| 發表於 2008-7-25 10:10:00 | 只看該作者
以上兩篇是以前貼到朋友網站的文章~. b* ~+ x4 f+ M( s. G0 o
所以口氣比較~~恩~~怪怪的
4 e- x8 f) K( H$ P: i) k請大家多多包涵~
4#
發表於 2008-7-31 20:42:13 | 只看該作者
哇.大大很厲害.                       6 v7 C" D; g( i0 p$ b
看完你的文章讓我受益匪淺.
5#
 樓主| 發表於 2008-8-1 10:52:38 | 只看該作者
....$ j; ]$ K6 c2 ~: E; C& L
....
5 n4 _. t0 Y! l# s3 u# W..... P3 c3 o8 `5 [$ V6 D& k
....
8 B4 l2 u; w3 b4 W3 R* j: Y8 S" D$ ^' Q....7 P8 Q, f5 T' I* s
....
8 L0 {: N& m3 j* ^2 |....
0 \" x( m! q, A% J7 \....
( k& [* H. c1 m5 Q! l% R/ h& _....! N/ u$ B& C9 Z- h. g7 s" q
....8 w) p" _7 O  m+ N# S) X
....
/ h9 L  L' R$ O) w, |....
  T- `( N+ w8 B* T....# u9 q( P  ?: X: `0 Z3 e: K
....3 j' w  ^6 }9 o* k
....9 J- g( @) Z& |
....# d. _# n& U9 f9 o2 H/ B
文繞圖模式
# |& \: q4 d  S8 T加點字讓它避開一下' e/ T4 {0 j/ C: r9 m% O6 n; ~
原帖由 rogeryang 於 2008-7-31 08:42 PM 發表 9 d& k6 f2 c$ Z: j7 t( L
哇.大大很厲害.                       & _3 T4 |( t; @- |/ s
看完你的文章讓我受益匪淺.
+ u0 g5 M' u: K0 p: g, v5 i

7 R: V8 H5 v& b0 i) v& O8 I呵~ 感謝捧場ㄟ
! R9 j5 ^3 Y" {0 M" p% Q9 R: h% \之前都沒人回文
2 C* Z& F1 n' u; F' P( G不知道文章是不是沒寫好1 M7 t- b$ c0 g/ Q
anyway, 有交流是好1 V7 b6 O: t* q  R0 f! |
有時候會一個東西不是因為很厲害& y% E& N  n" p# v
只是碰巧碰過所以就會了* t6 M# I& s6 y, D3 b

2 v4 _0 l% h  `- k% Y$ o+ p會貼文的目的 (以前大多是潛水居多)
' m  l1 y( m* J就是還沒遇上的人可以多了解+ l( P" l4 I; ^* l+ O: J
會多一點的人可以進來指導一下 ( H$ g$ U7 X9 u& f7 ~" V

( }) N  Q4 _! p+ c5 H[ 本帖最後由 gogojesse 於 2008-8-1 10:58 AM 編輯 ]
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-21 03:40 PM , Processed in 0.186010 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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