Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 3698|回復: 3
打印 上一主題 下一主題

從system bus來看系統

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-31 13:36:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
有些基礎不夠深厚  遣詞用句也不是很精確
& Z5 L( \1 W  g! l. o以下試圖以自己的體認和觀點  以簡單的辭彙* z! N* {% F8 w4 |% d
去解釋一些process與系統演進的方式, ~, ^; Y4 b. U2 y7 p/ Y' y+ t
如果有誤或是清楚的地方  歡迎大家討論
) w4 B  l7 {9 ]" R
0 T! Q& j' X. ]7 H6 \5 z5 p$ Y[本文開始]
2 S/ o1 d# N7 u) h# T. G& k2 J" e5 Y在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候$ X) L) ]2 J) E- P
常常會被一下子多出來的專有名詞搞混
* h& J: }1 W0 s; Q+ c像是DMA, memory, cache, mmu, virtual address, physical address 等等
( e- H, W7 q6 T4 }& U* l  U7 F" L7 {& Y尤其大家一開始接觸電腦都是已經發展很久的x86系統" e# f0 s' L7 A9 @3 R- F, M1 S
即使有單晶片系統的實驗課程1 h8 U  P/ d$ C1 v1 _4 [7 p
也很難將單晶片的經驗
7 d" L! t$ n2 R5 P運用到x86或是已經較為複雜的CPU系統上
2 l( s/ t/ h& [+ q( e8 p
" K+ h8 X" }4 r+ d) g6 @7 B因為CPU上頭又開始加入了越來越複雜的作業系統
, U; P4 X  T, d$ t4 [像是作業系統常提到的kernel mode, user mode- P/ j) M8 D0 A. a6 ^
常常跟上述的專有名詞physical address or virtural address交互使用. d  U9 V5 B+ l) J, ^# M8 {/ ^0 Q( Z
例如刻板印象的『作業系統處於kernel mode時,使用physical address』6 J' `6 _# c4 O
經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問
, O( M- Q" m2 `1 s; F
4 Q$ X) _! I+ Q1 I那應該怎麼簡單來看待一個系統?! ?  r, g- G1 U: K

" N" Z3 F1 O' K" i' K- \" i首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』4 H) f/ {2 g* A' T  K- }
他是用來處理各種『資料』
# j, O# H1 Q' A9 A8 z$ S. a1 Y) t3 C& @, m3 [4 u' Z
那麼這些資料又放在哪邊?他是如何去存取這些資料?, h0 \* U. H# E5 w# \
( J9 a7 g- M" G$ M" [% N, J* ~
通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory
& n# _9 ?5 x+ ^+ i2 V$ Z: D  u/ T/ V& S4 u& e5 w5 f& b
到目前為止,我們得到一個簡單的系統 CPU + bus + memory8 _$ g) N) k) x  o
. Z* K# I  R$ w" o* d
接著,我們用兩個角度去看這個簡單系統的發展  ^( K: d. B1 @5 X0 Z5 z5 W2 t
1. 硬體加速# A: B2 B- D0 |( b
2. 作業系統
% g# ?3 z! Y' \; B: B; i
! P. E3 u# B/ j! {$ t/ N我們先從硬體加速的觀點來看這個系統如何改進:
. j1 X& U/ M( M# \# X% _* k9 _' w2 u/ S. i$ ]) d4 S/ J
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)
/ H1 I$ G/ |$ _  Y放在某個地方,然後請你設計好的加速硬體去處理這些資料
* b  K3 D" b$ W* T5 t可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。
5 ^/ t. c! O- z+ [+ P這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。& j  y2 N4 Z' ^* x1 j( ]

9 _/ y, p0 v$ ZCPU + arbiter bus + memory + DMA
( b9 z# P, U5 n2 N( j! o* @( a. h( S8 ?/ Z6 b- H; n
接著我們從作業系統的角度來看:6 H' I6 F; G0 d# [  _' Y) B8 ?3 D

4 b0 B! M8 M, r: H, b一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。' k% `5 @2 i- F3 T, [
3 Z# ~# c4 r) [: S. b
例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。
9 c- l9 F' O! I- @" g8 J4 T0 h3 Q6 J9 V" a; D5 L( Z, [
到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。
1 V" M7 ?/ K2 M, |" R, V# s
$ f7 v; J/ ?  N, e0 q所以我們的系統變成了+ {) c8 S* t2 U6 W& K+ i& m

; D% W+ l  I5 [# N: U0 j4 A; E4 B9 {multi-mode CPU + MPU + arbiter bus + memory + DMA$ v3 C# g! d! a8 ^; G3 X7 F
! L& y8 K  g, w0 l2 x* a
因為字數限制,部分貼到回文當中  =)

評分

參與人數 1Chipcoin +5 收起 理由
jacky002 + 5 言之有物!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-7-31 13:43:33 | 只看該作者
接著我們看virtual address和physical address的誕生,這邊相當抽象,需要一些想像。
- y$ P; T: `, l* U3 t4 S5 P
4 Q5 ?" r$ a6 ^. I8 M隨著時代進步,越來越多user program產生,user mode的program目前雖然已經不會因為隨意的存取記憶體,造成OS掛點,可是還是有可能去改到別人的記憶體,因為每個程式共同擁有並使用同一個記憶體和所謂的記憶體空間。/ I: p/ |( }9 }+ Z: h* J. a

% I# V; ?! _4 k4 U' \  v例如:程式A放在0~128 KBytes,程式B放在512~768KBytes,程式A寫錯位置到B程式的地方,變成程式B毀損,B程式就掛掉了。
+ q) B! C. d: T- g! O9 C
' Z# r5 U& Y( U7 M6 o上述的記憶體使用情況,不僅給programmer帶來困擾,而且變成記憶體必須被事先決定好誰只能用哪邊?只能使用多大?這樣不但得事先規劃,對於記憶體的使用也不是很高,因此MMU的硬體便被提出來。
  w8 @6 v; _) R6 H, F  s
2 |2 `7 ^* K7 ]) Z: |0 t簡單來看,MMU記錄著某個虛擬位置所對應到的實體記憶體的位置。4 n: M1 X% {0 @  ^! p
" b* x1 x( k/ U: G7 }1 L- b
作業系統利用這個特性,為每一個user program先做了一個假的記憶體,每個程式都以為他有很大很大的記憶體空間,其實當程式呼叫malloc的時候,才會去設置MMU將這個user program的假記憶體空間和真實記憶體做個連結。這邊很難解釋清楚,其實每個程式都有一個假的記憶體空間的紀錄表格,當OS做context switch到某個program的時候,MMU也會跟著切到這個table上,以便用到正確的紀錄表格。% C- V: S* Q, r) d* I+ b7 g

