|
有些基礎不夠深厚 遣詞用句也不是很精確
5 W' B U0 R% u% K以下試圖以自己的體認和觀點 以簡單的辭彙
) M( R% X( ^- m7 {; z% i去解釋一些process與系統演進的方式
8 d9 A4 z* o# Z1 o如果有誤或是清楚的地方 歡迎大家討論
! r5 x( d) D0 }( K! ]6 P. o$ L3 Y; ?
[本文開始]# S7 X$ [! F, |: f
在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候
& h% O+ P, F j8 W常常會被一下子多出來的專有名詞搞混
+ S. j) n3 z1 U; \1 u) X. {像是DMA, memory, cache, mmu, virtual address, physical address 等等
; y( a2 K- N$ U1 O) n6 P尤其大家一開始接觸電腦都是已經發展很久的x86系統" X! @* ^% K2 F
即使有單晶片系統的實驗課程7 @4 L! c2 M$ R. [- }- H. s# W- F
也很難將單晶片的經驗& [6 r' l3 K6 m) x5 |2 S" p. ~. r% X
運用到x86或是已經較為複雜的CPU系統上/ U" e1 g2 }( m- y
# x, n z. e" [ x; y9 B! T
因為CPU上頭又開始加入了越來越複雜的作業系統
) k6 G1 Q; @; r' K4 L6 p% h7 O像是作業系統常提到的kernel mode, user mode# J0 Q2 _ ~! x! W, X
常常跟上述的專有名詞physical address or virtural address交互使用; X2 n4 V1 [$ G& ?" B E: e' D+ z
例如刻板印象的『作業系統處於kernel mode時,使用physical address』6 q4 [8 ?6 W) [$ a- l6 P
經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問8 E* s& ]1 b8 Z2 r7 i6 E) u I. x
) x7 U9 e: K* y# d) J
那應該怎麼簡單來看待一個系統?/ Z. q7 p6 {: k, G) y: b
4 v7 b8 b( E# `* w& I
首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』- R: m: M& o9 T8 \# Z( P
他是用來處理各種『資料』& k& j* n( X: C
* g1 q5 q* E8 [& g- a) q+ a0 }. z那麼這些資料又放在哪邊?他是如何去存取這些資料?
/ C6 b0 T7 v, |9 x7 o+ f/ E; _0 n4 C4 _# p7 a6 ?. g
通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory3 `: q5 e, E' p" F1 O; B
* f' ~6 e. A# f$ X( j" C到目前為止,我們得到一個簡單的系統 CPU + bus + memory; `2 g8 J9 \* }7 y
1 j/ ]9 l4 O0 Z7 {2 x5 U/ c
接著,我們用兩個角度去看這個簡單系統的發展4 r( U. m, t9 G: q! {$ H3 x: f' K2 A
1. 硬體加速% f, F: ]8 w% j- R" Q" I! _8 y
2. 作業系統5 F9 [0 x, x' ^; `0 l2 O- b7 e3 ?
5 C$ C" M5 v* @3 d7 w* h我們先從硬體加速的觀點來看這個系統如何改進:9 }/ X) b! Y1 G' ^; I4 ]* J
2 G( Q0 @4 a" E( A' @
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)1 r; } c$ _6 [6 l! R1 d5 v: y
放在某個地方,然後請你設計好的加速硬體去處理這些資料
6 e0 [# y3 k% w/ Z+ |6 p& a可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。3 s: C. m1 H" D) z0 I D
這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。7 s' |0 K- m" ?# F+ J
! i4 U+ x8 l9 a% zCPU + arbiter bus + memory + DMA
& V6 p; g+ ?5 M0 T* v; H3 t( l% y5 L7 s0 W) k4 h
接著我們從作業系統的角度來看:
# N- H9 g+ K7 g, \' G3 g- a
4 Z$ | j; Y& C# K& e* @3 F一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。
* y+ T W |) g: E/ K7 g" S
1 }. ^3 ~' S z1 g# M/ Q* ~( y例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。$ N# ?, S3 R. h6 X, Y" Z
% o/ W+ G; N8 g$ X6 b到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。, q8 E1 O( J2 ]$ Y
- H# m" q. g" _% V4 U- Z
所以我們的系統變成了
. Z6 F, A4 S: ^- E
% j3 p6 A0 L4 h$ H4 vmulti-mode CPU + MPU + arbiter bus + memory + DMA
% z* Z' _8 G& R* B5 M
6 q( e( Y1 C( ]' Q因為字數限制,部分貼到回文當中 =) |
評分
-
查看全部評分
|