Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

從system bus來看系統

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-31 13:36:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
有些基礎不夠深厚  遣詞用句也不是很精確. z+ ?) k1 {' c# |* c+ I3 l  p
以下試圖以自己的體認和觀點  以簡單的辭彙$ F" j% Q: _( d5 w( R, z
去解釋一些process與系統演進的方式2 n8 P$ d  x7 Y9 v* s* z
如果有誤或是清楚的地方  歡迎大家討論
' v4 e  ~; d+ [8 ^1 t, H
' Y. \# |# k+ G0 C2 a6 J[本文開始]
4 p- d6 d& ~: z- K4 k9 E在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候8 i& @" Q; p7 h$ k
常常會被一下子多出來的專有名詞搞混3 X* _8 I5 ^0 w$ \
像是DMA, memory, cache, mmu, virtual address, physical address 等等, k$ I2 s& m+ n% X1 z
尤其大家一開始接觸電腦都是已經發展很久的x86系統8 e( h+ {2 |, P! G) p
即使有單晶片系統的實驗課程$ N; c5 \, g) M7 w2 A
也很難將單晶片的經驗- d$ g4 x* I! v) u1 T: e
運用到x86或是已經較為複雜的CPU系統上4 a, J  P8 m5 W* M7 X) N! W! F# r

