|
有些基礎不夠深厚 遣詞用句也不是很精確1 ?7 C3 t @) T- j. l/ y) d( O1 I
以下試圖以自己的體認和觀點 以簡單的辭彙' i5 r+ E3 Q$ G& b
去解釋一些process與系統演進的方式( n' n1 C6 x% k: I, a+ [, w* K! X
如果有誤或是清楚的地方 歡迎大家討論- ^9 R/ u" t; ^( f" E
: n$ E' T; I" R! [0 i/ f[本文開始]
, y. k) s1 N- I: E在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候. Z8 ?% Z! h4 ]+ b( ~
常常會被一下子多出來的專有名詞搞混# B7 G, B% }1 Z8 v1 }0 P9 ^( e
像是DMA, memory, cache, mmu, virtual address, physical address 等等
/ Z4 D7 ~6 h' v尤其大家一開始接觸電腦都是已經發展很久的x86系統7 z1 {. ~- J! T, f: I- n* c/ j
即使有單晶片系統的實驗課程
, Z; ^0 X( @# n. w9 F0 Y7 C& s1 G也很難將單晶片的經驗5 ?: f7 V* F0 S9 U5 i% ~$ Z
運用到x86或是已經較為複雜的CPU系統上
2 `" r: p( [5 I! V5 O+ e( A0 f2 }& O# _" n _
因為CPU上頭又開始加入了越來越複雜的作業系統
5 I# O k# `* a9 A7 p6 M- {像是作業系統常提到的kernel mode, user mode; P2 i, ^; |/ u0 b; z& ^4 }9 _
常常跟上述的專有名詞physical address or virtural address交互使用4 ]$ G7 o* t1 w1 w
例如刻板印象的『作業系統處於kernel mode時,使用physical address』( u# V+ G* E8 S3 E4 K/ i
經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問
! m$ |. Q5 }$ u+ q4 i H0 C4 y" D
那應該怎麼簡單來看待一個系統?3 t* V4 _" t2 H& h8 v9 G
* K. R8 J& j" S3 L9 z5 Q
首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』% Q$ g) i( V6 Z. }% s1 E
他是用來處理各種『資料』+ A' i8 j( l5 f0 c+ F, Z2 ^% A
% y' u* @( j% F- y
那麼這些資料又放在哪邊?他是如何去存取這些資料?
9 s' W; O* t" T3 Y- ~9 M0 z# e, P* b1 @
通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory
' M. f5 H, b' P o! {' U5 `. {
! t2 G w& |* _到目前為止,我們得到一個簡單的系統 CPU + bus + memory
2 j9 m) C: y% A4 ?
, ?& v4 b( h4 ?! x5 c7 X( C接著,我們用兩個角度去看這個簡單系統的發展: e4 S d! F) k/ m# n
1. 硬體加速
& [' X4 Y- s* U9 g9 I2. 作業系統, F" G, P- }# p
0 y( I9 G- K. Q5 n# J2 Q; {我們先從硬體加速的觀點來看這個系統如何改進:
6 y* \, ]( J' ~8 @! I- l, l& Q% j0 c" E& c( a0 Y1 V
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)8 M% Y7 M6 Y3 O; t# ]3 s7 j* Q1 T% F
放在某個地方,然後請你設計好的加速硬體去處理這些資料
7 `# v! d9 N8 s7 W/ b5 v B+ ]# R可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。
( r% h5 A$ \$ ?; m9 ^這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。 k" H$ x; u, L; Y
# K4 w0 l+ T- V1 L
CPU + arbiter bus + memory + DMA7 l9 L) q2 M* ]" c4 t+ P& d8 {5 M
J1 y2 \7 o+ R9 w
接著我們從作業系統的角度來看:
/ A8 O. A3 j8 D9 |4 K& |, G. m& q) l: e
一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。! V2 s" u6 E: T- @. { q& p/ {9 F
: O( E+ \0 v3 T& h8 `% Q* R例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。& P* n3 z, Y2 \
( i. ~2 u# e2 S3 P
到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。: A8 l0 V! F k( _
2 b: [0 e( i- y1 j
所以我們的系統變成了
8 \) s+ y- U _* G, g
1 I, K* B/ N% j8 P1 G$ Smulti-mode CPU + MPU + arbiter bus + memory + DMA9 Y$ i T# R. ^- K
* E. G- M: Q7 ?+ A# U. Q因為字數限制,部分貼到回文當中 =) |
評分
-
查看全部評分
|