|
有些基礎不夠深厚 遣詞用句也不是很精確
3 s5 u$ W8 W8 v# y7 w以下試圖以自己的體認和觀點 以簡單的辭彙, M4 c4 l! r* g6 ?$ H- d5 i
去解釋一些process與系統演進的方式
$ P' q" q3 S1 D8 B* ~: E如果有誤或是清楚的地方 歡迎大家討論- \2 B& F% ?, c: i5 ?
, |2 a- n( |, l9 [4 t[本文開始]! g7 c- p0 f+ b* C) E
在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候( L) X" I5 L; f
常常會被一下子多出來的專有名詞搞混: I* |- u- D. r% w
像是DMA, memory, cache, mmu, virtual address, physical address 等等6 e! o+ J, k9 A3 J
尤其大家一開始接觸電腦都是已經發展很久的x86系統
: V- }- W: t7 d8 P7 I$ M4 w8 ~即使有單晶片系統的實驗課程
4 F2 x& d/ x7 J8 B5 ^也很難將單晶片的經驗- V' q8 X- _9 U
運用到x86或是已經較為複雜的CPU系統上& y# x7 G7 N8 l7 i# a% U
) e0 _+ M5 ?' @6 Q
因為CPU上頭又開始加入了越來越複雜的作業系統1 g( X; V2 S8 l( v# n X
像是作業系統常提到的kernel mode, user mode
+ I2 K5 s$ J# o常常跟上述的專有名詞physical address or virtural address交互使用
5 A. f8 i' }9 {# p& i$ B$ A Q. t例如刻板印象的『作業系統處於kernel mode時,使用physical address』3 `; e5 x+ U) u6 c1 d
經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問+ p4 B; m# ^5 J6 S0 `( S+ V2 t( P- Y9 V
2 y( W# q* C0 s9 W$ U那應該怎麼簡單來看待一個系統?
0 u! O" O6 u5 G! q& u0 y
: v0 O# V; B. y首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』
5 S: F6 ~7 o, b7 Y他是用來處理各種『資料』0 T/ C; ? e3 y2 C# J
1 \3 I% d' O! V- f' h
那麼這些資料又放在哪邊?他是如何去存取這些資料?
! J# Y1 T6 n/ O4 _$ _! z$ O
& @4 {% N z3 k% j- r) Z通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory
% `( c8 |4 o/ {) m. ^; |& j% B+ E! E# q$ W6 g! S
到目前為止,我們得到一個簡單的系統 CPU + bus + memory. |. m; K9 P) D# x
7 M+ Y1 L+ b1 e: J+ H接著,我們用兩個角度去看這個簡單系統的發展
" p I4 X7 s* N5 G0 f1. 硬體加速
: M3 O9 v k% I& U ~0 q% k! l% u2. 作業系統
+ x @( C9 Y. |9 c4 @ o% Q+ n% I* f7 a9 L5 B4 W9 x K, N* V; j' H& `
我們先從硬體加速的觀點來看這個系統如何改進:
: \8 ~$ A5 @/ h& a/ w6 x& a( e0 `) n5 M
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)* q" v- [) U/ b2 T& ^2 K
放在某個地方,然後請你設計好的加速硬體去處理這些資料
3 [- y' x: s9 b0 k4 f7 Y2 d可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。
: b) k/ Z. T6 }* {' q這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。
! Z5 g: S# L7 h
& C( i% ^: ^- c3 T5 S( _" HCPU + arbiter bus + memory + DMA, p( ~# G9 Z, l8 s
" p* Z! D g6 M接著我們從作業系統的角度來看:
5 k- J/ u7 F: s' W7 T( r: Y- k6 s% C3 ^5 P" o
一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。
7 A0 L; ]3 H: D! y% ?4 c* f
2 C; w/ b& ?! u: s例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。
# A" T0 C! b* [% P/ O$ o
5 u/ @/ }, V6 Q2 G* C) E2 {: z到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。& I! S' D9 \- Q( x1 Y) k. q
* R& w7 T: ?9 F, k1 a$ A0 f
所以我們的系統變成了
. S( T, @, p: q
* @+ G9 c- V* N0 |multi-mode CPU + MPU + arbiter bus + memory + DMA
% L3 A' O- m( E m- F
) j# \8 {# U* ~1 s7 R因為字數限制,部分貼到回文當中 =) |
評分
-
查看全部評分
|