5 T* N  {6 G" J; D- B! u( {3 w因為CPU上頭又開始加入了越來越複雜的作業系統) x0 J/ B# m; e5 B& B
像是作業系統常提到的kernel mode, user mode
) y2 H; Z2 J' E- M6 U% I- F常常跟上述的專有名詞physical address or virtural address交互使用( p3 M" ^" p% M1 }1 B; B( z
例如刻板印象的『作業系統處於kernel mode時,使用physical address』
% m* W- g, q& N經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問" h6 q- d" f' u3 c+ J% w7 p
0 z- Q# c6 C: w, }8 T
那應該怎麼簡單來看待一個系統?% w& \. m5 k4 F/ v- [6 ~! L
) M: Z* ]+ @' O
首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』2 N6 s- ~' |4 o
他是用來處理各種『資料』
8 h  [' h4 }8 T1 [/ W6 }( @: I, b) e# Y' a
那麼這些資料又放在哪邊?他是如何去存取這些資料?2 l* p* o1 Q0 D
/ e/ v" \( U: s
通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory
; e$ A4 J2 w( P; X  O  d
" b" E  H5 h! [# T* }' w到目前為止,我們得到一個簡單的系統 CPU + bus + memory5 J4 `; G! O* f) b

: j% I& _& t7 M4 `: t接著,我們用兩個角度去看這個簡單系統的發展  `$ u# N2 f+ q
1. 硬體加速
; b6 {2 |  p5 b; ~) h  t2. 作業系統% w3 ?$ b# L# `7 p& t
3 F: [5 n  d% u' N
我們先從硬體加速的觀點來看這個系統如何改進:2 h$ `" e4 `/ Q; v3 W) V
& v& F6 v' c* W3 [8 D3 W; d+ Q
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)/ v3 ^. y2 T. N* k$ N
放在某個地方,然後請你設計好的加速硬體去處理這些資料
0 s/ W8 k, w' f8 a2 i2 I1 r$ f可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。
# c. A$ j+ S6 t這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。
, G, J& E* f( [& s
7 Y8 I* `% F- Z! ^7 ZCPU + arbiter bus + memory + DMA! T" L4 s  m. y2 \
' J  u. ?  P! d8 C
接著我們從作業系統的角度來看:6 L& m* T7 N7 |% D0 |3 b
; }( p$ m& R. U
一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。
# R4 B$ u6 R8 z- c: o6 s3 P" c/ k, l" R7 @, ^0 ^$ o3 _
例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。4 k. M" o- F9 {

2 p. v! }- m0 ^7 V6 R% [9 A, _到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。
7 H( J( \+ G8 }2 W; Y+ E. w" }0 g6 P) V: W  E% f3 W
所以我們的系統變成了
3 _2 F8 U6 J- Z, i0 k2 K) M$ Q& h0 Q% ^9 _% H# m
multi-mode CPU + MPU + arbiter bus + memory + DMA
5 n/ a2 I0 e( p; g, T0 u% ^
6 G' _' Q; @; U* K5 u# f因為字數限制,部分貼到回文當中  =)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-7-31 13:43:33 | 只看該作者
接著我們看virtual address和physical address的誕生,這邊相當抽象,需要一些想像。
* q0 k+ V3 d; @9 k
& L2 ^; V' s- p- Y  J$ o隨著時代進步,越來越多user program產生,user mode的program目前雖然已經不會因為隨意的存取記憶體,造成OS掛點,可是還是有可能去改到別人的記憶體,因為每個程式共同擁有並使用同一個記憶體和所謂的記憶體空間。( V' c5 `9 q5 ^
" T. o' _& z0 _9 V
例如:程式A放在0~128 KBytes,程式B放在512~768KBytes,程式A寫錯位置到B程式的地方,變成程式B毀損,B程式就掛掉了。
  q0 F2 I6 b" ?9 n* s. @  Z5 P8 Z0 B2 B4 d- h5 |
上述的記憶體使用情況,不僅給programmer帶來困擾,而且變成記憶體必須被事先決定好誰只能用哪邊?只能使用多大?這樣不但得事先規劃,對於記憶體的使用也不是很高,因此MMU的硬體便被提出來。1 X/ \3 \" @7 i" S! Y/ K
. o( G% [+ q2 e6 ]% O2 `4 l
簡單來看,MMU記錄著某個虛擬位置所對應到的實體記憶體的位置。
! O) P2 c4 a; _$ k5 w7 _$ U7 C7 z! R7 F5 e) e% z0 m0 k4 u+ N
作業系統利用這個特性,為每一個user program先做了一個假的記憶體,每個程式都以為他有很大很大的記憶體空間,其實當程式呼叫malloc的時候,才會去設置MMU將這個user program的假記憶體空間和真實記憶體做個連結。這邊很難解釋清楚,其實每個程式都有一個假的記憶體空間的紀錄表格,當OS做context switch到某個program的時候,MMU也會跟著切到這個table上,以便用到正確的紀錄表格。) L: x$ r2 o( S6 V+ w

$ Z5 b5 T( v3 x8 j例如:
- c) @: Q2 Q& T" o& t- G4 ~. {6 ^5 o, e3 q+ `
程式A的表格記錄了他配置0~4K,而這4K對應到真實記憶體的128K~132K的區段。
9 _: d8 @. @7 x+ I; ?2 P程式B的表格記錄了他配置0~4K,而這4K對應到真實記憶體的132K~136K的區段。
& |: `) [7 ?, m( b- i+ L1 p% ~) D. A$ q" r: N0 h8 H
雖然兩個程式自己都以為他是用到0~4K,可是其實真實記憶體所配到的位置不同,作業系統在切換的時候,會同步將虛擬記憶體的紀錄表格做切換,以便使用到正確的對應表。以上是一種例子,各種OS可能採取的設計方式不同,但是概念大多是一樣的,我們可以看得出來,對每個程式來說,它可以有擁有許多假的連續記憶體空間,對程式撰寫,還有記憶體使用率來說,很有效果。
* h0 V, n' x; A6 {$ D9 h0 o, w
. |. G$ a+ x# R/ p( L1 g- ~3 d到此,CPU多了MMU,現在大多包含MPU的功能。$ F, ?, m" u1 N
# Z+ j9 i& G: M2 x/ \6 Y% ~' `
muti-mode CPU + MMU + arbiter bus + memory + DMA
# o; D' i: P. F0 G  A: Q2 m. z: R: X4 p) O7 f! {. b, B
因此OS在kernel mode的時候,如果MMU是打開的,這時候還是使用virtual address。7 @: \4 f3 u4 l* C

; T6 {0 e8 c, {要讓mmu正常工作,必須要設定,要讓他知道你對位址的規劃是如何。
. }! O) `7 d. q8 d1 a! o9 B; w6 c4 |: E# V" l
例如:RAM被硬體人員安排到0xFF00 0000的位址,可是你希望RAM被當成從0x0開始,你就可以設定MMU將 0xFF00 0000 對應到 0x0,這樣一來你讀取0x0就會自動轉到0xFF00 0000那邊去。: m5 E# ]8 ^; ?* d4 @8 b2 X" W

5 V, b  M. E7 O! c! d; \) R1 k0x0000 0000 --< mapping >-- 0xFF00 0000! c7 }- X. O6 `/ o& P
$ a+ \; s. U% G$ ]) I) T. b2 l
作業系統一開始就會初始化這些位址轉換對應的資訊,把它放在所謂的page table裡面,然後把table位址交給MMU,MMU就會依照table的資訊工作。
3 |& @" K% k% U0 y7 s
2 T1 `4 V. ^1 k* ]* t' e假如你今天有兩張table,兩張table設定不一樣,MMU只要在這兩張table之間切換,那記憶體對應的方式也會跟著換。
, g8 ~5 K4 o1 `& q! G8 ]: @1 _
8 `+ k# T, U" j# x6 [, A這是一個很重要的想法。假如,我每一個process都有自己的 page table,切換process的時候,table也跟著切換,這樣我可以控制每一個process去存取記憶體的方式。假如我是讓所有的process 都共用一個 table,這樣這個table的設定值,就會影響到所有的process。8 C) E/ t6 J" g6 V0 k! q
5 o* J5 ?  h0 V7 Q
共用一個table表示每個process用同一個位址去讀寫,透過MMU轉換到的位址是相同的,會讀寫到同一塊。不共用的話,表示processA和processB即使拿同一個位址0x8000 0000去讀寫,可能最後對應到的位址是不同的。* k1 }$ D* m: u
& q# B  l3 ?" r1 a6 t* }: e- B+ Z
但是這樣的差別就是有什麼好處??
9 u) {1 X$ D% a5 M  P) F' W7 S) `0 c, Z) {7 ]* x2 v
因為感覺上複雜化了整個系統,本來我可以很直覺的拿processA傳給我的位址,去讀取它為我準備的資料,現在我可能會因為我使用的 table 不同,就不能在其他process直接使用。感覺很麻煩,要是大家都在同一個 table 工作,不是很簡單嗎?位址空間都是一樣的。
, i9 y) n6 b( m% @' h
( D3 [/ `& U, q+ r: Gwhy?!3 D! {3 v3 v8 Q8 I% ~" L8 m1 }; {2 q
- c' N0 q' P4 E  u  E) i) M
字數又超過啦~   
3#
 樓主| 發表於 2008-7-31 13:46:10 | 只看該作者
一、
% A" E5 L' u# }* g9 ~如果大家都在同一個page table上
. ?: ?$ x: {/ [' U4 f0 _5 r) B% R/ n  V因為彼此用的記憶體應對方式是一樣的
) w) k# A! S8 r" T- A7 l+ B所以processA要了某個區段 0x0~0x100
/ A! J4 w7 \& ~) `: g- Q/ G這樣processB就不能使用( y0 W8 w" V0 k: b/ b
很可能跑了一段時間之後整個系統的memory fragment就會變多
+ b6 r+ [, J1 r( F/ O: s# ^1 R! H對記憶體使用率來講不好
# A- |( Z( a' y/ L. U4 k2 C很可能要一次找到大塊的不好找
. E* l4 w, I8 q& _雖然virtual address有4G但是process分一分+ k: A& c& w! L
還是可能不太夠
) m6 m- C' `& B: x6 q8 o5 g/ E8 m& v7 G3 P
二、
5 G. @2 `1 w* H' J9 hprocessB可以看到processA的address space- q# s3 \1 e$ j7 z4 ?- A. q1 |
表示我可以拿到相對應的資源- H7 \# `! y2 ]" h/ s0 t1 E' y; |
這樣惡意程式很容易就得到一些記憶體上的個人資料
4 g) R! {/ h6 L' W# q# {+ K/ I/ P4 Y, z4 m0 i- L
有些地方的說明不太容易,太簡略容易造成誤解,贅述又怕不容易
  ?7 \1 t+ L) p/ _7 M/ P理解。沒表達清楚的地方歡迎提出來討論。

評分

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

查看全部評分

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

本版積分規則

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

GMT+8, 2025-1-1 12:02 PM , Processed in 0.165010 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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