|
有些基礎不夠深厚 遣詞用句也不是很精確
. q% M z# ]3 k) a# c以下試圖以自己的體認和觀點 以簡單的辭彙: z+ ~; X* \2 z+ Q! k2 [" F( M
去解釋一些process與系統演進的方式
3 m. N3 ], g7 N0 E如果有誤或是清楚的地方 歡迎大家討論% H" E. F2 [0 V% S4 j1 i4 S- R; z
- z& d$ j1 f) Y+ f4 P
[本文開始]; T8 j$ A% c- e: K5 W: W
在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候
/ P% R$ I k! `0 F; j) J* C& S J% J常常會被一下子多出來的專有名詞搞混
4 x$ w6 K$ r* D像是DMA, memory, cache, mmu, virtual address, physical address 等等
" m( ~5 D" N$ b- i尤其大家一開始接觸電腦都是已經發展很久的x86系統
/ e( {5 r* J3 n; A; ~% f即使有單晶片系統的實驗課程6 s# Z8 f( _+ ^$ D; @
也很難將單晶片的經驗
+ T. B! h" v5 }運用到x86或是已經較為複雜的CPU系統上- K: | f" Y; L y9 o O
6 P; y/ {% ?( O; S2 w因為CPU上頭又開始加入了越來越複雜的作業系統$ S1 Z- I2 m5 I7 T# x: {- r3 C* d% V
像是作業系統常提到的kernel mode, user mode
" B7 [# n$ \% b6 I; K8 e常常跟上述的專有名詞physical address or virtural address交互使用
! B! k% j$ `1 I& m1 N例如刻板印象的『作業系統處於kernel mode時,使用physical address』
8 s9 G7 r& s1 ~! p, t; o+ \# f4 f; u7 w經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問( t1 |: Q7 V- V) M3 c0 U' v9 e
" D- {: `3 j4 A& g! `; b4 \ ~" X; }( Z+ X那應該怎麼簡單來看待一個系統?
4 D+ P! F6 O0 p1 X P3 ?) K' W3 \! m( A& m8 ?: _ m8 ]
首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』7 B* g; b* x; P5 z# z4 F" \
他是用來處理各種『資料』
( W" t* q7 Q7 M* z0 F2 h( P8 p. B6 A3 w/ n# Y
那麼這些資料又放在哪邊?他是如何去存取這些資料?4 t: t* f% `# ] z7 ~+ y. I& i
- G% ^$ v. s8 h) S. l通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory4 g+ } V, H* j8 U* \: [
+ c+ z1 F+ U3 l$ S. W- H' A0 h到目前為止,我們得到一個簡單的系統 CPU + bus + memory
3 `1 O; }- W9 r! b! S- ~& P$ O2 {6 ]$ H0 T3 G# k5 e l
接著,我們用兩個角度去看這個簡單系統的發展
/ `1 U+ y5 I3 f/ ?7 J1. 硬體加速 }, @- w8 ]& y6 J0 h
2. 作業系統
; o- C$ B$ Z7 J, Z4 a! |/ z/ B. p$ g5 Y& c
我們先從硬體加速的觀點來看這個系統如何改進:
. o& K7 W; A- l) M) E i+ H( Z) T3 I4 j$ ~' l. T# f; i4 K
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)/ n9 J! }: R- R; F) E
放在某個地方,然後請你設計好的加速硬體去處理這些資料
( ^7 s8 m8 b. i9 t3 ^* P4 B可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。
0 B) i( h! P- l' b a. ?6 K6 \這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。
, t1 y3 ?4 ~: e+ D. f( Q( y0 Y7 C9 }3 l% V4 C1 K; n9 H
CPU + arbiter bus + memory + DMA. I+ n% T( a1 b# j/ n8 s! W& x6 S
4 F5 {% Z; m+ X6 r$ h接著我們從作業系統的角度來看:
5 Z4 I3 Z; ~1 q- H6 `$ l' T+ R; C3 x. C
一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。
8 d+ Y7 {. I' J/ M, v# S# `- S
, b' l9 _0 ~5 B例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。
$ z; P# J* a: U H. c5 ?
/ k7 h' H( ^" {! \6 u; R到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。
7 v8 f8 [ t* N! ^( G. p
8 j! p% M4 }& U) A5 U所以我們的系統變成了0 v* c% |" T1 u( [# J; l
' B$ c. e C) X4 T5 ?
multi-mode CPU + MPU + arbiter bus + memory + DMA5 q7 |6 ^+ S/ V
* ~. h( h$ L- c* ~
因為字數限制,部分貼到回文當中 =) |
評分
-
查看全部評分
|