Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

CPU exception vector 淺談之一

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-24 20:11:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
因為再深入我也不懂,所以就淺談吧~
4 w* `. A/ T/ s7 |) M' N$ k& @有錯請指正~$ i' f5 r0 j8 P( g7 V

) K$ b9 Q1 i% e9 n0 }6 l" u話說,身為一個程式設計人員,常常遇到一些程式跑著跑著就當掉的狀況也很合理的。3 E( j4 G) w6 x+ ~4 H
例如:『segmentation fault』。簡單講就是程式寫錯,然後它就當了。
) d2 o& z: S  l3 T4 @& K3 [, Y& L, k3 b9 n% r$ |4 d
大家也應該都聽過,『開機之後CPU就會到固定位置去拿指令,然後開始跑,通
; T0 h+ \: b/ V! C5 c常這個位置都是放BIOS,而這個位置通常是0』。
, ~+ _: |, P/ A) Z( s8 u% s8 g3 M3 A2 l6 o! r( V
那這個第一行指令究竟是長怎樣呢?這跟程式當掉有什麼關係?跟程式碼寫錯
, ]6 k( B# F- ?3 p1 Y又有什麼關係?( ^$ h, L' K: y3 b+ J! ]

7 `/ K5 |6 y3 Q3 b! g我們來看通常一般冷開機之後開始跑的程式碼都是怎樣的7 i) B. V" x' d! J9 d  r  ?, d$ h
( 通常就是跳到bootload or BIOS )* Q  |3 p! w8 I

