Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

CPU exception vector 淺談之一

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-24 20:11:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
因為再深入我也不懂,所以就淺談吧~
3 `9 O: t. {) o7 o" S. \有錯請指正~
' _% F, z; b" k7 z6 @& N3 L3 a0 {5 d* M9 c1 h8 [, V
話說,身為一個程式設計人員,常常遇到一些程式跑著跑著就當掉的狀況也很合理的。
) m, y5 _. v- K9 H1 p: R) s' @例如:『segmentation fault』。簡單講就是程式寫錯,然後它就當了。4 s. }' R- b0 ]; B% ~; Q$ c) e& _& @  c
2 d. W. ^. h' ^1 \% m* i
大家也應該都聽過,『開機之後CPU就會到固定位置去拿指令,然後開始跑,通$ k( Q$ o2 n: d+ z8 \; U
常這個位置都是放BIOS,而這個位置通常是0』。% ^% `- B( z4 P9 C

- V  `4 R: v( q# b' I3 t那這個第一行指令究竟是長怎樣呢?這跟程式當掉有什麼關係?跟程式碼寫錯
0 w- I" z+ ^+ t5 L又有什麼關係?
& h3 K, R: C; D/ Y. _* N& f) Y
& S2 E6 j" E1 E; ]我們來看通常一般冷開機之後開始跑的程式碼都是怎樣的
* W0 b# }0 S: P3 H* d( 通常就是跳到bootload or BIOS )0 c% A- A$ J# u

; D) r7 |. G9 u( db start
  L% l3 k) h  V. W5 Q% }ldr pc, _undefined_instruction+ G& e( ~1 x- l8 v2 z; R5 V
ldr pc, _software_interrupt% F6 y' E; b( R3 E3 q1 o1 @
ldr pc, _prefetch_abort9 w% }  k: q# |& `- R" }" {/ K
ldr pc, _data_abort" F, K+ s) `0 t! ?" v$ ^
ldr pc, _not_used" E2 M! c, ]! I. j1 `! p
ldr pc, _irq
5 T3 j9 H' {. c$ I6 P8 P7 \ldr pc, _fiq
% u7 s/ z1 v. z$ D+ b& I" Y2 l
- z. e  g" Z* W) k( R: Z! u$ w* z  P
上面是組語,我們只看兩行,第一行是『b start』,『b』的意思就是branch的
  T- i( V4 D! [3 g' y意思,也就是jump到start這個地方開始執行。換句換說,CPU拿到手的第一個
7 N4 Z* E0 n0 I  U7 I, g指令就是要它去找別人,顯然是相當不負責任的行為。讓人不禁懷疑那第二行第$ k1 i) P$ g" ]% G$ p/ [; A0 w) G
三行到底是幹麼的。, E  K' T2 k# d+ [

. p: |- F. t7 E7 |. n我們接著看『ldr pc, _undefined_instruction』,『ldr』的意思是說,將' w' |) \$ p3 ]# q9 r9 c  L" A# i2 o
_undefined_instruction這個位址,放到pc這個暫存器當中。大家一定也聽過& Z! j; I! w, C1 C
program counter這個東西,一個正常的CPU就是靠program counter所指
6 \7 ]) h6 c6 \  h* e9 N的位置去抓指令進來執行。換句話說,第二行程式居然也是要CPU跳到別的地方
2 q1 @5 r1 }. }# y執行。而且前面七八行都是做這件事情。很怪吧?!!!7 o3 N' _$ D" {9 a5 @1 p. Q7 }

  K/ x% ?9 f8 m/ D: Y' B9 Y8 d, R到這裡我們解答了上面第一個疑問,第一行程式其實就是一個Jump的指令,跳到1 ?9 X* |$ i9 F3 [
