Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

CPU exception vector 淺談之一

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-24 20:11:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
因為再深入我也不懂,所以就淺談吧~. Y9 c( Z* I4 J2 o, v: g
有錯請指正~
6 }9 X3 F4 @9 i( t0 Q( j3 Z$ g/ C
- `1 A. n! G1 _: {* J" F話說,身為一個程式設計人員,常常遇到一些程式跑著跑著就當掉的狀況也很合理的。# \$ M  e) f3 `+ O7 ]
例如:『segmentation fault』。簡單講就是程式寫錯,然後它就當了。
6 z, F: z$ _/ j9 @: y% o7 D. v$ E1 m0 A$ Y) c/ V
大家也應該都聽過,『開機之後CPU就會到固定位置去拿指令,然後開始跑,通' l7 H) f9 d  ]/ q4 i
常這個位置都是放BIOS,而這個位置通常是0』。
7 ]( z/ u6 v/ A8 Q( @8 y5 t
0 q/ U/ e& h0 A1 f7 M9 f3 V那這個第一行指令究竟是長怎樣呢?這跟程式當掉有什麼關係?跟程式碼寫錯
  y  Y6 A. u$ Z' E" d# }4 [又有什麼關係?
2 |6 K" e; Y9 Y" n/ g
2 r8 B7 Q3 v1 H我們來看通常一般冷開機之後開始跑的程式碼都是怎樣的1 ?) d; O; i0 R+ G
( 通常就是跳到bootload or BIOS )
( Z4 J+ z; L& s: Q( }7 u* t
* ?( i, _& {/ X3 X, gb start
8 K' ]% b6 y2 X/ b. cldr pc, _undefined_instruction2 e) u0 x+ l" `- i9 F% M
ldr pc, _software_interrupt
; V0 S: K' s* o* K& rldr pc, _prefetch_abort
6 N) l+ p3 U1 o% O3 Oldr pc, _data_abort
+ @  d* e* a' p1 m- j3 @ldr pc, _not_used9 p' T( ?+ ~5 ?* i( Q* Q
ldr pc, _irq# u  |" ^$ ~& C9 r
ldr pc, _fiq
# D& n4 S, h/ ^- P6 G% Q6 W; o. g5 ^2 _* t

& |" A7 P* q- A, ^上面是組語,我們只看兩行,第一行是『b start』,『b』的意思就是branch的& H: V% {5 j4 x2 g' h5 p
意思,也就是jump到start這個地方開始執行。換句換說,CPU拿到手的第一個
& w, n( N: e+ G) h指令就是要它去找別人,顯然是相當不負責任的行為。讓人不禁懷疑那第二行第0 \, S6 Y. m) z: J. }. I
三行到底是幹麼的。1 U4 h, D* G7 w; z  h. Z( {0 L

2 K/ Y: {3 V; J( D9 u我們接著看『ldr pc, _undefined_instruction』,『ldr』的意思是說,將- O0 J! F3 z7 \$ x9 }
_undefined_instruction這個位址,放到pc這個暫存器當中。大家一定也聽過
  q1 `% g6 K3 Sprogram counter這個東西,一個正常的CPU就是靠program counter所指8 |; T% {. L8 j6 T! x0 \
的位置去抓指令進來執行。換句話說,第二行程式居然也是要CPU跳到別的地方
! g. i+ a' s- N執行。而且前面七八行都是做這件事情。很怪吧?!!!, L2 j% H; x/ Y2 S# K6 X0 p
' h5 }" g* ?$ q" j( I6 i0 `
到這裡我們解答了上面第一個疑問,第一行程式其實就是一個Jump的指令,跳到. t3 P& `8 C7 K1 N% o. W
真正的開機程序。
% `- w7 K4 c- p! \0 {5 q7 B+ p1 Y+ C6 {  D
看了程式碼之後,我們不禁好奇這些看起來排列很有規則的程式碼到底是做啥用2 u" V/ f, t7 z+ l1 u6 P
的?其實答案就是『exception vector』。
7 l& u% ^2 @4 C: @' M' y* _, R% p2 {
什麼是exception vector呢?其實就是CPU出錯了(其實不完全是出錯),它就會1 D0 Z) v0 C/ u( L% O, d
來這個vector找看相對應的處理函式,例如遇到看不懂得指令,他就固定會抓0x4
! y# @0 U  K- Q, N2 S0 @位址的指令,也就是『ldr pc, _undefined_instruction』,接著就會跳到處理undefined instruction的函式去處理。7 j! A! @8 w8 E7 j
; p: c) P# {) e$ _
到這邊我們回答了第二個問題,程式當掉的時候,就是會跑來這個地方,接著再% P8 _3 [6 o) P6 Q& b1 K
Jump到處理的程式碼。同時我們也發現,一個CPU就是靠著這個vector在處理) T( c2 b, z) a& B6 c! Y9 [
各種不同的exception。那....萬一這些vector被改掉了呢?4 h2 }5 F" n0 }. {6 G, p, J
例如:你程式碼拿到一個null pointer,然後又對這個null pointer開始做寫入動
4 U  e  t2 ?7 u4 F& h' p& V作。
. L& R$ C* o. C* w6 Z; z# b5 X0 ~
char *ptr = NULL;" e8 ~2 P, Q# i  A1 O
memcpy( ptr, 0x0, 10 );4 e6 N# Z/ Q3 x8 }! ]6 a

7 s. A5 f" h1 \7 E那整個OS就完全不能動了。可是我們也知道我們現在這樣寫,頂多 segmentation
, V8 r. N) n! d6 p0 w% ffault,並不會怎樣,OS還是照樣活著。why why why?
9 f& ~4 n7 T4 W+ e! b原因很簡單,就是這些區段被一些方法保護住了。一般常見的有兩種方法,一種是5 S3 J' j7 w8 ^3 J2 l! `
MMU,一種是cpu有兩個exception vector存上的位址。
7 w" B. j) @7 A4 b
. K7 T4 C2 I# E  KMMU可以設定某個區段的存取權力,只能readable的話,那就不會有被改掉的問
0 e0 N* H1 c+ j- \1 F3 v! I+ x題,另外一個方式是可以將exception vector的位址擺到不容易改到的地方,通常
, Q0 E0 K, \' R" t) O, N! x& p是往高位址的地方擺(high vector address),例如,0xffff0000接近4GB的位
1 M1 D) q# P; ^( ?+ f/ s4 N, d置。(32bit 最多只能定址4GB)/ ~- D' u& L8 c* K7 t
& n- }. |, X" j7 r4 W
第二種方式,通常是一開始開機vector還是從0x0那邊抓,可是經過設定CPU,可
  C! u! a3 D7 m) Q2 S以改變,在不斷電的狀態下,發生exception就會跳到高位位址去找exception% ~& u! U8 J9 d; h4 X
vector。
. q' t. B/ H: ^0 }3 \  M  l8 `) b) S/ a0 ]* a: i
p.s. 關於定址模式可能有些人沒感覺,可能要懂整個CPU的memory map之後,
* G' q  ~* Y: V會比較有感覺。' r! y# Z+ ]5 {! {; E( W8 |' R; S7 Q
; V. i& ^+ U7 j! B  {
p.s. 眼尖的人一定覺得很怪,為什麼vector第一行用『b』,其它卻是用『ldr』,
' u1 U2 R( q- k0 }1 ^這個牽涉到本身指令的不同和程式碼是不是relocatable的程式有關,將來有機會
( }9 Y( B/ o) m* @7 K: v8 R7 e再深入討論吧!!3 R7 o; w- g  n5 J& _0 O& D" n

) _! Y% n' I: @2 R( s: R2 t  ?---  G- V) k! i/ F
想知道答案的朋友趕快call in進來/ q! n; P7 o1 b/ i; u. K# D! D0 B
前五名我們有優惠
- w" K1 {3 f7 c6 ~6 B+ h$ u現在進一段廣告~

評分

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

查看全部評分

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

CPU exception vector 淺談之二

上面貼文本來的用意是要點出,為什麼一個CPU需要有擺放兩個exception vector的
6 v) l6 J6 F, P$ }功能。如果有看懂的話,答案很簡單,就是怕被程式人員亂改改到了,這樣會讓整個OS
, U5 C7 v4 Z& a+ z: y' H- x當掉,很容易一個null pointer亂填,整個系統就掛了。可是一開始不知道怎麼帶出這
! D- J% k% I4 Q1 `1 d1 |" f+ ^. H麼問題,所以文章就變長了。恰巧,也提到一些其他的東西,我們就稍微聊一下CPU$ S8 g+ ^2 Z" F
的模式吧。
+ H& O7 k4 ?7 p, d, Q- b
; m( O8 \9 l9 w; t從 exception vector 看得出來,CPU本身除了拿到指令一直run以外,還會接受一些
, i- {3 S2 h( Q$ ^- D, `exception發生,發生之後呢,便會到這個vector來拿相對應處理的指令。
, }8 V. q7 G& A( m6 W9 a
; N/ c" Y9 ^, P& e# M/ d舉例來說,一個程式碼被compile成使用某個硬體的特殊指令,可是卻剛好被放到沒支
  l" n4 e0 I0 B1 r援這個指令的 CPU 上執行,那CPU跑著跑著發現一個自己看不懂得指令,就會發出一
& ?( A+ K4 W- b( p2 R" R個undefined instruction 的 exception,exception發出後,依照CPU的設計,以7 q9 b3 }, r. Z
ARM來說,就會抓位址在0x4地方的指令開始執行。
1 E. O# s: `% f" X: w
% a. P/ I# [- |" ^8 k而這時候,我們的處理函式就有機會可以透過這個exception hanlder去模擬這個指令
6 x7 l9 Z8 C- i2 D,利用多個指令或運算計算出那個特殊硬體指令的值。這是其中一種undefined
6 t  M+ C% ^, F4 e: Vinstruction exception 的應用。" e; N, C: ]1 `8 \5 n! U

2 G2 x/ C3 K# Y另外,我們要提的是,這許多的exception其實隱含著CPU的運行模式,例如我們以前) E& t9 r3 Y* R: `1 r& @' O7 ?' l
常聽到x86 CPU切到什麼保護模式之類的,其實就是因為發生了一些exception,為了
; n/ Y* V: U' |, y  J& J處理這些exception,所以切到相對應的模式去做處理。
9 Y+ L* e! f7 g& R) H1 W4 Q; L8 C5 p: U  V+ O
切換模式聽起來很單純,其實對實作OS來說,牽涉到的事情還不少,例如切換模式之
- o4 H  N  a2 H6 k% Y/ m後,為了要讓處理完exception之後,原本的程式能夠繼續執行,相對的exception
& k0 ~+ }  P8 ehandler必須將目前狀態存起來,所以就必須實現stack來存放目前的register status% Q$ r1 h3 X! ?; D7 s, _( W% B
(context),以便將來可以resume回來。! H* {8 h8 y4 d, b, ?  H7 i" |

+ }6 U9 ]% [' W( W- l7 q看到這邊,應該有人會問想說,了解exception vector的意義何在?當你要了解如何3 s- r4 x! f! T8 L" b' q
實做一個OS的時候,其實就是要去控制CPU,而CPU的運作,其實就是控制這些模% s$ @; p9 m- p
式。而exception vector就是這些模式的進入點。當你對一個OS可以有透徹的了解
& E& k% H3 |7 z. \2 ]的時候,對於系統表現出來的行為,會有更新的了解和解釋,對於debug application
" g/ k1 n, k: i和 driver 其實是有幫助的。
( h& x/ r! B- f/ @1 P3 l0 q/ g0 a7 f
對於各個cpu mode的說明,例如一些有趣的問題:有哪些模式?每個模式有什麼不  ^7 a$ N$ k; n% t4 ]: W
同?它是專門處理那些問題?有哪些種應用?這些因為要牽涉到很多assembly的程
0 d% d) E/ \) m$ g% I0 Z2 @式片段,所以就先不深入探討,有興趣的朋友可以call-in進來,前五個有優惠喔~~
3#
 樓主| 發表於 2008-7-25 10:10:00 | 只看該作者
