|
有些基礎不夠深厚 遣詞用句也不是很精確
1 T% O$ m5 {* a以下試圖以自己的體認和觀點 以簡單的辭彙
1 D1 N7 u0 l' W4 @. i; b: K去解釋一些process與系統演進的方式
" |) x* @( \! g8 R4 Y- z, S如果有誤或是清楚的地方 歡迎大家討論! g0 K. U8 E5 W, `1 q) H
! `1 r' }% \: v# \& l' w+ b[本文開始]
Z6 [" A! D# T: y- o& V在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候
5 M, G3 [ ?9 ]0 O常常會被一下子多出來的專有名詞搞混$ |" C* K2 z1 G
像是DMA, memory, cache, mmu, virtual address, physical address 等等
0 |) v: J+ L6 P/ O, [* H# m" P" n尤其大家一開始接觸電腦都是已經發展很久的x86系統
- \& r+ K V$ F& S; h7 l; i, A5 {即使有單晶片系統的實驗課程
: x+ {9 O! {) u \0 R2 l' c也很難將單晶片的經驗
; W, M, z! Z! t: l) k0 c9 x" |運用到x86或是已經較為複雜的CPU系統上3 [) W/ ^# }6 z& B' }) S2 s- `3 u
0 |6 g" a0 B0 R& s% L因為CPU上頭又開始加入了越來越複雜的作業系統3 F+ E: [2 F4 X7 W8 a9 g
像是作業系統常提到的kernel mode, user mode, `) _" ?$ z3 c. i0 w3 [
常常跟上述的專有名詞physical address or virtural address交互使用
, S1 e& l9 F' j3 } A/ _例如刻板印象的『作業系統處於kernel mode時,使用physical address』
7 m6 r# R* l9 Z0 M, C6 G" W經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問8 u! L* ~+ L; V, T5 B* i) F# h
, i# w" i; d1 ~- I% f! |; f1 t
那應該怎麼簡單來看待一個系統?
) ]9 B* G2 d {$ N2 ]- E7 J+ N8 y4 B1 _# Q- F
首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』/ t: } y7 n3 @0 f% n
他是用來處理各種『資料』' n4 @/ q& p" N, S
0 Z$ _8 [) \; q! r那麼這些資料又放在哪邊?他是如何去存取這些資料?' \$ C# ^( ^. { v0 i7 x) c& F
0 @! O: L! t8 A3 Y通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory
! A' H* n4 b- D( _, {5 v' M
* a+ P; c* V' J, j, H M到目前為止,我們得到一個簡單的系統 CPU + bus + memory2 \2 g( q- L0 r
5 `, G4 Z, P3 c接著,我們用兩個角度去看這個簡單系統的發展6 W* T% f( h. e5 P3 ]0 F+ k
1. 硬體加速
% I; l% E; Z' @! {' D8 W, {' g2. 作業系統4 v* ]& c, p" S1 d
) u/ x G3 w ~1 q% z
我們先從硬體加速的觀點來看這個系統如何改進:2 G$ a* F; n7 E: `1 r f
& g: X6 G9 C( z! m% A3 a首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)
% i7 C; _% o2 Q: k% ?放在某個地方,然後請你設計好的加速硬體去處理這些資料
" m8 r9 o; ]5 {/ j0 p6 \4 ]可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。: T% }2 y. Q- A
這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。- v( C. _. Y& K/ R; }1 l( V/ a% V
) ~+ E+ e4 p# t; Y- q" h+ O, s& t& ?CPU + arbiter bus + memory + DMA
" u2 h6 K) G" B$ v
7 Y9 H8 }) S. v0 F接著我們從作業系統的角度來看:3 `0 \( d% a6 C' P Y( D2 g/ @
# D# \9 u4 e% q/ d一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。5 T) |- G; V" O$ U6 ~+ N
^; t; k8 `8 ~4 o
例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。
; t* K/ ]7 I" Y
0 u# d: i$ @4 c到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。5 u0 M) l3 P! ?& H" `: T8 e6 O
9 m9 U, a4 ~$ [
所以我們的系統變成了( v, n) s/ E2 U& G
4 [" {; w) P4 N8 D/ ~1 b. {
multi-mode CPU + MPU + arbiter bus + memory + DMA7 H- e! T" q$ {# ]* H7 T# X
5 V& t: Q# U7 N; P1 k u因為字數限制,部分貼到回文當中 =) |
評分
-
查看全部評分
|