Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

從system bus來看系統

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-31 13:36:49 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
有些基礎不夠深厚  遣詞用句也不是很精確6 A7 }3 P) D2 C  e- E# S2 ^3 d
以下試圖以自己的體認和觀點  以簡單的辭彙
9 ~# w, ^; l$ N+ B, U0 Z去解釋一些process與系統演進的方式: h7 J; {* g' @, }2 C
如果有誤或是清楚的地方  歡迎大家討論9 l) T5 G& h# D' [; h( K6 j

) q5 t  a# v- k6 I[本文開始], m+ c* D$ n' `' `) c8 A
在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候7 t* B& T6 k! a+ q
常常會被一下子多出來的專有名詞搞混5 [. q3 \* F2 G& `2 F1 Y
像是DMA, memory, cache, mmu, virtual address, physical address 等等
1 _1 i7 B9 p$ F! |$ ]: {) h尤其大家一開始接觸電腦都是已經發展很久的x86系統
+ i) W! ]5 w9 r7 @$ I) `; I7 y, P即使有單晶片系統的實驗課程+ H5 z' x1 C& e! k7 U9 z/ J, J
也很難將單晶片的經驗% a/ c3 J. o; @
運用到x86或是已經較為複雜的CPU系統上
0 C6 i  _" }9 n- V6 l. ], I. A
% e) [! P% u) `: d, e: \0 h/ g因為CPU上頭又開始加入了越來越複雜的作業系統; Y: ]& T, Z4 g" @' U
像是作業系統常提到的kernel mode, user mode* g% ]+ Z3 t5 z6 H; j4 B' w& t0 N" G2 I
常常跟上述的專有名詞physical address or virtural address交互使用1 d' c) v' c' _& t' P
例如刻板印象的『作業系統處於kernel mode時,使用physical address』
" r/ |/ }9 Q% K: o4 {經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問8 i4 N/ L$ |7 W( {, L" K0 ?

; E2 p% S. B  j那應該怎麼簡單來看待一個系統?
6 b- v) j8 Y3 d- n  L6 C- a
  \( [  k/ ?3 H( n" b+ _  v9 C$ e7 ~首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』* _; l, j+ w2 j" R
他是用來處理各種『資料』
, g- a4 c0 D  }; d# Z/ L1 o0 w6 ?: z$ ?
那麼這些資料又放在哪邊?他是如何去存取這些資料?
* W; i/ Z' W6 Y6 ~. ]  ^" l$ J5 T5 r5 I2 ^& p. d
通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory
+ s7 T6 a+ I. o: {+ r
/ n  C. `/ x# n2 H$ |4 J到目前為止,我們得到一個簡單的系統 CPU + bus + memory; ?7 o5 P0 c2 `) i1 L
! A& A8 P2 ^6 B1 u
接著,我們用兩個角度去看這個簡單系統的發展
3 l* _' ^% P# x9 a- v1. 硬體加速! s6 |: M# s  G( I
2. 作業系統0 s3 U5 M+ ]- U
7 N# R2 O9 z. Z5 z/ S. t
我們先從硬體加速的觀點來看這個系統如何改進:
9 ?6 d( N7 Y0 J, O+ ?& x, `) Y8 X/ H( [( \9 t$ e
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)9 T6 J' c$ V( P8 P/ q" w
放在某個地方,然後請你設計好的加速硬體去處理這些資料
3 A. V! q8 @6 [/ ?0 U6 \可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。& C4 m, J3 {2 z$ w& l
這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。, }3 s; k7 D# A- M& y

" o! E3 I/ s( v: C; FCPU + arbiter bus + memory + DMA
6 E# }. t; A- M# a1 I" Y* x4 z) d
接著我們從作業系統的角度來看:
9 [! {, h: g+ g* z3 L: j. U/ i( ]! l6 W* J& `+ Z+ ~
一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。6 p. W, H$ Y- ^7 i) _

