Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

從system bus來看系統

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-31 13:36:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
有些基礎不夠深厚  遣詞用句也不是很精確6 e' G$ K) {8 P( I4 }& n
以下試圖以自己的體認和觀點  以簡單的辭彙
" H+ a0 K9 v" ~+ _去解釋一些process與系統演進的方式
. h8 ?* G3 e0 [, w, z如果有誤或是清楚的地方  歡迎大家討論
, I7 G5 f9 P- t$ n+ Z: n% M# g  ~7 _. W2 x7 s& ^# r. @
[本文開始]
3 z- t, u$ j* t& p5 q6 d在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候
$ B; R5 J- Q& E' B, b常常會被一下子多出來的專有名詞搞混3 G& r; r& W4 U# [8 l$ B
像是DMA, memory, cache, mmu, virtual address, physical address 等等  o; v" X* X6 }" v+ ]5 }: X. F- N1 k
尤其大家一開始接觸電腦都是已經發展很久的x86系統9 D7 l" \6 v2 Z; [/ C7 Z/ D
即使有單晶片系統的實驗課程4 b# K$ c! ~5 @3 r; d1 G2 ~; ~! Q4 B
也很難將單晶片的經驗
# l9 W  {3 ^. J2 U% k運用到x86或是已經較為複雜的CPU系統上! y$ s9 `. H  V7 j* g
5 T! n4 x$ W( c4 a/ h! Z, c, X
因為CPU上頭又開始加入了越來越複雜的作業系統+ K6 O6 f; ?% `* M$ Z6 T
像是作業系統常提到的kernel mode, user mode
+ W6 E% i+ L/ V* @' l常常跟上述的專有名詞physical address or virtural address交互使用
/ W* h; ^9 }- W" q; m例如刻板印象的『作業系統處於kernel mode時,使用physical address』
, ~4 h6 x/ E8 F+ [經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問6 o0 n. w  T( ~1 V: m/ S1 I. L" e
( }$ V5 l& ?9 M9 y, Z
那應該怎麼簡單來看待一個系統?3 w6 ?% r; |  r" f2 Z, x

( g  ?* Y, c( {1 U首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』
+ l" z: L* [" W& `他是用來處理各種『資料』% p# g: D. b/ n) u/ e

6 B5 x$ e  u0 v% H% I9 D那麼這些資料又放在哪邊?他是如何去存取這些資料?
0 v) G9 Z  S3 A" [6 v9 D
, |3 j6 C, b1 _+ S0 j0 B通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory6 X1 i: R! b& a* u" w6 D: Q8 w; w% k
+ M( m! @' ]; Z
到目前為止,我們得到一個簡單的系統 CPU + bus + memory4 K. ]  @! O& B" H9 I
; i0 c, Z- Z- x) j8 `8 Y3 ~' U. m
接著,我們用兩個角度去看這個簡單系統的發展; b9 B- n" _! o* T2 P/ z; b! ~8 V
1. 硬體加速
4 s* g2 Y$ ]2 D- R3 I( y8 U& \6 K2. 作業系統$ x/ ?2 M' c6 E0 J$ v' P. q7 i
7 y0 V2 y1 Q, I+ `- v3 V# `1 n
我們先從硬體加速的觀點來看這個系統如何改進:
8 v; B3 O) @4 k7 l# C
# k: y" H, `5 z3 M' I' T首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)% Z! s* w* O  u6 s( K# @/ @
放在某個地方,然後請你設計好的加速硬體去處理這些資料1 A, j) }; e' W& n  b. L% y' t
可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。
3 f. }, L) C9 u這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。* E: }+ X" g2 ?$ K6 \

