Chip123 科技應用創新平台

標題: 從system bus來看系統 [打印本頁]

作者: gogojesse    時間: 2008-7-31 01:36 PM
標題: 從system bus來看系統
有些基礎不夠深厚  遣詞用句也不是很精確
3 Y' k" C, d2 S0 x1 V以下試圖以自己的體認和觀點  以簡單的辭彙
; U: u( ^3 J0 N* g  ~" n去解釋一些process與系統演進的方式
5 E% T: d8 T: G/ k如果有誤或是清楚的地方  歡迎大家討論
6 B+ ?" r6 m% s, w2 B
, A( v* g& I9 I2 q. `[本文開始]/ l  j3 c8 o+ W( _: J
在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候
' O, Z+ \, o6 H1 n/ ~) W0 P常常會被一下子多出來的專有名詞搞混8 f& ^2 q4 T3 a+ d# }. s; y8 ?9 X7 O
像是DMA, memory, cache, mmu, virtual address, physical address 等等3 U3 R, }! n$ b
尤其大家一開始接觸電腦都是已經發展很久的x86系統
# r: K6 |7 V! E1 a! f即使有單晶片系統的實驗課程
" K- \$ [2 t/ h) e( G9 L也很難將單晶片的經驗
  U8 m% {# W) m5 R" i" {  k; V& R& e2 ~運用到x86或是已經較為複雜的CPU系統上
# e$ v8 y/ X: U/ |) E1 k
$ [; V; l. b& M8 V因為CPU上頭又開始加入了越來越複雜的作業系統4 C  Y+ l  h! c) d) q% `0 h4 T& e6 L
像是作業系統常提到的kernel mode, user mode' D, ]. {3 l7 P; |) g
常常跟上述的專有名詞physical address or virtural address交互使用  d. l7 G% a) ?. Y% e2 T
例如刻板印象的『作業系統處於kernel mode時,使用physical address』( u9 ^( c$ o7 x3 K( T# s* Q
經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問; X9 r6 \9 a, b# F
# v2 Y& p6 C; V
那應該怎麼簡單來看待一個系統?
9 O' a" [; O( w# C1 n% D# ~# |  |# R
首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』
# q* `; G1 g) B) H$ ?他是用來處理各種『資料』
% t6 {9 |& `4 S- w4 _7 [; C, u+ w1 L( f1 t
那麼這些資料又放在哪邊?他是如何去存取這些資料?
+ ^+ G' F, p; U& k- O$ f$ I. F% [- f9 I0 t3 i  x
通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory
, a* ]! [8 f% i: p' _, S; D4 N1 I' q9 u1 E2 X# D0 }+ C9 f4 q: M
到目前為止,我們得到一個簡單的系統 CPU + bus + memory
! |6 ?# L1 \# p2 c* R& I* U- Q  {
接著,我們用兩個角度去看這個簡單系統的發展3 z5 J3 I3 e4 ?: x
1. 硬體加速' ~8 A! W5 C$ B" W4 ]4 c0 C
2. 作業系統) d/ c' J; N* c8 o/ ]7 V. o
: a  B! F1 X, @
我們先從硬體加速的觀點來看這個系統如何改進:! x$ v3 ~: v( r2 s
- y' s# A" f$ C$ Q# x, d& F
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)
: }6 h. J& O3 T! X8 T! h' L放在某個地方,然後請你設計好的加速硬體去處理這些資料
: n) ?8 L( F+ A& t可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。
6 z# e9 s5 }" i% b- O. o這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。
; ?) J: g$ X, L, E% L' j7 T6 u/ x9 [* X; R# m
CPU + arbiter bus + memory + DMA
$ d# `$ O5 N* V0 d
2 Z* R# ~1 E: e% }0 E: O/ M接著我們從作業系統的角度來看:
2 p0 h; M+ r5 b( E& E3 E8 r- k, I  w$ E9 i6 l: y
一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。0 t+ F4 L7 v9 W2 ]& G
9 p2 H8 p4 r" i. [; D: E6 A
例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。
: W1 M2 Q8 _  h1 ]
; F% _+ u7 R* v8 D2 b( F* \到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。
0 P! i+ \3 j( g. w- j! d& X7 D' v  Q. S8 \. M0 z3 s8 E
所以我們的系統變成了
7 W- v* p3 Z8 `- z& E' W' R0 `9 T( X3 Z/ u  T1 v" M
multi-mode CPU + MPU + arbiter bus + memory + DMA
8 P  N2 j" V! m% q' k+ O5 {* e$ s& z- I3 Y
因為字數限制,部分貼到回文當中  =)
作者: gogojesse    時間: 2008-7-31 01:43 PM
接著我們看virtual address和physical address的誕生,這邊相當抽象,需要一些想像。
( U$ E: M; m7 R2 q, W
. I# A! i6 s; g$ k* J' s. b隨著時代進步,越來越多user program產生,user mode的program目前雖然已經不會因為隨意的存取記憶體,造成OS掛點,可是還是有可能去改到別人的記憶體,因為每個程式共同擁有並使用同一個記憶體和所謂的記憶體空間。
8 x8 F  r1 I# Z, \& }4 m7 ]# S" J# o) x4 H: d4 F" E) V: ~! P
例如:程式A放在0~128 KBytes,程式B放在512~768KBytes,程式A寫錯位置到B程式的地方,變成程式B毀損,B程式就掛掉了。, q3 o; p6 }/ J) o0 X

% r: e- \' P+ O2 o- [8 l3 J- @* a上述的記憶體使用情況,不僅給programmer帶來困擾,而且變成記憶體必須被事先決定好誰只能用哪邊?只能使用多大?這樣不但得事先規劃,對於記憶體的使用也不是很高,因此MMU的硬體便被提出來。% P6 Q6 f; w6 I' j

8 S) f# w+ L3 q簡單來看,MMU記錄著某個虛擬位置所對應到的實體記憶體的位置。! d5 Y/ G; [! [& H) d2 p
' k* V# u/ c+ C3 w2 I/ m- q
作業系統利用這個特性,為每一個user program先做了一個假的記憶體,每個程式都以為他有很大很大的記憶體空間,其實當程式呼叫malloc的時候,才會去設置MMU將這個user program的假記憶體空間和真實記憶體做個連結。這邊很難解釋清楚,其實每個程式都有一個假的記憶體空間的紀錄表格,當OS做context switch到某個program的時候,MMU也會跟著切到這個table上,以便用到正確的紀錄表格。
9 e) R* L0 d4 x8 W) S: ~! e" S* V$ l  D6 l  p% j  |
例如:9 @4 @) L# v7 z! v' Y' z7 J+ x

$ k$ M$ {9 K3 X1 N程式A的表格記錄了他配置0~4K,而這4K對應到真實記憶體的128K~132K的區段。. v' W; m: P$ ~! J% z9 ^5 z, u' a, L
程式B的表格記錄了他配置0~4K,而這4K對應到真實記憶體的132K~136K的區段。
3 q4 I4 I+ S* V- Y/ i
+ y) H$ c8 Y5 T+ p" D  l雖然兩個程式自己都以為他是用到0~4K,可是其實真實記憶體所配到的位置不同,作業系統在切換的時候,會同步將虛擬記憶體的紀錄表格做切換,以便使用到正確的對應表。以上是一種例子,各種OS可能採取的設計方式不同,但是概念大多是一樣的,我們可以看得出來,對每個程式來說,它可以有擁有許多假的連續記憶體空間,對程式撰寫,還有記憶體使用率來說,很有效果。6 v5 g+ `7 o# _( [5 ?" t
# a7 \' R0 W; {; j" u& H
到此,CPU多了MMU,現在大多包含MPU的功能。; M5 P) g) u8 A