# |$ ~1 |4 c; T" o- C例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。2 ~$ ^1 P' L" V% K* ?& A
2 n4 g# j; ~/ Z# A: Y  N1 B+ @
到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。
" |/ [2 u& u: Q1 V: J2 a4 ^8 N5 @& D* W: l8 e4 E+ G) E
所以我們的系統變成了
( Q+ C2 |* _! ?2 u7 Q
% Q* u9 b5 C1 E. ~! f3 gmulti-mode CPU + MPU + arbiter bus + memory + DMA
* T* r+ s8 p1 B7 N
- }* f+ d! R' F6 X( F0 e因為字數限制,部分貼到回文當中  =)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
4#
發表於 2008-7-31 20:44:39 | 只看該作者
希望大大以後多多發表文章.1 O  v% _, s0 s) o
透過大大生動的描述.很多複雜的概念就淺顯易懂了.
3#
 樓主| 發表於 2008-7-31 13:46:10 | 只看該作者
一、: b( T+ s8 H" K
如果大家都在同一個page table上1 `; D) q+ Q+ q) L  j: p- _! C
因為彼此用的記憶體應對方式是一樣的5 n. Q1 d0 ]8 y" f4 N
所以processA要了某個區段 0x0~0x100# u& @  _  `- n5 u2 u) l
這樣processB就不能使用
, i  W* c6 ?# H1 j很可能跑了一段時間之後整個系統的memory fragment就會變多: p4 P: F- N/ L# i, E! S
對記憶體使用率來講不好
" E  B' z; h$ b  V0 m7 W* W( ^很可能要一次找到大塊的不好找
+ f  e/ ^1 D) I雖然virtual address有4G但是process分一分
/ B7 e& a' X* [5 ?$ D還是可能不太夠3 f9 O- x2 B$ j/ a. k2 R
9 S: e2 c5 z9 }8 K7 T" S" o
二、% H) B  ?, N; r' B" {, S) t- j/ j: ~
processB可以看到processA的address space( ]% U) e/ B1 P
表示我可以拿到相對應的資源
  L" O/ y# _+ y& k% q5 w/ E這樣惡意程式很容易就得到一些記憶體上的個人資料- V4 I; q, a/ |+ o- o

' A- ^' U! E' v4 g) Q3 {* A有些地方的說明不太容易,太簡略容易造成誤解,贅述又怕不容易
0 }/ T5 i' e. B9 n- r. t理解。沒表達清楚的地方歡迎提出來討論。

評分

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

查看全部評分

2#
 樓主| 發表於 2008-7-31 13:43:33 | 只看該作者
接著我們看virtual address和physical address的誕生,這邊相當抽象,需要一些想像。. b1 e, W, @! j# U+ `