真正的開機程序。
& B( \8 p' V* P6 }
) e/ d4 `( ~' N  B6 Q( B看了程式碼之後,我們不禁好奇這些看起來排列很有規則的程式碼到底是做啥用
1 h8 [2 o2 X) L3 m2 e4 _. H的?其實答案就是『exception vector』。
( W& G+ l' e7 m, j8 m1 d& M* c  H* N+ S7 n
什麼是exception vector呢?其實就是CPU出錯了(其實不完全是出錯),它就會
( y; ]0 W. N' E* [2 ^- O來這個vector找看相對應的處理函式,例如遇到看不懂得指令,他就固定會抓0x41 X4 R+ X1 I' Y
位址的指令,也就是『ldr pc, _undefined_instruction』,接著就會跳到處理undefined instruction的函式去處理。3 J; z- X4 n) ^; B6 n/ t
* }+ X2 Y9 |& I( F+ \- Z& {/ s* R5 K
到這邊我們回答了第二個問題,程式當掉的時候,就是會跑來這個地方,接著再
, b( C" _6 Y5 V8 Y) H; X( `Jump到處理的程式碼。同時我們也發現,一個CPU就是靠著這個vector在處理  l0 E8 A7 C0 ~9 ]3 ~
各種不同的exception。那....萬一這些vector被改掉了呢?
2 j8 H+ ^$ d3 h' ?: `" M例如:你程式碼拿到一個null pointer,然後又對這個null pointer開始做寫入動. d4 s. h3 k: E! Q5 L4 A
作。' B7 r/ l" d4 u
: k1 @0 \6 R, O; M
char *ptr = NULL;$ B" C; p& a2 P8 W
memcpy( ptr, 0x0, 10 );
6 |: D# D3 d6 S- x5 G3 j+ a+ h/ K- @8 H& f' y# D
那整個OS就完全不能動了。可是我們也知道我們現在這樣寫,頂多 segmentation) {% W2 {/ b" w& L
fault,並不會怎樣,OS還是照樣活著。why why why?1 `0 q+ n9 n3 a4 a; G& t( f
原因很簡單,就是這些區段被一些方法保護住了。一般常見的有兩種方法,一種是$ [4 |% @% q. x1 y
MMU,一種是cpu有兩個exception vector存上的位址。
( W  W0 C+ i/ U' s" |- k# @( ]0 x1 [
  o: E3 m5 u; ^5 h3 t9 mMMU可以設定某個區段的存取權力,只能readable的話,那就不會有被改掉的問- \5 g: e: T# p; m  f. B& I
題,另外一個方式是可以將exception vector的位址擺到不容易改到的地方,通常
* |& k, `# S% D5 |: G  C7 h) Z* |是往高位址的地方擺(high vector address),例如,0xffff0000接近4GB的位, d8 C) `4 p! i3 _4 Q3 A
置。(32bit 最多只能定址4GB)
* y7 |: d1 `9 @, f
; Z/ |' @; u* i0 G9 A- m" v第二種方式,通常是一開始開機vector還是從0x0那邊抓,可是經過設定CPU,可
, L  ~& R/ P0 y* \; p$ X* }以改變,在不斷電的狀態下,發生exception就會跳到高位位址去找exception
" P! w* r- P( |/ |/ Avector。
) ?( b& w$ y- @
6 }* Y% S, w. O$ j8 Ap.s. 關於定址模式可能有些人沒感覺,可能要懂整個CPU的memory map之後,: O/ U* _5 b" t% ~
會比較有感覺。6 W( [$ O9 s& R. O# ~
- L9 I2 u2 i6 e  v- q! ]
p.s. 眼尖的人一定覺得很怪,為什麼vector第一行用『b』,其它卻是用『ldr』,
- s9 W6 P# R# ~  D這個牽涉到本身指令的不同和程式碼是不是relocatable的程式有關,將來有機會9 q4 m2 |" N& B
再深入討論吧!!
: |  C9 P! ]! g2 a3 N! v
8 ]$ D) K% L& G6 d9 p, Y---& S9 r' Y, V& G9 I
想知道答案的朋友趕快call in進來
, Z, t7 V, v# t6 X6 o' ~2 ]前五名我們有優惠
: _2 E0 ~: D- M7 a, j) t2 K現在進一段廣告~

評分

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

查看全部評分

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

CPU exception vector 淺談之二

上面貼文本來的用意是要點出,為什麼一個CPU需要有擺放兩個exception vector的
4 U# }) D5 d: \0 K" j- e功能。如果有看懂的話,答案很簡單,就是怕被程式人員亂改改到了,這樣會讓整個OS1 ~: K) s2 b9 p& l$ E% ?
當掉,很容易一個null pointer亂填,整個系統就掛了。可是一開始不知道怎麼帶出這
( U% n9 {; p- q( x麼問題,所以文章就變長了。恰巧,也提到一些其他的東西,我們就稍微聊一下CPU+ Z( a8 ~3 z4 @1 P% U
的模式吧。
$ |' l1 f) k' G' V- R
, M6 c$ D, S9 f) @1 w) e6 Y8 C從 exception vector 看得出來,CPU本身除了拿到指令一直run以外,還會接受一些, C  d$ F5 A  V2 C
exception發生,發生之後呢,便會到這個vector來拿相對應處理的指令。
7 e0 a5 [8 e  h% v
, Q3 |, u% p1 v# I+ O" D8 A% I& j舉例來說,一個程式碼被compile成使用某個硬體的特殊指令,可是卻剛好被放到沒支
' {. C9 S! C; C9 w% D0 ~- {+ ~& g8 G援這個指令的 CPU 上執行,那CPU跑著跑著發現一個自己看不懂得指令,就會發出一
/ S& b: l# X0 W0 l; q2 w$ }個undefined instruction 的 exception,exception發出後,依照CPU的設計,以
. p" B& F& t1 \" R9 O- _ARM來說,就會抓位址在0x4地方的指令開始執行。
! x* i( E( y0 E7 b. E; b+ L' B
5 c' H# Z9 _4 m9 A: @而這時候,我們的處理函式就有機會可以透過這個exception hanlder去模擬這個指令
) E: D/ [( V/ u5 n& u,利用多個指令或運算計算出那個特殊硬體指令的值。這是其中一種undefined0 T* U& S! V2 z! h) A/ M) X; a+ X
instruction exception 的應用。+ O( a/ X" Y: Z; |

2 p* v- k- e, m3 K- T5 k1 R另外,我們要提的是,這許多的exception其實隱含著CPU的運行模式,例如我們以前
' o8 U+ }* Q6 h- ]2 p$ P" D常聽到x86 CPU切到什麼保護模式之類的,其實就是因為發生了一些exception,為了2 |/ ?6 Q0 }* x9 B5 g, ?! A3 Y
處理這些exception,所以切到相對應的模式去做處理。
1 r8 D' V8 m6 L7 G6 o% T1 ]
1 i$ h' a6 b+ {& R/ l: c: Z' V8 @切換模式聽起來很單純,其實對實作OS來說,牽涉到的事情還不少,例如切換模式之: O2 u. I3 v- Y5 u) l
後,為了要讓處理完exception之後,原本的程式能夠繼續執行,相對的exception. c, m, I6 _. u8 ]& O
handler必須將目前狀態存起來,所以就必須實現stack來存放目前的register status" q* i. V4 Z' |1 ~& H
(context),以便將來可以resume回來。
2 m9 ^4 K0 R9 U, z( @; ^
; s: H9 z$ y8 ?" a3 p看到這邊,應該有人會問想說,了解exception vector的意義何在?當你要了解如何
* h+ F, c6 L7 a+ K- [% u4 Z實做一個OS的時候,其實就是要去控制CPU,而CPU的運作,其實就是控制這些模
6 w1 S. _7 f, f( Q2 Z式。而exception vector就是這些模式的進入點。當你對一個OS可以有透徹的了解
! K  M/ u9 C0 K7 D的時候,對於系統表現出來的行為,會有更新的了解和解釋,對於debug application2 @6 t& B* E# V. m1 [0 T# s! s$ `
和 driver 其實是有幫助的。+ f1 L" G) b3 v: P3 U

# O/ i' ^, `  \7 C' c對於各個cpu mode的說明,例如一些有趣的問題:有哪些模式?每個模式有什麼不) }1 ^3 U; N8 t+ S1 v! G5 T
同?它是專門處理那些問題?有哪些種應用?這些因為要牽涉到很多assembly的程
/ f  S# o5 `; I5 Y4 Q式片段,所以就先不深入探討,有興趣的朋友可以call-in進來,前五個有優惠喔~~
3#
 樓主| 發表於 2008-7-25 10:10:00 | 只看該作者
以上兩篇是以前貼到朋友網站的文章~/ z& W# I1 ]4 g" L. u/ X
所以口氣比較~~恩~~怪怪的
. v; y$ Q2 W6 _% F" w) M. y請大家多多包涵~
4#
發表於 2008-7-31 20:42:13 | 只看該作者
哇.大大很厲害.                       
" ~- u7 V- j& m: [& Y* n; X8 ~看完你的文章讓我受益匪淺.
5#
 樓主| 發表於 2008-8-1 10:52:38 | 只看該作者
....4 _3 Q) D9 I" t9 M" ]
....& P. G- F3 |1 k8 _, S- Q, |% R  H- w
....
" }' N# L  z5 Y, D....  Z: w. x, I6 ~$ _' _: V8 W+ l
....8 i/ A# i$ F3 h2 P! `2 p
....: _0 I; R* A0 f5 x3 Y% Z
....4 X- \/ q3 H$ c) g( `" Z
....
' \: ?" [3 I1 k5 u2 r; J' v....
7 Y9 D- a; o  c5 ~/ N....
" R7 C. d( Y# X: I/ E....* k' y/ Z7 ^5 f7 J$ V! h
....' {3 h# l3 j. N1 h8 E
....
4 M; V: H& x( N$ A' J....
- T0 D3 p5 q3 q* e....$ o( B0 p6 Z! U: k9 p
....: k) x) i0 S, @: |$ D
文繞圖模式$ c8 u; R& r4 t/ ~6 S) n+ x. N, f- a
加點字讓它避開一下2 T" t; Q. c" e" L+ k6 E3 ^( p' E
原帖由 rogeryang 於 2008-7-31 08:42 PM 發表
/ k2 c" ^( i9 G2 ^哇.大大很厲害.                       # U! n% O! l! f
看完你的文章讓我受益匪淺.

- w' v/ O  h8 f/ \7 G5 [
& E6 K% w( @- N( H, s呵~ 感謝捧場ㄟ
9 y4 k+ h0 z+ s- k% _6 S4 A之前都沒人回文
7 Z/ Q! c' w/ V& c9 D不知道文章是不是沒寫好
1 d( i7 z& |& l0 Wanyway, 有交流是好
8 [4 b  o2 s" }) e6 F有時候會一個東西不是因為很厲害9 w9 t( P* \' [5 _  f4 L
只是碰巧碰過所以就會了
6 u; G1 T2 q0 y1 N% B) L9 T3 i  Q+ P( Y+ t* ^5 m
會貼文的目的 (以前大多是潛水居多)
3 s. G1 p) |' T- v就是還沒遇上的人可以多了解
/ A% f* T2 j3 w: \8 R會多一點的人可以進來指導一下 & m( Y# w& ?6 n1 n% f

# V( T' q- L2 L8 J1 B4 g[ 本帖最後由 gogojesse 於 2008-8-1 10:58 AM 編輯 ]
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-21 05:56 PM , Processed in 0.168010 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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