8 r2 p; |' K: g1 |9 r) v7 }" rb start, Q; V$ d( c" I% _  @
ldr pc, _undefined_instruction
; f& V  F0 g3 b9 _- Pldr pc, _software_interrupt% r' `: z: P4 h+ j4 H: P: M
ldr pc, _prefetch_abort3 P4 D6 a0 m! \6 H" U& T
ldr pc, _data_abort# u) I3 Z$ u* v% W3 U! T
ldr pc, _not_used3 u! }, M7 b# h2 Q$ s1 U  U& H* H" M. F
ldr pc, _irq
# I' p) \% {1 Lldr pc, _fiq7 u/ ^4 D3 P1 l5 G: l
) b% Q' `; X- d4 ^" Z% ^# ~# Q; n
4 }) o% ?; I' t
上面是組語,我們只看兩行,第一行是『b start』,『b』的意思就是branch的  D6 t  N& J; g+ E
意思,也就是jump到start這個地方開始執行。換句換說,CPU拿到手的第一個) [2 O+ [' z- }) v. b7 g3 ?; y% o
指令就是要它去找別人,顯然是相當不負責任的行為。讓人不禁懷疑那第二行第1 X5 L% [% |4 R2 x+ N# X5 P4 R
三行到底是幹麼的。
4 R5 @7 g. N" T3 E- }$ b0 H* J- n
我們接著看『ldr pc, _undefined_instruction』,『ldr』的意思是說,將- ~( r( p% i8 ^4 L7 ~- u/ D
_undefined_instruction這個位址,放到pc這個暫存器當中。大家一定也聽過
8 K- o  g/ U4 z6 Lprogram counter這個東西,一個正常的CPU就是靠program counter所指" {8 C2 L/ Q6 F& K4 n
的位置去抓指令進來執行。換句話說,第二行程式居然也是要CPU跳到別的地方4 h" c; A7 |: I5 a. [2 A/ w& S
執行。而且前面七八行都是做這件事情。很怪吧?!!!
" A, h# j" C% i
$ I8 d  s, \; Z) R  B7 f0 i. |0 w到這裡我們解答了上面第一個疑問,第一行程式其實就是一個Jump的指令,跳到' z+ y( Z9 U4 e; a& K8 D
真正的開機程序。
% `4 [) I! C6 c4 L  z& x5 \! b) P# @: l
看了程式碼之後,我們不禁好奇這些看起來排列很有規則的程式碼到底是做啥用
0 s2 i* x0 s6 D的?其實答案就是『exception vector』。
, |" {( L" ~% r- U2 J3 @6 V
! \' J; Q0 n/ G什麼是exception vector呢?其實就是CPU出錯了(其實不完全是出錯),它就會9 `5 a  H6 }4 I
來這個vector找看相對應的處理函式,例如遇到看不懂得指令,他就固定會抓0x4
' ^4 m  i# D6 {; H. `位址的指令,也就是『ldr pc, _undefined_instruction』,接著就會跳到處理undefined instruction的函式去處理。$ r3 ^0 n/ H$ S- O' _; l9 y. `
* v8 }+ j$ t" H- p! X
到這邊我們回答了第二個問題,程式當掉的時候,就是會跑來這個地方,接著再
2 l8 s* Q- Z, t$ VJump到處理的程式碼。同時我們也發現,一個CPU就是靠著這個vector在處理) y% K& U+ L1 |+ }- j
各種不同的exception。那....萬一這些vector被改掉了呢?- |/ k" D; L  a  z! M
例如:你程式碼拿到一個null pointer,然後又對這個null pointer開始做寫入動
% E$ L; ^& F5 {作。/ O: O1 A5 k1 Y; n# c

: z8 ?! N; ^+ z# {+ g) Nchar *ptr = NULL;
+ b  c# N. U) W$ f9 c$ s' `) Mmemcpy( ptr, 0x0, 10 );9 I/ d! \. Z, L3 c1 y

0 A7 T4 j2 o# r$ m0 m$ u- W0 v8 Q那整個OS就完全不能動了。可是我們也知道我們現在這樣寫,頂多 segmentation; u8 x$ X- b, J1 A; \8 }& T/ ?
fault,並不會怎樣,OS還是照樣活著。why why why?
" |1 n5 ?, X' T  n原因很簡單,就是這些區段被一些方法保護住了。一般常見的有兩種方法,一種是9 W7 z( u3 O% C6 R) Z! X0 b) d1 x
MMU,一種是cpu有兩個exception vector存上的位址。
3 `1 _# o& k& c9 w9 V; ^; b+ @7 q6 R" b% w0 s& a
MMU可以設定某個區段的存取權力,只能readable的話,那就不會有被改掉的問
7 |! S) j; Z1 |' Q& r# n題,另外一個方式是可以將exception vector的位址擺到不容易改到的地方,通常% S( R# M  S9 E! e* k$ y
是往高位址的地方擺(high vector address),例如,0xffff0000接近4GB的位7 Z9 ~1 ~0 @" u2 B9 x- l2 d* C
置。(32bit 最多只能定址4GB)9 M8 |, g% }. T0 h  p, Q

7 J+ ^! S! P& U$ Y第二種方式,通常是一開始開機vector還是從0x0那邊抓,可是經過設定CPU,可
$ m& K7 x8 B/ ?以改變,在不斷電的狀態下,發生exception就會跳到高位位址去找exception2 q" ~: D# U2 F! b  H7 r: z
vector。
: C3 `  E6 @; o. J$ i6 F: @. B7 N" N5 u) j# ?, K
p.s. 關於定址模式可能有些人沒感覺,可能要懂整個CPU的memory map之後,
9 m7 |6 C& Q" `6 O+ S8 G+ e- e/ s會比較有感覺。
8 @  x# D3 M2 a6 u# |( D
2 o- e5 _  y: ]! G) q9 c! kp.s. 眼尖的人一定覺得很怪,為什麼vector第一行用『b』,其它卻是用『ldr』,
4 ]( t5 J; h+ ?8 \! b& `這個牽涉到本身指令的不同和程式碼是不是relocatable的程式有關,將來有機會+ V' l9 S) \) }& S( Y" O8 m$ R
再深入討論吧!!
5 f6 R$ d, D7 ~/ E. K% w; A( n: f1 h) s* d9 E, ^8 e
---0 T. S( @# j& c# I
想知道答案的朋友趕快call in進來
  K; {* t5 G* a0 Q. b. M5 x( Y2 i0 _前五名我們有優惠
2 R! ^! Y4 ?9 Z3 o3 ~" v1 ^# K現在進一段廣告~

評分

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

查看全部評分

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

CPU exception vector 淺談之二

上面貼文本來的用意是要點出,為什麼一個CPU需要有擺放兩個exception vector的
. g% M8 {: S7 T4 b3 M  N0 d' S3 p; e- b1 |功能。如果有看懂的話,答案很簡單,就是怕被程式人員亂改改到了,這樣會讓整個OS
1 f3 O& C( v. c* X# j當掉,很容易一個null pointer亂填,整個系統就掛了。可是一開始不知道怎麼帶出這5 K' Q4 |8 a6 q' u, o
麼問題,所以文章就變長了。恰巧,也提到一些其他的東西,我們就稍微聊一下CPU
4 [9 k# e! @7 O5 X的模式吧。% y- |. n" x3 z, A

/ g! M" S! c( g: {) X0 c* o從 exception vector 看得出來,CPU本身除了拿到指令一直run以外,還會接受一些
& [8 k9 V. G0 G. a% I$ Lexception發生,發生之後呢,便會到這個vector來拿相對應處理的指令。4 I% F/ Y) e$ F0 x

* h: W' R3 `, n舉例來說,一個程式碼被compile成使用某個硬體的特殊指令,可是卻剛好被放到沒支
' f2 h/ ~& Y' u! H' {: D1 A# b援這個指令的 CPU 上執行,那CPU跑著跑著發現一個自己看不懂得指令,就會發出一( z1 H& @8 u+ y5 J3 H8 M* U; d8 E
個undefined instruction 的 exception,exception發出後,依照CPU的設計,以/ _3 x' u) @+ l6 h7 f6 ]9 V/ T
ARM來說,就會抓位址在0x4地方的指令開始執行。* q' G+ ]4 O$ M4 j! ~+ M

; c% U$ W. v) K* O0 Y2 t而這時候,我們的處理函式就有機會可以透過這個exception hanlder去模擬這個指令
1 M) m) g: a3 r* m- O1 s7 V4 H,利用多個指令或運算計算出那個特殊硬體指令的值。這是其中一種undefined
1 J: ?8 M2 t. O% u5 finstruction exception 的應用。
( Y. F4 E. Q3 ?' V( q4 I' p% ]; H1 `9 v- z
另外,我們要提的是,這許多的exception其實隱含著CPU的運行模式,例如我們以前; p1 _; V* X) ]# N
常聽到x86 CPU切到什麼保護模式之類的,其實就是因為發生了一些exception,為了
/ @+ D2 m/ T  _# n0 [/ C$ l處理這些exception,所以切到相對應的模式去做處理。4 @2 P: h4 t- Z$ N. M4 _
: o* M& }3 E8 y( |+ e
切換模式聽起來很單純,其實對實作OS來說,牽涉到的事情還不少,例如切換模式之
7 f3 V; L5 b7 p4 ~% H& h- y後,為了要讓處理完exception之後,原本的程式能夠繼續執行,相對的exception
+ c, z& X7 Z) C) E+ D9 Yhandler必須將目前狀態存起來,所以就必須實現stack來存放目前的register status- }5 I3 {9 k1 _9 D- N) l3 v) A
(context),以便將來可以resume回來。
" P7 |# n0 e% i+ {1 U
$ E# [4 w4 X, c看到這邊,應該有人會問想說,了解exception vector的意義何在?當你要了解如何
. D; R0 M0 _  h8 o實做一個OS的時候,其實就是要去控制CPU,而CPU的運作,其實就是控制這些模
% Y' n4 k' g0 d4 r式。而exception vector就是這些模式的進入點。當你對一個OS可以有透徹的了解5 `% N: @+ l6 f: c+ N! z
的時候,對於系統表現出來的行為,會有更新的了解和解釋,對於debug application  ?7 [: b. Y$ I. Y: g8 p+ q
和 driver 其實是有幫助的。
1 }! }& v  f9 |  e( X& X2 j  B( P9 Q) T# V
對於各個cpu mode的說明,例如一些有趣的問題:有哪些模式?每個模式有什麼不
- W* \8 B9 ~' }- i  Q1 v同?它是專門處理那些問題?有哪些種應用?這些因為要牽涉到很多assembly的程
  e, N/ W0 B# x. p/ `- i8 `式片段,所以就先不深入探討,有興趣的朋友可以call-in進來,前五個有優惠喔~~
3#
 樓主| 發表於 2008-7-25 10:10:00 | 只看該作者
以上兩篇是以前貼到朋友網站的文章~  ^0 Q2 R: P% n2 i% `, D
所以口氣比較~~恩~~怪怪的5 a) ]5 V) v& ]# E7 h
請大家多多包涵~
4#
發表於 2008-7-31 20:42:13 | 只看該作者
哇.大大很厲害.                       ' _% ?! p; E8 Y  p$ }% f
看完你的文章讓我受益匪淺.
5#
 樓主| 發表於 2008-8-1 10:52:38 | 只看該作者
....# }4 M; b1 K! T( J& u9 P
....
' b% r" e+ P3 D2 W....
" [! Z4 L! o8 l) c....# L  o% p5 L) E1 v0 l2 \- b4 r
....
  Q: [+ G0 _# g6 |....
5 z7 _$ _; \8 C, d5 a....) I/ G& P  q1 A
....7 G# e( }4 v6 c* v2 `) z# D
....# [( H; s0 ~/ Y$ r) a# B: f9 U$ a
..... V! B$ G0 e- n6 {
....- G2 H1 \+ V: L& P. d) r& i6 m9 a" n
....
* _5 D9 |0 g; B8 q: C....
  n- k' }% f+ z& D3 f: W- Z...." x+ z7 V% F# V  Q" L, ~4 D/ B
