Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

從system bus來看系統

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-31 13:36:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
有些基礎不夠深厚  遣詞用句也不是很精確
5 W' B  U0 R% u% K以下試圖以自己的體認和觀點  以簡單的辭彙
) M( R% X( ^- m7 {; z% i去解釋一些process與系統演進的方式
8 d9 A4 z* o# Z1 o如果有誤或是清楚的地方  歡迎大家討論
! r5 x( d) D0 }( K! ]6 P. o$ L3 Y; ?
[本文開始]# S7 X$ [! F, |: f
在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候
& h% O+ P, F  j8 W常常會被一下子多出來的專有名詞搞混
+ S. j) n3 z1 U; \1 u) X. {像是DMA, memory, cache, mmu, virtual address, physical address 等等
; y( a2 K- N$ U1 O) n6 P尤其大家一開始接觸電腦都是已經發展很久的x86系統" X! @* ^% K2 F
即使有單晶片系統的實驗課程7 @4 L! c2 M$ R. [- }- H. s# W- F
也很難將單晶片的經驗& [6 r' l3 K6 m) x5 |2 S" p. ~. r% X
運用到x86或是已經較為複雜的CPU系統上/ U" e1 g2 }( m- y
# x, n  z. e" [  x; y9 B! T
因為CPU上頭又開始加入了越來越複雜的作業系統
) k6 G1 Q; @; r' K4 L6 p% h7 O像是作業系統常提到的kernel mode, user mode# J0 Q2 _  ~! x! W, X
常常跟上述的專有名詞physical address or virtural address交互使用; X2 n4 V1 [$ G& ?" B  E: e' D+ z
例如刻板印象的『作業系統處於kernel mode時,使用physical address』6 q4 [8 ?6 W) [$ a- l6 P
經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問8 E* s& ]1 b8 Z2 r7 i6 E) u  I. x
) x7 U9 e: K* y# d) J
那應該怎麼簡單來看待一個系統?/ Z. q7 p6 {: k, G) y: b
4 v7 b8 b( E# `* w& I
首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』- R: m: M& o9 T8 \# Z( P
他是用來處理各種『資料』& k& j* n( X: C

* g1 q5 q* E8 [& g- a) q+ a0 }. z那麼這些資料又放在哪邊?他是如何去存取這些資料?
/ C6 b0 T7 v, |9 x7 o+ f/ E; _0 n4 C4 _# p7 a6 ?. g
通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory3 `: q5 e, E' p" F1 O; B

* f' ~6 e. A# f$ X( j" C到目前為止,我們得到一個簡單的系統 CPU + bus + memory; `2 g8 J9 \* }7 y
1 j/ ]9 l4 O0 Z7 {2 x5 U/ c
接著,我們用兩個角度去看這個簡單系統的發展4 r( U. m, t9 G: q! {$ H3 x: f' K2 A
1. 硬體加速% f, F: ]8 w% j- R" Q" I! _8 y
2. 作業系統5 F9 [0 x, x' ^; `0 l2 O- b7 e3 ?

5 C$ C" M5 v* @3 d7 w* h我們先從硬體加速的觀點來看這個系統如何改進:9 }/ X) b! Y1 G' ^; I4 ]* J
2 G( Q0 @4 a" E( A' @
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)1 r; }  c$ _6 [6 l! R1 d5 v: y
放在某個地方,然後請你設計好的加速硬體去處理這些資料
6 e0 [# y3 k% w/ Z+ |6 p& a可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。3 s: C. m1 H" D) z0 I  D
這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。7 s' |0 K- m" ?# F+ J

! i4 U+ x8 l9 a% zCPU + arbiter bus + memory + DMA
& V6 p; g+ ?5 M0 T* v; H3 t( l% y5 L7 s0 W) k4 h
接著我們從作業系統的角度來看:
# N- H9 g+ K7 g, \' G3 g- a
4 Z$ |  j; Y& C# K& e* @3 F一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。
* y+ T  W  |) g: E/ K7 g" S
1 }. ^3 ~' S  z1 g# M/ Q* ~( y例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。$ N# ?, S3 R. h6 X, Y" Z

% o/ W+ G; N8 g$ X6 b到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。, q8 E1 O( J2 ]$ Y
- H# m" q. g" _% V4 U- Z
所以我們的系統變成了
. Z6 F, A4 S: ^- E
% j3 p6 A0 L4 h$ H4 vmulti-mode CPU + MPU + arbiter bus + memory + DMA
% z* Z' _8 G& R* B5 M
6 q( e( Y1 C( ]' Q因為字數限制,部分貼到回文當中  =)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-7-31 13:43:33 | 只看該作者
接著我們看virtual address和physical address的誕生,這邊相當抽象,需要一些想像。
. Z5 S! w! ?( b& ]2 C8 y6 K) r5 E
隨著時代進步,越來越多user program產生,user mode的program目前雖然已經不會因為隨意的存取記憶體,造成OS掛點,可是還是有可能去改到別人的記憶體,因為每個程式共同擁有並使用同一個記憶體和所謂的記憶體空間。
4 T' s$ r/ N( i% I7 f% r/ f
( B+ S6 d$ e" G; M: z/ u例如:程式A放在0~128 KBytes,程式B放在512~768KBytes,程式A寫錯位置到B程式的地方,變成程式B毀損,B程式就掛掉了。! M  ?% a8 k8 F) ?0 i

9 g. e) s( w+ D: ]9 f( u1 _上述的記憶體使用情況,不僅給programmer帶來困擾,而且變成記憶體必須被事先決定好誰只能用哪邊?只能使用多大?這樣不但得事先規劃,對於記憶體的使用也不是很高,因此MMU的硬體便被提出來。+ H5 E, e  z' d9 ^. _  q) w5 ]
! |( i- O% C; _6 V8 K* W6 ^+ g
簡單來看,MMU記錄著某個虛擬位置所對應到的實體記憶體的位置。
7 E% F( ~! ?3 q' x' p  Q* s- Z0 b5 u' ~
作業系統利用這個特性,為每一個user program先做了一個假的記憶體,每個程式都以為他有很大很大的記憶體空間,其實當程式呼叫malloc的時候,才會去設置MMU將這個user program的假記憶體空間和真實記憶體做個連結。這邊很難解釋清楚,其實每個程式都有一個假的記憶體空間的紀錄表格,當OS做context switch到某個program的時候,MMU也會跟著切到這個table上,以便用到正確的紀錄表格。
2 Y* d- G  I* Z) R/ V$ l, Q3 k+ ?3 q, R9 t, M  n% l7 e+ q# J4 J
例如:; x& S+ ~/ }* n8 ^0 a( E; k2 N

+ U6 J5 \/ t* D* l& H  h程式A的表格記錄了他配置0~4K,而這4K對應到真實記憶體的128K~132K的區段。  _  T3 @# B" ~7 O( h2 D! k
程式B的表格記錄了他配置0~4K,而這4K對應到真實記憶體的132K~136K的區段。
4 _2 _1 F5 C  e
/ }% u. H, w  [/ Y$ w  M' \雖然兩個程式自己都以為他是用到0~4K,可是其實真實記憶體所配到的位置不同,作業系統在切換的時候,會同步將虛擬記憶體的紀錄表格做切換,以便使用到正確的對應表。以上是一種例子,各種OS可能採取的設計方式不同,但是概念大多是一樣的,我們可以看得出來,對每個程式來說,它可以有擁有許多假的連續記憶體空間,對程式撰寫,還有記憶體使用率來說,很有效果。. P9 p+ y5 g3 A

6 V2 h; `; z5 E到此,CPU多了MMU,現在大多包含MPU的功能。: J4 {+ @% v2 R1 E$ Q6 ~' m

" g4 c3 y$ X6 b  D1 Mmuti-mode CPU + MMU + arbiter bus + memory + DMA& ^" C/ q# o' k) g( F  {

  a3 v% e# o0 z. J, m6 ?因此OS在kernel mode的時候,如果MMU是打開的,這時候還是使用virtual address。5 |5 a' H2 M' Q& m, X& [  C" F

6 e* R, n* X  j* }$ u$ v要讓mmu正常工作,必須要設定,要讓他知道你對位址的規劃是如何。# e+ `4 G) D8 Z
6 w0 G3 o+ c" w8 r( z/ q+ B
例如:RAM被硬體人員安排到0xFF00 0000的位址,可是你希望RAM被當成從0x0開始,你就可以設定MMU將 0xFF00 0000 對應到 0x0,這樣一來你讀取0x0就會自動轉到0xFF00 0000那邊去。
- v, A5 L4 y% Y. j$ i& l9 X' \# a8 l
0x0000 0000 --< mapping >-- 0xFF00 00005 T/ L8 m3 ?. K1 y' `# _% o" ^3 A

. y- a; N1 h" `4 q9 n( q: q# v作業系統一開始就會初始化這些位址轉換對應的資訊,把它放在所謂的page table裡面,然後把table位址交給MMU,MMU就會依照table的資訊工作。
+ M$ H. H# G1 p6 j$ f( n, ]7 B/ b% W4 o" c' Z" D" \  A( f# e9 z
假如你今天有兩張table,兩張table設定不一樣,MMU只要在這兩張table之間切換,那記憶體對應的方式也會跟著換。
4 f) W: [" J6 B* Z: ?
+ G7 ~  u# m+ u, w. \1 {這是一個很重要的想法。假如,我每一個process都有自己的 page table,切換process的時候,table也跟著切換,這樣我可以控制每一個process去存取記憶體的方式。假如我是讓所有的process 都共用一個 table,這樣這個table的設定值,就會影響到所有的process。& C; t* y" {4 d2 A( b9 l6 i

0 L% |  a$ w! g/ _. p' G9 \共用一個table表示每個process用同一個位址去讀寫,透過MMU轉換到的位址是相同的,會讀寫到同一塊。不共用的話,表示processA和processB即使拿同一個位址0x8000 0000去讀寫,可能最後對應到的位址是不同的。
. O# r3 L$ {( v3 \& J/ u& _! N- u) k" v5 v6 f
但是這樣的差別就是有什麼好處??: Y2 u- b' E7 h6 N' W
, R" K4 t8 m4 W$ `- r5 T! T
因為感覺上複雜化了整個系統,本來我可以很直覺的拿processA傳給我的位址,去讀取它為我準備的資料,現在我可能會因為我使用的 table 不同,就不能在其他process直接使用。感覺很麻煩,要是大家都在同一個 table 工作,不是很簡單嗎?位址空間都是一樣的。
3 M& V* z. L" _; F# E( _1 y  a, {. s' N7 i: i% H8 C
why?!
, f. r' f  e, M! n0 d6 f3 o5 [
4 Z' \1 G+ r, }0 f字數又超過啦~   
3#
 樓主| 發表於 2008-7-31 13:46:10 | 只看該作者
一、
  e* x/ i, l- K6 \如果大家都在同一個page table上
; f2 M, [' A: B# M, ^2 A因為彼此用的記憶體應對方式是一樣的) p% O9 a$ V% k! V
所以processA要了某個區段 0x0~0x1001 G1 ~6 ^- o8 {6 N( h
這樣processB就不能使用' M) b6 a  E; W
很可能跑了一段時間之後整個系統的memory fragment就會變多
: X( q0 g1 x1 ?! f8 o對記憶體使用率來講不好
. i% R( V3 Z% ]" K很可能要一次找到大塊的不好找8 e: J0 P  p2 o' n' V% R
雖然virtual address有4G但是process分一分& ^0 V$ H4 l( O9 U4 M, \
還是可能不太夠
/ T6 w: l+ p8 W( K8 D* q1 \$ ?! G0 c
5 R+ ~# U6 j) u2 F二、
- [0 m6 H+ f8 m4 I5 xprocessB可以看到processA的address space
( m- {; v* L% A* m' J2 d6 W& r表示我可以拿到相對應的資源3 V( T' x* v4 z: L6 ^9 [
這樣惡意程式很容易就得到一些記憶體上的個人資料
5 l4 B: E# i+ E' F* U& ~: B, z3 h9 S/ z' q' ^! o
有些地方的說明不太容易,太簡略容易造成誤解,贅述又怕不容易, B" H- `% P) }; k3 N
理解。沒表達清楚的地方歡迎提出來討論。

評分

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

查看全部評分

4#
發表於 2008-7-31 20:44:39 | 只看該作者
希望大大以後多多發表文章.: Z# o4 F7 M) l
透過大大生動的描述.很多複雜的概念就淺顯易懂了.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-21 03:55 PM , Processed in 0.176010 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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