7 G# C2 S$ O7 z0 lCPU + arbiter bus + memory + DMA
$ m: F+ x! ?  K  k3 c, G- x0 R
; b/ T5 w' ^5 @* O# ]% O, y4 ^接著我們從作業系統的角度來看:
* {! i+ N8 y" ~1 x' L; g$ h$ S7 r- h
一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。
( E3 Y' m5 f5 U3 D6 F3 C, z  C* o1 i8 H9 ~0 e
例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。' g$ {. w. x+ F

1 A1 S4 q' |" D/ {1 k& X2 m到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。
3 b* D8 Q2 V& G) n& p% N3 y
; v( F  U5 Y+ M7 S. }3 a6 V: E所以我們的系統變成了, r, c5 i( S1 |: C4 `
! o" V% |1 \& |
multi-mode CPU + MPU + arbiter bus + memory + DMA& w, D# a8 z9 k. K* [7 i4 [+ z

2 [  O" W; H* r, |! y# @3 `因為字數限制,部分貼到回文當中  =)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-7-31 13:43:33 | 只看該作者
接著我們看virtual address和physical address的誕生,這邊相當抽象,需要一些想像。& R; a+ N% O: t8 t/ _
- L" K/ R  R- ^  d. S) j
隨著時代進步,越來越多user program產生,user mode的program目前雖然已經不會因為隨意的存取記憶體,造成OS掛點,可是還是有可能去改到別人的記憶體,因為每個程式共同擁有並使用同一個記憶體和所謂的記憶體空間。
- a7 D( y" C- I) d: ^1 l: \% d# Y; H5 S5 u/ l. \3 z( y! d$ L
例如:程式A放在0~128 KBytes,程式B放在512~768KBytes,程式A寫錯位置到B程式的地方,變成程式B毀損,B程式就掛掉了。0 R( s, M  v7 K/ e& F$ e
" Y+ I1 `7 R7 `1 S' F' u
上述的記憶體使用情況,不僅給programmer帶來困擾,而且變成記憶體必須被事先決定好誰只能用哪邊?只能使用多大?這樣不但得事先規劃,對於記憶體的使用也不是很高,因此MMU的硬體便被提出來。
6 g% ^+ I/ ~9 {
3 `' b! l1 Q8 G0 b6 D# @* p簡單來看,MMU記錄著某個虛擬位置所對應到的實體記憶體的位置。; B7 L3 n& O, w/ I; Y7 a2 y
% a4 Q9 c! b/ S, h/ o, \/ s
作業系統利用這個特性,為每一個user program先做了一個假的記憶體,每個程式都以為他有很大很大的記憶體空間,其實當程式呼叫malloc的時候,才會去設置MMU將這個user program的假記憶體空間和真實記憶體做個連結。這邊很難解釋清楚,其實每個程式都有一個假的記憶體空間的紀錄表格,當OS做context switch到某個program的時候,MMU也會跟著切到這個table上,以便用到正確的紀錄表格。: ?- p$ V. }+ n

' q3 s4 @. \* {# u3 u例如:: m+ G% e5 n# {( C8 W, _; ]
9 G, w% G: B+ P: {# M
程式A的表格記錄了他配置0~4K,而這4K對應到真實記憶體的128K~132K的區段。7 A& F; t. G# h
程式B的表格記錄了他配置0~4K,而這4K對應到真實記憶體的132K~136K的區段。3 p% |) E5 R4 |" m* z# k

3 g' \) t( q& c7 r$ Y; b. k: [雖然兩個程式自己都以為他是用到0~4K,可是其實真實記憶體所配到的位置不同,作業系統在切換的時候,會同步將虛擬記憶體的紀錄表格做切換,以便使用到正確的對應表。以上是一種例子,各種OS可能採取的設計方式不同,但是概念大多是一樣的,我們可以看得出來,對每個程式來說,它可以有擁有許多假的連續記憶體空間,對程式撰寫,還有記憶體使用率來說,很有效果。
- u! c6 F% Y2 w& K" G
4 H! P2 x. G+ `& B; m, F3 }到此,CPU多了MMU,現在大多包含MPU的功能。+ F% ~3 _7 W1 e3 D$ F
& v# o! G7 e- ]  ~) C
muti-mode CPU + MMU + arbiter bus + memory + DMA. S. X" i* \9 v# c
8 I1 ?1 w4 v# i, Y
因此OS在kernel mode的時候,如果MMU是打開的,這時候還是使用virtual address。
4 o* t: P+ |4 s- q+ e& v7 ]: c9 H7 d- e8 `' z- v: N" O% S9 t; I
要讓mmu正常工作,必須要設定,要讓他知道你對位址的規劃是如何。
* u; Q' C; |! l) m0 z- {* w0 }/ D! z/ n5 ^3 A/ G
例如:RAM被硬體人員安排到0xFF00 0000的位址,可是你希望RAM被當成從0x0開始,你就可以設定MMU將 0xFF00 0000 對應到 0x0,這樣一來你讀取0x0就會自動轉到0xFF00 0000那邊去。
8 [" o7 C' F7 T4 {* V1 k/ a# W, Q, q4 ^5 H- G' u! R
0x0000 0000 --< mapping >-- 0xFF00 0000. w4 J8 K8 |% F# L8 [* m/ Q' F8 i* k

! `9 _$ Q9 A$ H) w) h# ?( G作業系統一開始就會初始化這些位址轉換對應的資訊,把它放在所謂的page table裡面,然後把table位址交給MMU,MMU就會依照table的資訊工作。. i2 C" D0 r; m& ?
6 d* h3 d: b$ p; s; Z1 b% ]1 V
假如你今天有兩張table,兩張table設定不一樣,MMU只要在這兩張table之間切換,那記憶體對應的方式也會跟著換。
) W6 X% v' q0 u) T7 W; b0 A0 S5 {- V1 y6 R
這是一個很重要的想法。假如,我每一個process都有自己的 page table,切換process的時候,table也跟著切換,這樣我可以控制每一個process去存取記憶體的方式。假如我是讓所有的process 都共用一個 table,這樣這個table的設定值,就會影響到所有的process。5 B6 Y, z: Z5 A7 b6 l8 L3 G* V
2 T  p% T' A6 d' F. \  S  q
共用一個table表示每個process用同一個位址去讀寫,透過MMU轉換到的位址是相同的,會讀寫到同一塊。不共用的話,表示processA和processB即使拿同一個位址0x8000 0000去讀寫,可能最後對應到的位址是不同的。
$ P- X. W: _- `) Q$ K. _! s& i8 Q% I3 D/ r0 r5 r5 d; ^$ ?' I+ D
但是這樣的差別就是有什麼好處??; C, t, i  }7 _& j2 j

: B" w* W" Q# `- i8 U& J! F: I因為感覺上複雜化了整個系統,本來我可以很直覺的拿processA傳給我的位址,去讀取它為我準備的資料,現在我可能會因為我使用的 table 不同,就不能在其他process直接使用。感覺很麻煩,要是大家都在同一個 table 工作,不是很簡單嗎?位址空間都是一樣的。
- s/ i& e! j' m# a9 b" Q
- y  P, G9 V# kwhy?!6 g6 ]6 c2 A4 v9 \- z. ]! m, V! }