....0 p" G5 d; f$ Y7 e1 H8 f
....
/ N! L" V' Q" ?  z7 ^( g4 S5 M文繞圖模式
* r5 S8 q9 Z  G& u. o. T加點字讓它避開一下
2 G4 `; [- v! j6 h4 v
原帖由 rogeryang 於 2008-7-31 08:42 PM 發表
7 a$ V+ s; ?9 o8 N+ N. T哇.大大很厲害.                       
" G. h' C: T; o看完你的文章讓我受益匪淺.
/ U: s& D" W$ M3 U+ u5 U

9 d7 N1 Q6 C) E8 D' f( D- C  B3 c  ]) p呵~ 感謝捧場ㄟ, j" E6 ?" e8 R3 Q
之前都沒人回文6 j8 `- a( |2 X: N) q8 T+ ?
不知道文章是不是沒寫好
7 X- i) a% E4 I2 q- A3 Danyway, 有交流是好  e+ `1 N( N4 U3 U$ o/ _
有時候會一個東西不是因為很厲害
0 n& x! d; d1 d& n只是碰巧碰過所以就會了- u+ l0 y* G; u8 D. n

9 [1 L2 B0 }* `0 [4 P$ y3 a, ?- j會貼文的目的 (以前大多是潛水居多)
2 v% I9 ~9 W9 A/ @就是還沒遇上的人可以多了解" U3 t( {! W# D- R
會多一點的人可以進來指導一下 & L" `0 l; i1 m1 x. L+ V& ^4 n- @
2 R3 h/ a. W% T$ L) E
[ 本帖最後由 gogojesse 於 2008-8-1 10:58 AM 編輯 ]
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-28 04:16 AM , Processed in 0.158009 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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