" q5 P) p1 @( b1 c- }: _/ ]muti-mode CPU + MMU + arbiter bus + memory + DMA
8 |. n# G6 N6 E. ~' ]2 L5 F
2 o* C# ~* m# y因此OS在kernel mode的時候,如果MMU是打開的,這時候還是使用virtual address。# D" o/ e/ r+ ?: l
4 u: R& \- k& |, t0 q) h' e
要讓mmu正常工作,必須要設定,要讓他知道你對位址的規劃是如何。
  A! c9 D: p0 R9 j! h+ ]- y* Z9 W5 W& f+ i0 _6 @% q, r+ F1 b
例如:RAM被硬體人員安排到0xFF00 0000的位址,可是你希望RAM被當成從0x0開始,你就可以設定MMU將 0xFF00 0000 對應到 0x0,這樣一來你讀取0x0就會自動轉到0xFF00 0000那邊去。
# K/ A! U4 e0 |& W- h$ e& x7 W1 v- ~: y
0x0000 0000 --< mapping >-- 0xFF00 0000
  @9 `% p/ E. ]2 Y) c% i8 t
* r4 C* z3 o* a5 l  e& a8 J/ R作業系統一開始就會初始化這些位址轉換對應的資訊,把它放在所謂的page table裡面,然後把table位址交給MMU,MMU就會依照table的資訊工作。+ N( z9 K2 B/ P3 r+ w" T6 e- H, B
( a0 v& Y' y( C3 Y2 `$ D& \- \
假如你今天有兩張table,兩張table設定不一樣,MMU只要在這兩張table之間切換,那記憶體對應的方式也會跟著換。/ W) A' j5 @0 _9 \9 g
6 P# _5 w! v; k  W" w) w
這是一個很重要的想法。假如,我每一個process都有自己的 page table,切換process的時候,table也跟著切換,這樣我可以控制每一個process去存取記憶體的方式。假如我是讓所有的process 都共用一個 table,這樣這個table的設定值,就會影響到所有的process。' g1 o! x  O( x- _# H. k: e9 j
; X  m- {, k4 ]0 e* `0 F
共用一個table表示每個process用同一個位址去讀寫,透過MMU轉換到的位址是相同的,會讀寫到同一塊。不共用的話,表示processA和processB即使拿同一個位址0x8000 0000去讀寫,可能最後對應到的位址是不同的。2 T: l5 P- S6 E; O
# W) ~9 Y& a" P% \$ T6 F( V
但是這樣的差別就是有什麼好處??
3 @$ [- F2 S3 W# @7 n. x* G" a' ]" s7 v1 M& w
因為感覺上複雜化了整個系統,本來我可以很直覺的拿processA傳給我的位址,去讀取它為我準備的資料,現在我可能會因為我使用的 table 不同,就不能在其他process直接使用。感覺很麻煩,要是大家都在同一個 table 工作,不是很簡單嗎?位址空間都是一樣的。
! `/ q* ~# b9 W' S% E& X
# {5 s& ^8 J! z- V. nwhy?!
; p3 |5 Y4 h/ Y& Y! O0 y6 ?" w1 y- y; C) w& M: z$ L) J
字數又超過啦~   
作者: gogojesse    時間: 2008-7-31 01:46 PM
一、  I9 i6 }: P! p, V( i1 ?  ]
如果大家都在同一個page table上
1 G4 y% f6 u  m8 v. }, o3 s5 N) x+ `因為彼此用的記憶體應對方式是一樣的: N  T7 a0 w6 V; A; ~; a. D
所以processA要了某個區段 0x0~0x100
+ e, i( L' Z$ E( A這樣processB就不能使用. h/ [6 a& r& U
很可能跑了一段時間之後整個系統的memory fragment就會變多/ W, p9 N% g% F/ d) `  j* Y& l
對記憶體使用率來講不好
7 }/ B( n/ h9 X8 |很可能要一次找到大塊的不好找- [& L5 F- U5 F8 }, ?
雖然virtual address有4G但是process分一分5 n" Y+ W! ~  H! Z. ?5 ]
還是可能不太夠" p. r8 z& }6 {& N7 N/ N

1 A. J7 }& }8 q8 X1 I" }二、* v, P; W8 ^' i
processB可以看到processA的address space
# h3 C8 B# Q  b# O) q' `6 g+ L0 V表示我可以拿到相對應的資源
2 Y# L% F- K. N- p這樣惡意程式很容易就得到一些記憶體上的個人資料3 q, k$ O) n, @
7 K8 N3 u6 r) L) ]4 C
有些地方的說明不太容易,太簡略容易造成誤解,贅述又怕不容易: O" p  c9 r# l" g: w
理解。沒表達清楚的地方歡迎提出來討論。
作者: rogeryang    時間: 2008-7-31 08:44 PM
希望大大以後多多發表文章.! e; C3 X6 L( P+ l8 ^+ S
透過大大生動的描述.很多複雜的概念就淺顯易懂了.




歡迎光臨 Chip123 科技應用創新平台 (http://chip123.com/) Powered by Discuz! X3.2