Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

CPU exception vector 淺談之一

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-24 20:11:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
因為再深入我也不懂,所以就淺談吧~
1 i# v- _9 g' j+ A) ?5 X( U+ H3 [有錯請指正~
" k; y8 h& N3 t7 ?! N% k" T5 t) X7 H+ K# D. m
話說,身為一個程式設計人員,常常遇到一些程式跑著跑著就當掉的狀況也很合理的。3 D. l( X$ W; @- f& k
例如:『segmentation fault』。簡單講就是程式寫錯,然後它就當了。5 D1 ?3 g' `7 k' w/ D; [
0 ]; k' ~2 Z2 t0 ]) u* F7 }7 s
大家也應該都聽過,『開機之後CPU就會到固定位置去拿指令,然後開始跑,通: O' j7 a$ e( A8 `% O9 N7 H
常這個位置都是放BIOS,而這個位置通常是0』。4 P9 V7 R2 }: N( e
7 Z0 U  ^. j, d7 N
那這個第一行指令究竟是長怎樣呢?這跟程式當掉有什麼關係?跟程式碼寫錯
  H% h$ G( Z! e; d又有什麼關係?
" p1 I) d: g; d4 H: s+ w1 Y+ l% |7 x- `+ Y( r0 s
我們來看通常一般冷開機之後開始跑的程式碼都是怎樣的
' o, m$ v, D# Z- B  K. Q( 通常就是跳到bootload or BIOS )
6 i8 e" ^$ {4 l+ W6 U0 l3 ~
! ~# I+ c5 h, R5 l% F- V( L' Sb start' Y# a6 E8 n9 F5 P4 t
ldr pc, _undefined_instruction, k' k; I  O6 S5 p
ldr pc, _software_interrupt7 U% l& T" Y3 C; M: [$ w" z' o
ldr pc, _prefetch_abort+ _$ y$ H2 S- A. {! R
ldr pc, _data_abort# p% j. D2 o! @! A
ldr pc, _not_used
: b; |9 `+ [) m( y) Bldr pc, _irq" U2 G  |; L0 t) U
ldr pc, _fiq; A7 M4 F4 h+ `  F5 Y% ^

/ Z& x: J" ]4 S0 a3 x2 z5 v8 B) L9 J4 W( U+ Z7 [% b5 ~
上面是組語,我們只看兩行,第一行是『b start』,『b』的意思就是branch的4 m* V3 q, \8 @* W3 ]! u! s
意思,也就是jump到start這個地方開始執行。換句換說,CPU拿到手的第一個
, M, T# b0 |' r, ?( j7 [# X) [; V- j指令就是要它去找別人,顯然是相當不負責任的行為。讓人不禁懷疑那第二行第
# [# ~& x- H" e' `. Z" E$ @三行到底是幹麼的。3 [9 ~& N7 L8 ]9 O4 L2 P* O

, Q! d  F! ]- v1 ]: [5 B( Z我們接著看『ldr pc, _undefined_instruction』,『ldr』的意思是說,將6 o: J8 t# R- ]% J# f; f
_undefined_instruction這個位址,放到pc這個暫存器當中。大家一定也聽過! g( _) w3 d; }+ U* i5 G: B5 ^" d
program counter這個東西,一個正常的CPU就是靠program counter所指6 X( z9 h5 t. x( r# M
的位置去抓指令進來執行。換句話說,第二行程式居然也是要CPU跳到別的地方
- x8 k# ^8 h+ @# `9 l& m執行。而且前面七八行都是做這件事情。很怪吧?!!!- C: x4 c/ W" k# ^) ?% o3 o
# B* @+ Q" J# S# a
到這裡我們解答了上面第一個疑問,第一行程式其實就是一個Jump的指令,跳到
# @4 G3 C8 e: x1 w9 V+ g* D8 Y真正的開機程序。
, n* M$ J6 ^# E. C! A* R7 U6 s5 C: }9 L! r; m8 e
看了程式碼之後,我們不禁好奇這些看起來排列很有規則的程式碼到底是做啥用
' l; B, t/ {- ]& c+ I/ R3 e的?其實答案就是『exception vector』。8 s% Q; `* ?, r3 p  K5 Y
' ^1 x5 E2 a/ [/ m: A; ^& W
什麼是exception vector呢?其實就是CPU出錯了(其實不完全是出錯),它就會# }/ `  }* k; k9 L, U* N. R
來這個vector找看相對應的處理函式,例如遇到看不懂得指令,他就固定會抓0x4
' w$ i  l5 E1 `6 u位址的指令,也就是『ldr pc, _undefined_instruction』,接著就會跳到處理undefined instruction的函式去處理。
$ h8 [: Y0 M$ o* `( ?$ c) ]# N# j" Y7 T, N2 x. {( b9 s4 |; i
到這邊我們回答了第二個問題,程式當掉的時候,就是會跑來這個地方,接著再3 P  m# x* L9 ?9 h6 t+ [
Jump到處理的程式碼。同時我們也發現,一個CPU就是靠著這個vector在處理2 b6 Q5 G, M9 Y: Z
各種不同的exception。那....萬一這些vector被改掉了呢?
! L& V0 Q; T7 U/ w; k. v例如:你程式碼拿到一個null pointer,然後又對這個null pointer開始做寫入動
% d; u! F7 r: i$ y0 Z- c. Y作。9 Z% Z8 K! j; f4 U  r
- j4 D* H4 ~3 N" F6 V" N  t
char *ptr = NULL;
  G/ C( x! b8 h1 [$ h$ I, xmemcpy( ptr, 0x0, 10 );
8 Z9 n3 m7 ]4 Q. r7 b
$ _+ g3 W6 d' z6 Q# D3 \5 k0 q那整個OS就完全不能動了。可是我們也知道我們現在這樣寫,頂多 segmentation
& j! K4 o% e$ b  Bfault,並不會怎樣,OS還是照樣活著。why why why?
2 ]" \3 b  n$ I% g. Y# q( W+ R" b原因很簡單,就是這些區段被一些方法保護住了。一般常見的有兩種方法,一種是( x- n5 o0 k+ Z# `5 G* b. `( w
MMU,一種是cpu有兩個exception vector存上的位址。
( |. M+ o1 S5 M5 ]. g& c/ U  ^9 S6 j/ i. B4 P& m0 ^( E, a
MMU可以設定某個區段的存取權力,只能readable的話,那就不會有被改掉的問/ g: [* K7 [4 e8 E
題,另外一個方式是可以將exception vector的位址擺到不容易改到的地方,通常
8 x8 k8 ~' t* Q& J0 y9 h4 h* l: s是往高位址的地方擺(high vector address),例如,0xffff0000接近4GB的位& E  v: g4 n0 o. c
置。(32bit 最多只能定址4GB)+ \. g& Y& z- S; }# K' q0 X% `

+ V% J. L+ p0 ]3 `第二種方式,通常是一開始開機vector還是從0x0那邊抓,可是經過設定CPU,可1 _1 T% M. q' ]( m6 N- T
以改變,在不斷電的狀態下,發生exception就會跳到高位位址去找exception
7 e1 R; p! E0 m% G" |8 g- v/ [vector。
4 _- X" H" }. I% ?
7 a5 R+ G7 F; L) `/ fp.s. 關於定址模式可能有些人沒感覺,可能要懂整個CPU的memory map之後,! ^8 q5 n5 @6 Z3 E* a
會比較有感覺。" e, y. W) Y4 R/ I( j

# n, i$ C, @3 Yp.s. 眼尖的人一定覺得很怪,為什麼vector第一行用『b』,其它卻是用『ldr』,
9 Y( _, K& G: j這個牽涉到本身指令的不同和程式碼是不是relocatable的程式有關,將來有機會
1 F2 r* q4 x8 t! K6 ^再深入討論吧!!
$ G# N4 ^( A3 V
! i% k5 W+ m+ t# |. A---) |& e- V: B- E( ]
想知道答案的朋友趕快call in進來/ T" R2 A! C, r2 k' z% {  U
前五名我們有優惠
3 A4 P* @- T: y  j; e9 Q. d0 @8 G- N現在進一段廣告~

評分

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

查看全部評分

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

CPU exception vector 淺談之二

上面貼文本來的用意是要點出,為什麼一個CPU需要有擺放兩個exception vector的
4 [  d7 O1 P% G3 O4 O, S功能。如果有看懂的話,答案很簡單,就是怕被程式人員亂改改到了,這樣會讓整個OS
3 V) d. b' R1 d2 i/ @, U7 \當掉,很容易一個null pointer亂填,整個系統就掛了。可是一開始不知道怎麼帶出這
8 o! b4 P# q! f1 i3 K麼問題,所以文章就變長了。恰巧,也提到一些其他的東西,我們就稍微聊一下CPU
8 N0 [  V+ Y6 z3 v的模式吧。
$ G$ M% |1 N  e" h2 W/ k& S( |( z) ^  N8 ^8 i5 M! G$ G- X
從 exception vector 看得出來,CPU本身除了拿到指令一直run以外,還會接受一些
) Z; h* H* b0 b1 C# ^4 Rexception發生,發生之後呢,便會到這個vector來拿相對應處理的指令。+ C) z. n7 o$ e. _$ h

# y- d3 {0 e0 S8 g! Q( b& a舉例來說,一個程式碼被compile成使用某個硬體的特殊指令,可是卻剛好被放到沒支
& O6 B: }# B+ A" U% Y! O) t1 a援這個指令的 CPU 上執行,那CPU跑著跑著發現一個自己看不懂得指令,就會發出一
% Y8 J0 e, I! c. a+ y$ O個undefined instruction 的 exception,exception發出後,依照CPU的設計,以0 l4 N4 W% \7 T8 m
ARM來說,就會抓位址在0x4地方的指令開始執行。$ Q8 I* o4 o7 T  z& }0 ~1 I
9 R9 \8 d* m- C! n* R/ g- n: ?
而這時候,我們的處理函式就有機會可以透過這個exception hanlder去模擬這個指令
$ o1 D1 D2 x! S( W# F2 U,利用多個指令或運算計算出那個特殊硬體指令的值。這是其中一種undefined1 ^; G  q4 o$ R
instruction exception 的應用。
6 C* x6 H& b4 q8 A: ^* `6 _1 T- W( k
6 ^1 R" g# k( V2 u另外,我們要提的是,這許多的exception其實隱含著CPU的運行模式,例如我們以前
% d( t) l+ V# V3 b: s常聽到x86 CPU切到什麼保護模式之類的,其實就是因為發生了一些exception,為了
! U: E' h* E) q& E- O! [處理這些exception,所以切到相對應的模式去做處理。& Z. r& r8 J4 p

+ ^$ T6 H! J" }6 U, ]; h切換模式聽起來很單純,其實對實作OS來說,牽涉到的事情還不少,例如切換模式之
% |& }' }2 ^: h" m7 L. Z& Y後,為了要讓處理完exception之後,原本的程式能夠繼續執行,相對的exception! d& f3 w9 l2 C  s' X4 B
handler必須將目前狀態存起來,所以就必須實現stack來存放目前的register status
5 L* w. y" c+ U0 V(context),以便將來可以resume回來。
3 ^+ o% |1 I+ l6 |5 D+ }
! J( w& V( g( T1 D& L! ]0 K6 |看到這邊,應該有人會問想說,了解exception vector的意義何在?當你要了解如何7 E" m! E" H# n6 ?* h& j7 t
實做一個OS的時候,其實就是要去控制CPU,而CPU的運作,其實就是控制這些模
0 @; v$ l1 T) j式。而exception vector就是這些模式的進入點。當你對一個OS可以有透徹的了解
8 \4 ~  M* ~$ O) J6 t的時候,對於系統表現出來的行為,會有更新的了解和解釋,對於debug application# ^' H9 r! \% l3 P
和 driver 其實是有幫助的。
8 y4 E* A6 g8 D4 U& ^8 [
9 T8 A" U$ ^0 q) u& n" Y對於各個cpu mode的說明,例如一些有趣的問題:有哪些模式?每個模式有什麼不6 v- N8 N, x& q4 d+ v
同?它是專門處理那些問題?有哪些種應用?這些因為要牽涉到很多assembly的程
5 V, }4 _" F, ~式片段,所以就先不深入探討,有興趣的朋友可以call-in進來,前五個有優惠喔~~
3#
 樓主| 發表於 2008-7-25 10:10:00 | 只看該作者
以上兩篇是以前貼到朋友網站的文章~* b& ]7 K2 D9 J9 a
所以口氣比較~~恩~~怪怪的2 k- M% i5 w6 J( a/ [4 k: A3 y
請大家多多包涵~
4#
發表於 2008-7-31 20:42:13 | 只看該作者
哇.大大很厲害.                       
2 V5 b# R* o0 n) x1 Y看完你的文章讓我受益匪淺.
5#
 樓主| 發表於 2008-8-1 10:52:38 | 只看該作者
....- v7 I5 n( `, o. A0 o. q& v
....# r" D1 V# K) @; W, ?
....
* o- d) y6 d5 J- Q% f1 O....
& q$ E( y+ b% S....9 X' A$ h6 W4 H+ V8 e; v
...." c! s4 |' X9 ?$ I8 T
....
" R( ^' F' ?3 ?- g/ ^& R% ?....: Y7 u& K8 T) R3 p; H, Y
....4 ~. d# W: G6 R" G& O. h, m
....
. S% ?2 p- c% O' ]% Y....) l% M+ [& }8 p
....- Z% I6 w9 O" m+ L
....' m. W+ H8 ~2 [
..../ h1 S8 G- D8 V8 z
....
; A, o5 r/ ]4 E. i. I, P4 b1 h...." a7 a/ \- N$ P" i& m7 H4 C1 y, @' D
文繞圖模式
6 j* r; ?- |3 `# E" N加點字讓它避開一下! Y& c1 P3 M; e% o
原帖由 rogeryang 於 2008-7-31 08:42 PM 發表
2 Z( K4 s& q4 `2 s哇.大大很厲害.                       7 o5 F4 R- H* e7 p
看完你的文章讓我受益匪淺.

0 j2 r" N: r2 P4 w. M8 S7 @+ W& k% o; e! S$ g1 s2 q1 g
呵~ 感謝捧場ㄟ* M9 }  M! V+ Y' l. }( g
之前都沒人回文
* c& [* y, e; r' `! }" Y不知道文章是不是沒寫好; C5 v6 M$ X+ l9 g
anyway, 有交流是好
9 u' v; t; a3 U* @有時候會一個東西不是因為很厲害
  v! C6 k$ q( ~' X只是碰巧碰過所以就會了
4 u* a, A7 k! {
  V* J/ J' d; N" m8 ?會貼文的目的 (以前大多是潛水居多)
0 o3 ]5 W7 m% O- B# ~5 p$ Z" d就是還沒遇上的人可以多了解
" W6 S4 e& C/ D2 |會多一點的人可以進來指導一下
# w. \+ v& _: @3 F) ^- E# E
9 \4 C  E3 F" z. K[ 本帖最後由 gogojesse 於 2008-8-1 10:58 AM 編輯 ]
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-1-23 03:47 AM , Processed in 0.171600 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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