; x! p& A( H) s4 _字數又超過啦~   
3#
 樓主| 發表於 2008-7-31 13:46:10 | 只看該作者
一、, d' k$ g' W; _& l8 P; @
如果大家都在同一個page table上
5 |, v7 i9 D7 L: h3 j6 B因為彼此用的記憶體應對方式是一樣的
6 g$ Q& h3 H' U  \7 J9 G所以processA要了某個區段 0x0~0x100
* g0 S6 V! m4 P7 e1 h+ G$ F這樣processB就不能使用5 x2 w9 G& X/ x2 ~, l& n
很可能跑了一段時間之後整個系統的memory fragment就會變多
6 K/ }3 ~% P! w1 m$ Z對記憶體使用率來講不好
* {0 n. y4 x5 n& f. Z+ Z很可能要一次找到大塊的不好找0 |7 [, p7 t" Y5 J+ {1 w
雖然virtual address有4G但是process分一分
; ^; f$ w/ [( f, L- ^7 }還是可能不太夠! K* j) }7 ?7 J% [1 x

7 W* U) w( Q& L) Y二、% x" p8 e; `& M4 ~1 P0 \
processB可以看到processA的address space
( L' t9 z- S6 B! n$ O表示我可以拿到相對應的資源' N( W( m: o( q5 O4 l) \
這樣惡意程式很容易就得到一些記憶體上的個人資料
# {) F6 ^& W/ g- d# N1 Q/ |* [7 b; [- L9 ^3 Y
有些地方的說明不太容易,太簡略容易造成誤解,贅述又怕不容易; }6 n! i2 {, E' l4 U# a' O& o
理解。沒表達清楚的地方歡迎提出來討論。

評分

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

查看全部評分

4#
發表於 2008-7-31 20:44:39 | 只看該作者
希望大大以後多多發表文章.8 X3 r3 ?  y5 [# n$ ]0 C; W
透過大大生動的描述.很多複雜的概念就淺顯易懂了.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-21 01:28 PM , Processed in 0.170009 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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