5 `( w2 I- Y5 t! f% Z隨著時代進步,越來越多user program產生,user mode的program目前雖然已經不會因為隨意的存取記憶體,造成OS掛點,可是還是有可能去改到別人的記憶體,因為每個程式共同擁有並使用同一個記憶體和所謂的記憶體空間。
0 P3 Y+ I% X, S' v. z. r) Y3 h: d- h1 n6 {2 {& N1 x, K
例如:程式A放在0~128 KBytes,程式B放在512~768KBytes,程式A寫錯位置到B程式的地方,變成程式B毀損,B程式就掛掉了。
1 s" y6 q* x1 }) e0 G6 N- o2 I- P" P, ^% r4 Y; h! s+ c% U
上述的記憶體使用情況,不僅給programmer帶來困擾,而且變成記憶體必須被事先決定好誰只能用哪邊?只能使用多大?這樣不但得事先規劃,對於記憶體的使用也不是很高,因此MMU的硬體便被提出來。' U7 M! B, e0 U5 g) Y

0 A5 j- I# V4 _. m2 O' ]8 ?6 i簡單來看,MMU記錄著某個虛擬位置所對應到的實體記憶體的位置。
: ?4 _" I8 e8 D4 k4 i) l
5 ]8 y. X5 n8 i作業系統利用這個特性,為每一個user program先做了一個假的記憶體,每個程式都以為他有很大很大的記憶體空間,其實當程式呼叫malloc的時候,才會去設置MMU將這個user program的假記憶體空間和真實記憶體做個連結。這邊很難解釋清楚,其實每個程式都有一個假的記憶體空間的紀錄表格,當OS做context switch到某個program的時候,MMU也會跟著切到這個table上,以便用到正確的紀錄表格。
; ?' L! @/ t, g" x& o+ D3 P6 ?" Z; V( W; c
例如:
" r) Z2 |$ [6 g
* E; k, ]( n5 u9 t, l程式A的表格記錄了他配置0~4K,而這4K對應到真實記憶體的128K~132K的區段。/ K* |0 d+ _$ [# n* X9 P6 B- d
程式B的表格記錄了他配置0~4K,而這4K對應到真實記憶體的132K~136K的區段。3 b: g2 Z; s4 f2 n
; c3 l9 F; u9 j( R4 w/ @* `% _
雖然兩個程式自己都以為他是用到0~4K,可是其實真實記憶體所配到的位置不同,作業系統在切換的時候,會同步將虛擬記憶體的紀錄表格做切換,以便使用到正確的對應表。以上是一種例子,各種OS可能採取的設計方式不同,但是概念大多是一樣的,我們可以看得出來,對每個程式來說,它可以有擁有許多假的連續記憶體空間,對程式撰寫,還有記憶體使用率來說,很有效果。
+ J7 f4 A$ ^: {( `: D8 x) ~3 ?2 I9 y0 s: s6 r+ b# E* M
到此,CPU多了MMU,現在大多包含MPU的功能。8 p: i6 u* m1 K3 r

, Q, g3 }/ ~  kmuti-mode CPU + MMU + arbiter bus + memory + DMA& t  j4 l% I% c8 ]! a

! m( N  f- O; X" h" y7 t# R因此OS在kernel mode的時候,如果MMU是打開的,這時候還是使用virtual address。! Z! l; n4 d# o- H2 c

0 H1 s' N# i7 d* z# N4 ~要讓mmu正常工作,必須要設定,要讓他知道你對位址的規劃是如何。
* w8 i+ r1 \( a  E4 K# }
6 G% F6 P/ e* ^* q8 [) v例如:RAM被硬體人員安排到0xFF00 0000的位址,可是你希望RAM被當成從0x0開始,你就可以設定MMU將 0xFF00 0000 對應到 0x0,這樣一來你讀取0x0就會自動轉到0xFF00 0000那邊去。
; k" h& L; K. C  m& W; T0 _: Z' i2 \. R* V- U% X
0x0000 0000 --< mapping >-- 0xFF00 0000
% T3 z) [0 e: r; a, j' f8 F/ b4 D- q2 c8 W7 H
作業系統一開始就會初始化這些位址轉換對應的資訊,把它放在所謂的page table裡面,然後把table位址交給MMU,MMU就會依照table的資訊工作。
7 s! B: }& [  q. M! j8 ^3 Q: z, }. k; C0 U) l7 d0 v8 M! D
假如你今天有兩張table,兩張table設定不一樣,MMU只要在這兩張table之間切換,那記憶體對應的方式也會跟著換。8 P- b, H/ k0 S# L2 n! e

2 }, }9 R+ O7 a+ R7 K7 y  N8 u; s9 y這是一個很重要的想法。假如,我每一個process都有自己的 page table,切換process的時候,table也跟著切換,這樣我可以控制每一個process去存取記憶體的方式。假如我是讓所有的process 都共用一個 table,這樣這個table的設定值,就會影響到所有的process。4 P7 b7 s, _$ u
  [/ y. E7 V5 P
共用一個table表示每個process用同一個位址去讀寫,透過MMU轉換到的位址是相同的,會讀寫到同一塊。不共用的話,表示processA和processB即使拿同一個位址0x8000 0000去讀寫,可能最後對應到的位址是不同的。) j8 }2 `, R9 n- M
& U7 b8 G, W! X7 J5 C8 N
但是這樣的差別就是有什麼好處??* P3 V) v& P  m5 G9 B0 c" j9 W

% V+ n/ k7 j, n+ e5 L因為感覺上複雜化了整個系統,本來我可以很直覺的拿processA傳給我的位址,去讀取它為我準備的資料,現在我可能會因為我使用的 table 不同,就不能在其他process直接使用。感覺很麻煩,要是大家都在同一個 table 工作,不是很簡單嗎?位址空間都是一樣的。6 N1 ]/ Z) {  V9 Q) U3 j( b$ D

: |3 \1 d3 N6 G0 x3 K7 x9 Jwhy?!
' {9 |0 ~# p, q! U. k! v, a, C4 V: X1 m& u  Y
字數又超過啦~   
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-21 01:56 PM , Processed in 0.171009 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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