Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

CPU exception vector 淺談之一

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-24 20:11:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
因為再深入我也不懂,所以就淺談吧~/ Z9 R- K' t$ b, Y( ~  n2 z
有錯請指正~0 N4 q2 E3 j6 O

2 d- X3 k, p# s. Y( Q話說,身為一個程式設計人員,常常遇到一些程式跑著跑著就當掉的狀況也很合理的。. _$ p$ Y8 R; ?$ J3 U. `
例如:『segmentation fault』。簡單講就是程式寫錯,然後它就當了。
( M; l3 `. Y6 \, r2 t; y) G' [
7 B# ^- Y; N. A' v  d/ w大家也應該都聽過,『開機之後CPU就會到固定位置去拿指令,然後開始跑,通( s: w& ]0 y4 [) c& U/ {
常這個位置都是放BIOS,而這個位置通常是0』。4 M3 A. w% P5 b2 n
) |4 A- v5 h( m" q: c
那這個第一行指令究竟是長怎樣呢?這跟程式當掉有什麼關係?跟程式碼寫錯3 j9 N8 B, k! X: j# P
又有什麼關係?
9 D& Q4 C' B* R  d5 c' ~
& ~6 v: ?( R9 U4 X我們來看通常一般冷開機之後開始跑的程式碼都是怎樣的
0 l$ W; V- A+ W" C; S7 F0 k- O5 b. F( 通常就是跳到bootload or BIOS )( f9 T/ X" i4 c, \# y, i, V% h

. y$ E0 g0 ^) C3 T* mb start
# E7 G' {7 w4 k: b# V+ }$ g9 Jldr pc, _undefined_instruction
9 q, G6 J7 G: i+ t, |: ~ldr pc, _software_interrupt% r% {$ N9 H, I5 n/ j
ldr pc, _prefetch_abort
, w  k1 q. R- i% A5 c" G. Lldr pc, _data_abort
1 Q( w7 ~+ M5 R( Q) M# \, }ldr pc, _not_used  `/ N  w) g( W, z/ _+ x$ c
ldr pc, _irq
  M( M* s! O; t* T) Wldr pc, _fiq( @; M3 x* Q9 Z! C$ D% b2 B+ X; ~
: f7 D3 p1 j5 E- A
! ~1 C. C: R3 a2 w! y+ n3 Z) e0 h  k% R" D
上面是組語,我們只看兩行,第一行是『b start』,『b』的意思就是branch的# L8 ]8 I1 a9 c/ e! x# O
意思,也就是jump到start這個地方開始執行。換句換說,CPU拿到手的第一個# e# M: R1 Z. {  f" z9 {
指令就是要它去找別人,顯然是相當不負責任的行為。讓人不禁懷疑那第二行第
, l& Z) {5 R& s& g三行到底是幹麼的。2 Q% S  A, f9 g9 e4 f0 _/ c
  |" {5 F( _; M/ |. T
我們接著看『ldr pc, _undefined_instruction』,『ldr』的意思是說,將
# S4 u" G' r9 U6 J, y( O: v_undefined_instruction這個位址,放到pc這個暫存器當中。大家一定也聽過5 l+ M2 l% Z# X* X. K/ b, a7 m
program counter這個東西,一個正常的CPU就是靠program counter所指1 Y+ G9 s- `  C& X! b% m- d: T: n
的位置去抓指令進來執行。換句話說,第二行程式居然也是要CPU跳到別的地方
' {8 N* d8 j4 r& P2 Q4 X執行。而且前面七八行都是做這件事情。很怪吧?!!!
; X, S5 N# j- g
# J/ B8 F, s7 X0 y/ ^5 I& o到這裡我們解答了上面第一個疑問,第一行程式其實就是一個Jump的指令,跳到2 w0 O8 }  ]8 W" W7 [
真正的開機程序。
4 k& O/ B. J1 K. d+ x7 u1 e7 }6 C% k% v4 _
看了程式碼之後,我們不禁好奇這些看起來排列很有規則的程式碼到底是做啥用
! P1 R$ t3 ?" I' ]+ ]6 o的?其實答案就是『exception vector』。
( J, E- W. c* Z3 Q+ u6 Q3 q) i" t/ V! ], I5 x
什麼是exception vector呢?其實就是CPU出錯了(其實不完全是出錯),它就會
/ Z2 e5 v" W/ _! G5 `來這個vector找看相對應的處理函式,例如遇到看不懂得指令,他就固定會抓0x47 I& }/ }3 e! r6 f/ L" Z
位址的指令,也就是『ldr pc, _undefined_instruction』,接著就會跳到處理undefined instruction的函式去處理。
' U0 r+ i) U0 K7 m- c. T
- r  {# `% @/ W- C0 `+ Y到這邊我們回答了第二個問題,程式當掉的時候,就是會跑來這個地方,接著再. q7 ]% K% \* k$ c) k! {/ v
Jump到處理的程式碼。同時我們也發現,一個CPU就是靠著這個vector在處理
7 H0 _; _. j# d! \( O各種不同的exception。那....萬一這些vector被改掉了呢?; Q  N) q. [' [7 N- h
例如:你程式碼拿到一個null pointer,然後又對這個null pointer開始做寫入動
  C( X' C) ], s8 K作。
7 j$ l/ |% R  e5 c9 s, d' U# i1 F. U5 E; q5 Y
char *ptr = NULL;6 J3 @1 H: u4 J. `6 C) T
memcpy( ptr, 0x0, 10 );
' Q5 G/ z& z3 f
% Z0 }/ ]; i6 l% k( `  O9 E那整個OS就完全不能動了。可是我們也知道我們現在這樣寫,頂多 segmentation
1 \( B1 j+ I/ Q$ e- Z, u5 Lfault,並不會怎樣,OS還是照樣活著。why why why?
+ k5 q! S! z+ d: d% f原因很簡單,就是這些區段被一些方法保護住了。一般常見的有兩種方法,一種是
4 L# q! p& y2 j4 ?6 p: cMMU,一種是cpu有兩個exception vector存上的位址。
3 b, Y) G* t# e9 a/ f6 U" q
0 P3 Y- D: Z: x: \) L5 IMMU可以設定某個區段的存取權力,只能readable的話,那就不會有被改掉的問
- R/ n. A( ]$ C! @' Q. ]4 S$ R5 R題,另外一個方式是可以將exception vector的位址擺到不容易改到的地方,通常" O5 }% Y( `4 x+ h5 G) U
是往高位址的地方擺(high vector address),例如,0xffff0000接近4GB的位
0 [6 r; E& J8 j& n4 W1 r0 }置。(32bit 最多只能定址4GB)
  N  J& ^. S2 h- K9 d+ N" F
. p# W5 W: j  ^' y' M第二種方式,通常是一開始開機vector還是從0x0那邊抓,可是經過設定CPU,可8 H* c4 M* W- g
以改變,在不斷電的狀態下,發生exception就會跳到高位位址去找exception
" @- G' x2 @+ I) G- ]vector。
' M  K; D, |% ^3 ^7 ?  T# z  C# M) p) V' r5 s
p.s. 關於定址模式可能有些人沒感覺,可能要懂整個CPU的memory map之後,8 n+ {6 z7 v4 `7 m7 j
會比較有感覺。. O7 u1 Q  m  ^. [* P8 y
( J* d; ~. B) k$ y) i7 G. `1 @- N
p.s. 眼尖的人一定覺得很怪,為什麼vector第一行用『b』,其它卻是用『ldr』,
5 I8 h+ s( B5 z$ W. V6 }4 U" B這個牽涉到本身指令的不同和程式碼是不是relocatable的程式有關,將來有機會9 Q5 ~' j, b& Q6 o' g7 l) J+ L
再深入討論吧!!& U6 [" X$ ?8 N7 q9 p/ g

4 O4 q' a, k% s- {---3 r( S, B' ~! P6 F$ f# O' O
想知道答案的朋友趕快call in進來
  z- s8 s' I' a# _3 P+ z9 u前五名我們有優惠
$ p" Y3 O* q, r/ S1 G# o' O現在進一段廣告~

評分

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

查看全部評分

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

CPU exception vector 淺談之二

上面貼文本來的用意是要點出,為什麼一個CPU需要有擺放兩個exception vector的
4 z0 A8 m# w9 f6 ^功能。如果有看懂的話,答案很簡單,就是怕被程式人員亂改改到了,這樣會讓整個OS
0 ^# l) e$ A5 [0 O3 x當掉,很容易一個null pointer亂填,整個系統就掛了。可是一開始不知道怎麼帶出這! T$ Q; V! ?% u- H' m
麼問題,所以文章就變長了。恰巧,也提到一些其他的東西,我們就稍微聊一下CPU
  B4 D0 t' y% ^* L  V的模式吧。7 Y( [2 |. [) T# J- h  h' Z4 x2 x1 @
) u# A9 M& c; C$ p# I
從 exception vector 看得出來,CPU本身除了拿到指令一直run以外,還會接受一些
/ T' f6 O: d- _/ i1 D! qexception發生,發生之後呢,便會到這個vector來拿相對應處理的指令。
5 ?+ D. L, L2 }% a0 ]3 W0 ~7 ^( w' K. T1 C9 Z& }  Q% O
舉例來說,一個程式碼被compile成使用某個硬體的特殊指令,可是卻剛好被放到沒支
2 s/ l' l4 H: D/ [0 h援這個指令的 CPU 上執行,那CPU跑著跑著發現一個自己看不懂得指令,就會發出一
2 T, G! O' z9 u個undefined instruction 的 exception,exception發出後,依照CPU的設計,以
2 S/ @1 z: ~5 Q" X7 j5 TARM來說,就會抓位址在0x4地方的指令開始執行。! k  K- _& I# @, `+ k2 }: P* x
: b$ W2 _! g& Q
而這時候,我們的處理函式就有機會可以透過這個exception hanlder去模擬這個指令! Z7 B7 @  D7 [" k3 R7 O9 z( ~
,利用多個指令或運算計算出那個特殊硬體指令的值。這是其中一種undefined
% p) ~9 Q9 P9 y2 Binstruction exception 的應用。
2 I& I5 `  ]! B" O3 V& n3 y7 m' r
% W/ _4 P7 N6 X. d另外,我們要提的是,這許多的exception其實隱含著CPU的運行模式,例如我們以前# Q. C; O$ b0 s: v0 R3 v1 t
常聽到x86 CPU切到什麼保護模式之類的,其實就是因為發生了一些exception,為了' `+ G( I! k. l+ M; l7 Y0 k
處理這些exception,所以切到相對應的模式去做處理。
9 |: H2 S2 |1 C4 P8 @0 R( m! \2 D5 T: Q: d* K5 U; d0 c( F: k+ [
切換模式聽起來很單純,其實對實作OS來說,牽涉到的事情還不少,例如切換模式之
1 J, N4 d6 k  |- Y0 D後,為了要讓處理完exception之後,原本的程式能夠繼續執行,相對的exception
9 a% J3 O2 I+ K' X2 ^, i& Rhandler必須將目前狀態存起來,所以就必須實現stack來存放目前的register status
" A( q7 t( I& Y/ |; Q6 D(context),以便將來可以resume回來。
: O6 S9 `/ B% u8 c5 @/ \. M6 u% G7 G1 Z  @; m0 D
看到這邊,應該有人會問想說,了解exception vector的意義何在?當你要了解如何
7 Z; x7 q( n; w) R% v7 n: r$ U# [實做一個OS的時候,其實就是要去控制CPU,而CPU的運作,其實就是控制這些模
) ?# \+ d- r% h- r式。而exception vector就是這些模式的進入點。當你對一個OS可以有透徹的了解
1 F# a8 ?4 z7 G/ y的時候,對於系統表現出來的行為,會有更新的了解和解釋,對於debug application
; c) k) h* H2 [& E和 driver 其實是有幫助的。
+ T4 ^3 n. [: V
! R! U: t) A# q4 B: G# C! r. _8 Q對於各個cpu mode的說明,例如一些有趣的問題:有哪些模式?每個模式有什麼不
6 K9 x) |5 y% i5 D/ [8 F3 y同?它是專門處理那些問題?有哪些種應用?這些因為要牽涉到很多assembly的程3 k3 x9 T- E1 n% B7 w. w8 }/ ^
式片段,所以就先不深入探討,有興趣的朋友可以call-in進來,前五個有優惠喔~~
3#
 樓主| 發表於 2008-7-25 10:10:00 | 只看該作者
以上兩篇是以前貼到朋友網站的文章~
6 j, g* M" ~" z9 Q0 k, r4 {9 F所以口氣比較~~恩~~怪怪的
+ n6 K7 @" i  |) g" O請大家多多包涵~
4#
發表於 2008-7-31 20:42:13 | 只看該作者
哇.大大很厲害.                       % J% P& |- f1 F# L
看完你的文章讓我受益匪淺.
5#
 樓主| 發表於 2008-8-1 10:52:38 | 只看該作者
....
6 U% o1 j- C( ]; P. N0 e0 ~....$ d- _5 G8 J4 H8 u' G' d' W
....8 [! L3 F: Y) w& H3 h9 g* J' K
....
. _( C0 q1 h. g; I7 T. Y- a& K7 u....' s* L6 Q  k/ O& V0 O4 [9 N
....
1 \8 ?1 x4 m# p....' \3 ~7 s0 L4 k% n2 Z3 n7 q9 `
....5 W. q0 _9 Y/ X/ P- ~
....& A/ |" {; l4 t, w5 ~
....
) Z1 P2 C5 V9 q* x....
6 _3 {* B* o6 T# n! R% E" o....7 }- @: J0 _3 ^  M$ T9 l% P4 ?
....7 S. ?7 R/ L6 |( t, R0 I. H. _
....
" @3 K. j+ z- n+ h1 T$ b....9 w/ w% z& q; N9 ~
....; X# J3 X" \4 v) Y: s% B
文繞圖模式2 @4 D- w. L! x& y3 n, S
加點字讓它避開一下: B- F$ @2 |- Y' k# `" S2 N
原帖由 rogeryang 於 2008-7-31 08:42 PM 發表 * V) d9 R- w: V6 v3 U. i
哇.大大很厲害.                       
- G. E6 v" Q1 ?$ c# @9 n看完你的文章讓我受益匪淺.
% W3 J+ |* c! \4 [0 ~6 K

$ n( _& x6 q! u5 W呵~ 感謝捧場ㄟ
  w* j% }6 E* C. a之前都沒人回文1 C5 u, f; J7 A3 }# w8 \- [' \; s
不知道文章是不是沒寫好' P+ O* C0 L2 ]. F  r
anyway, 有交流是好% M* F6 s: P/ n# t8 G6 F* d
有時候會一個東西不是因為很厲害! v6 S* \/ Q# ^
只是碰巧碰過所以就會了- m# d8 h( U7 f  a

" p$ X6 l% n# \' w2 V會貼文的目的 (以前大多是潛水居多)& X$ B* E& `2 d
就是還沒遇上的人可以多了解
5 {9 m7 s9 U" M會多一點的人可以進來指導一下 6 ]  M5 R8 R2 i+ L  X/ v4 k

; @8 M9 O6 Q8 O: m[ 本帖最後由 gogojesse 於 2008-8-1 10:58 AM 編輯 ]
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-2-19 06:44 AM , Processed in 0.164009 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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