|
有些基礎不夠深厚 遣詞用句也不是很精確3 ]# U/ M$ t- k! c, B2 ?
以下試圖以自己的體認和觀點 以簡單的辭彙
% A( k9 _0 `8 [, b7 S' e去解釋一些process與系統演進的方式
( H4 X5 I$ b0 @$ S: S如果有誤或是清楚的地方 歡迎大家討論$ x; g# E3 i* B# N/ U# C
* E! d l ^/ h. f* ?- V1 w[本文開始]
, @7 L( L! x3 g9 ?4 N7 ~在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候4 F7 z7 L. m& a1 b+ z
常常會被一下子多出來的專有名詞搞混
$ D$ G* R# V( [. U. N3 |* d像是DMA, memory, cache, mmu, virtual address, physical address 等等4 I# ~2 C1 c* f8 w
尤其大家一開始接觸電腦都是已經發展很久的x86系統6 y- q7 U* {) h7 N3 i8 k3 z8 s7 C
即使有單晶片系統的實驗課程& M: [8 U# k$ x+ p$ Z$ m* P
也很難將單晶片的經驗0 k+ a$ @ N" M7 z9 @
運用到x86或是已經較為複雜的CPU系統上
' ^1 @2 b6 V( _; h' m3 l' [: j7 i5 ]1 c: Z
因為CPU上頭又開始加入了越來越複雜的作業系統7 Z: r. `( H& t W Q. k* T5 T
像是作業系統常提到的kernel mode, user mode
0 Z1 _3 s! H3 W; W# M7 I常常跟上述的專有名詞physical address or virtural address交互使用
0 i: R8 ^$ @# @3 \7 z例如刻板印象的『作業系統處於kernel mode時,使用physical address』1 y2 A! x# S3 F" p. t6 M3 G7 _
經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問
' ~2 c Q8 y- V; A! R3 y
6 |) J! c! F% j: J那應該怎麼簡單來看待一個系統?
( R, N$ h0 n$ E; e9 |4 H: H/ }2 u+ N" s4 H; w# q: m
首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』- C0 b7 V1 {% |
他是用來處理各種『資料』
7 ?/ C# O0 g4 E5 Y9 s1 Q) A/ F1 I5 n9 \' P; e
那麼這些資料又放在哪邊?他是如何去存取這些資料?6 _; _, Y% r9 L% t; f! K4 Y" c' x
5 J7 Z* g; i1 T: m
通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory
5 `: B& M# [/ l6 x; f7 T( R2 G
3 @: n1 u1 [( A0 s+ O9 T# a m! g1 y到目前為止,我們得到一個簡單的系統 CPU + bus + memory- S7 [4 s7 j* c4 g% {* u
2 T3 b# |! Z1 e; d
接著,我們用兩個角度去看這個簡單系統的發展
0 e, f% N7 e, E7 N: N) z" `1. 硬體加速
3 j9 C: q1 I- y+ i1 z2. 作業系統4 a) a. o: }+ W
/ x) _7 n2 |% i3 N6 B2 ?1 `
我們先從硬體加速的觀點來看這個系統如何改進:- o) F' f3 v; R; {$ q5 ]6 Y1 x
( S/ N; a1 `1 g3 v& Y& {) k
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)
7 V6 o G# ]* b1 {+ c! Z2 q3 J7 v放在某個地方,然後請你設計好的加速硬體去處理這些資料
9 u2 g0 b- [0 ?7 e可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。
% h/ Y9 [! ^4 H" M& G2 z這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。& O8 T* q7 I* C8 A( q
$ }7 M( ^, W) m/ A/ ^
CPU + arbiter bus + memory + DMA$ B: s7 U) R- m1 R4 D
+ @) i. V& F3 N) O5 Y接著我們從作業系統的角度來看:7 N( B# o/ O) s. o" A. O( o
# B* |0 Y9 [, a$ I5 S一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。) m6 K4 z- M' Q4 q8 A) \" _
8 n" g6 D, {* V( ?' p9 S i例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。
' [- A3 x; y0 b' D) ?1 Q) u) ^3 b$ p! `% n8 G
到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。/ Y- i9 O! k3 c
7 X) }* B8 T! T& Z" [
所以我們的系統變成了
0 g8 A- I) g0 l5 N
$ j1 S) K8 w( s( b" D. h8 L) }multi-mode CPU + MPU + arbiter bus + memory + DMA
. P* s* X0 b6 P1 s% V8 V, U. s; z% P6 {! _
因為字數限制,部分貼到回文當中 =) |
評分
-
查看全部評分
|