; s. D3 o1 F! u例如:
+ J9 c- c6 V0 ~+ d: R, s/ d4 y$ L$ }& q& y
, r" d" z% L. e3 e4 B程式A的表格記錄了他配置0~4K,而這4K對應到真實記憶體的128K~132K的區段。# _: v6 q% ~2 Z4 x3 }( i
程式B的表格記錄了他配置0~4K,而這4K對應到真實記憶體的132K~136K的區段。. E1 W4 t) w. E8 n7 d

# U+ |$ |* o6 Q) P% h0 t雖然兩個程式自己都以為他是用到0~4K,可是其實真實記憶體所配到的位置不同,作業系統在切換的時候,會同步將虛擬記憶體的紀錄表格做切換,以便使用到正確的對應表。以上是一種例子,各種OS可能採取的設計方式不同,但是概念大多是一樣的,我們可以看得出來,對每個程式來說,它可以有擁有許多假的連續記憶體空間,對程式撰寫,還有記憶體使用率來說,很有效果。/ D$ \6 y# G7 J& B

$ @: ^1 p6 v( b/ ~到此,CPU多了MMU,現在大多包含MPU的功能。0 Z+ a- }7 U  z/ d; B( q" Y

3 z2 b# f7 u' h- F2 A9 nmuti-mode CPU + MMU + arbiter bus + memory + DMA  X% L7 N& v: v) Y8 X" @

: [: _9 B3 W7 N1 ?  y" s因此OS在kernel mode的時候,如果MMU是打開的,這時候還是使用virtual address。7 Z1 Y0 o8 C4 E' p8 H7 {1 u

( y: h! o, c% f. R! k要讓mmu正常工作,必須要設定,要讓他知道你對位址的規劃是如何。% H9 m6 Q8 _, o- ]$ M; v
* Y" D/ S* d* ]
例如:RAM被硬體人員安排到0xFF00 0000的位址,可是你希望RAM被當成從0x0開始,你就可以設定MMU將 0xFF00 0000 對應到 0x0,這樣一來你讀取0x0就會自動轉到0xFF00 0000那邊去。: h3 ]" L# F& z" w% L6 j  z

* ^2 `# }! p: R0 j" S0x0000 0000 --< mapping >-- 0xFF00 0000
+ ^- i! x5 S8 [' d. N% @0 V& S
7 j. b- L, P2 u( j9 R& y+ S作業系統一開始就會初始化這些位址轉換對應的資訊,把它放在所謂的page table裡面,然後把table位址交給MMU,MMU就會依照table的資訊工作。
* E+ t  L0 Y: ~" J" j& s8 Z6 b$ ]$ l- `# l* I. W% L# E# y
假如你今天有兩張table,兩張table設定不一樣,MMU只要在這兩張table之間切換,那記憶體對應的方式也會跟著換。" Y; i9 J+ X6 {: Y1 R- q3 o  `0 N
8 _4 a4 C3 u8 d( a! W
這是一個很重要的想法。假如,我每一個process都有自己的 page table,切換process的時候,table也跟著切換,這樣我可以控制每一個process去存取記憶體的方式。假如我是讓所有的process 都共用一個 table,這樣這個table的設定值,就會影響到所有的process。  T6 a8 u+ h% I3 s/ D
$ h+ h3 S4 l5 G& k0 B* M
共用一個table表示每個process用同一個位址去讀寫,透過MMU轉換到的位址是相同的,會讀寫到同一塊。不共用的話,表示processA和processB即使拿同一個位址0x8000 0000去讀寫,可能最後對應到的位址是不同的。
6 p1 L, I  d2 G' q# V
/ }; q5 r% D8 P5 I但是這樣的差別就是有什麼好處??1 ^6 v" s# Y+ D; e

5 p9 Q! t4 n; @4 o, w因為感覺上複雜化了整個系統,本來我可以很直覺的拿processA傳給我的位址,去讀取它為我準備的資料,現在我可能會因為我使用的 table 不同,就不能在其他process直接使用。感覺很麻煩,要是大家都在同一個 table 工作,不是很簡單嗎?位址空間都是一樣的。
9 p. p& E8 H) F& ~
( y' Y6 V7 W4 q  o5 n7 y* Xwhy?!
0 O1 X' P. p- Y2 l& c* a. `/ S6 ^( @+ t3 Z1 }( U3 w' {
字數又超過啦~   
3#
 樓主| 發表於 2008-7-31 13:46:10 | 只看該作者
一、3 D9 U0 f0 ?2 P
如果大家都在同一個page table上, @  Q8 L  S! H/ `- ~) T: m
因為彼此用的記憶體應對方式是一樣的
' e; T- g4 q/ }  b- m所以processA要了某個區段 0x0~0x1001 n' R" e1 w4 Y" @+ ^
這樣processB就不能使用
3 n6 K1 M+ [/ B. P1 `很可能跑了一段時間之後整個系統的memory fragment就會變多
7 s& n% ]+ s5 K7 I0 {對記憶體使用率來講不好% {  q6 q* E( ]% L- t1 D3 n
很可能要一次找到大塊的不好找" e3 |! Y' b. o( @2 b8 ?+ o
雖然virtual address有4G但是process分一分+ ^7 P& F- I5 _7 T
還是可能不太夠3 h+ z" \+ M4 z' `1 B$ I- \
5 X: i2 r9 \0 t  t& p. t
二、
% m4 C& H6 Y8 j9 Q" tprocessB可以看到processA的address space; r' V5 Q+ @) ]4 ~+ g+ i9 y: E: W
表示我可以拿到相對應的資源& V. u: F5 B1 t/ c
這樣惡意程式很容易就得到一些記憶體上的個人資料2 \* g# T5 m" Z  E& I* _; L

0 S0 u- {* k2 F/ C+ Z2 b有些地方的說明不太容易,太簡略容易造成誤解,贅述又怕不容易" w" e" Q# O6 X, f& k
理解。沒表達清楚的地方歡迎提出來討論。

評分

參與人數 1 +1 收起 理由
card_4_girt + 1 讚許大大的經驗交流!希望您再接再厲啦!

查看全部評分

4#
發表於 2008-7-31 20:44:39 | 只看該作者
希望大大以後多多發表文章.2 c, O9 _/ [* Q3 L- f; L
透過大大生動的描述.很多複雜的概念就淺顯易懂了.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-11-16 07:03 AM , Processed in 0.163009 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表