以上兩篇是以前貼到朋友網站的文章~0 N8 q( y' S0 u% x1 K6 I# `5 }
所以口氣比較~~恩~~怪怪的$ i7 [" \) O5 S
請大家多多包涵~
4#
發表於 2008-7-31 20:42:13 | 只看該作者
哇.大大很厲害.                       
. m+ c% c& \9 f' _看完你的文章讓我受益匪淺.
5#
 樓主| 發表於 2008-8-1 10:52:38 | 只看該作者
....7 |5 Q6 [: I7 [' ~  j
....
* J- Q  O/ ]: ]5 W3 t& v  D& l....
) h( l% _) p! T; K7 V7 k7 O3 g9 X...., ]  m0 J+ |; C  q; u" v2 r
....* l9 r. k5 \7 }/ J  x/ X' `2 M, b& Y5 _1 L
....
; r& t! H+ x  r: ~/ Y....
6 F7 Z0 z. K/ S8 q+ D# d3 Q....: }& {/ z( d' C2 u1 M4 M  v. u+ S# Y
....
* I( z0 F( y+ w1 B...." Z+ t# H) [- w6 G' @
....
+ q6 I7 I. @. z# k( V1 i....
% k5 v- ?6 V6 v- W  T4 Y....
7 O" ^0 Y* e0 \9 |6 O....  H! z8 e' C& U- ?
....7 f7 g: C2 H  b3 V) N# r
....
* y% \5 w- j4 F' ]+ S/ z/ P文繞圖模式1 ?9 O! s4 C1 m! [  m% w. J
加點字讓它避開一下
. v6 ^. R# h% F) ~, ^, X( t& [
原帖由 rogeryang 於 2008-7-31 08:42 PM 發表 / K3 I5 F0 \1 i/ X/ c! Y  E
哇.大大很厲害.                       
" I1 Y: l. z" K$ g5 W: \看完你的文章讓我受益匪淺.
$ P7 v% ?& z! Q3 e1 F: y* s1 [

! P( ?$ Y; @, L- \" D0 f, D" H呵~ 感謝捧場ㄟ/ Z9 \# {( p; K$ i
之前都沒人回文- r+ Y) E. U2 P- [8 U# G) X4 r. x
不知道文章是不是沒寫好
$ G# d8 j+ |0 K! [7 E2 H) U& Hanyway, 有交流是好
# e( `$ ~* C: ^* o# U  {  o有時候會一個東西不是因為很厲害
- B  ~; c/ m+ J# p6 \: y只是碰巧碰過所以就會了7 V( v0 O# B4 w
* E$ m; M8 p+ w0 d$ X
會貼文的目的 (以前大多是潛水居多)( I& Y  x7 }& \( o( {- h
就是還沒遇上的人可以多了解  J7 j( X6 I: u: k2 C% v
會多一點的人可以進來指導一下
) `% l; a2 q6 f
9 I0 f9 R5 S7 g! B; r, C! G[ 本帖最後由 gogojesse 於 2008-8-1 10:58 AM 編輯 ]
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-21 05:51 PM , Processed in 0.172010 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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