Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

從system bus來看系統

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-31 13:36:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
有些基礎不夠深厚  遣詞用句也不是很精確
+ [- N$ V: H- ~  M以下試圖以自己的體認和觀點  以簡單的辭彙1 c4 H; p( d* R7 w' d
去解釋一些process與系統演進的方式
+ S1 @$ g- s% u  ]如果有誤或是清楚的地方  歡迎大家討論/ J7 d9 f. [% o0 {& S

5 T; \% i: n) x+ c, C! g[本文開始]
9 R! |' F8 w' c# p$ Y. Z7 w4 W9 F" ?0 H在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候* [; K) \% z( z9 X0 z/ K
常常會被一下子多出來的專有名詞搞混7 }7 n7 u/ n9 @3 U$ U& P
像是DMA, memory, cache, mmu, virtual address, physical address 等等4 [% U: _2 e0 f1 O# K. \. y
尤其大家一開始接觸電腦都是已經發展很久的x86系統9 J% d: a4 L6 ?& V& U6 O7 g$ A
即使有單晶片系統的實驗課程9 O& p+ T; X8 L: E7 G
也很難將單晶片的經驗
# y0 ~( m8 ^& f/ R運用到x86或是已經較為複雜的CPU系統上
- o5 P3 j! l/ h
5 L% [2 c4 O( j因為CPU上頭又開始加入了越來越複雜的作業系統% l2 J9 K: K: c# k3 e. Y& p0 F/ G4 S
像是作業系統常提到的kernel mode, user mode
1 B7 j, M# a1 v+ o+ X2 d$ w. f2 a常常跟上述的專有名詞physical address or virtural address交互使用
. t4 ]1 ?' j; B6 L0 y例如刻板印象的『作業系統處於kernel mode時,使用physical address』$ _/ ~, I1 K+ J3 Q4 r
經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問
1 z7 `) L( n9 o% m6 o2 j' x8 S4 o% g! V5 a2 I- C
那應該怎麼簡單來看待一個系統?
. H+ X7 ~. E1 k2 `0 N9 S5 t5 P& p" }5 K- ~. x1 `4 J
首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』- \: @* O. A0 V' v* f; q
他是用來處理各種『資料』) S) v4 q' Z" T. ]9 n* _; B

8 @7 P4 }: V" h; l! Z那麼這些資料又放在哪邊?他是如何去存取這些資料?
0 A4 B3 R9 ~! b6 c0 J  Y: q% e6 z! b# s% W+ g( F
通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory
; Z: f2 H# {; e  Z  {
& O0 |% `& ^# Y+ G到目前為止,我們得到一個簡單的系統 CPU + bus + memory0 x! H. R. j# m) }  F3 n  A
( h. J8 F6 L5 F8 }  G4 k: c1 l0 V
接著,我們用兩個角度去看這個簡單系統的發展9 q; e! @4 O- M& u. Z' _
1. 硬體加速8 E. O; i0 j7 l  B* V2 f9 Q
2. 作業系統
. p* f' n" [8 X" w& I5 ^6 T3 C2 A6 r* T, f" `+ L
我們先從硬體加速的觀點來看這個系統如何改進:
5 E! G4 t0 e4 }! N/ w- ]
8 f2 F0 N! \% a7 s! X# ~  [) q首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)3 D5 t. z, G  q1 q6 E" ^
放在某個地方,然後請你設計好的加速硬體去處理這些資料$ \6 H" u5 Q" S0 _4 H
可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。
; `+ e1 I+ m8 O2 n3 A# _& [3 L這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。
. i' n, n  {. z! K4 \) O% C! U- T. ?8 d+ D4 ^' ?
CPU + arbiter bus + memory + DMA! }" k6 J' t: y5 m
- a9 ^# S5 Z* C
接著我們從作業系統的角度來看:
3 b# I5 h. Z1 q2 }+ i$ \
( [: ?: H2 d) O, I. Y" v一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。/ A. g& g& U3 \9 i7 U
1 M+ D' B0 w- m
例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。
6 d- z8 \! W  m3 ]4 ^" _0 q3 h
7 m$ \  J- a0 u8 |4 R6 ?到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。
9 K; o6 l9 J7 ]$ m* s& U( |- v7 F. U* q% t6 S
所以我們的系統變成了- L- _$ H* Z: Q4 f  J4 S3 E

/ {. M$ `0 U" pmulti-mode CPU + MPU + arbiter bus + memory + DMA
; x& F3 {4 s5 O3 o0 k) A5 k" \- s0 ~( G7 }( O- C
因為字數限制,部分貼到回文當中  =)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-7-31 13:43:33 | 只看該作者
接著我們看virtual address和physical address的誕生,這邊相當抽象,需要一些想像。- \: Z- Y6 ?2 a/ L
0 M0 O" Y  a( |& E
隨著時代進步,越來越多user program產生,user mode的program目前雖然已經不會因為隨意的存取記憶體,造成OS掛點,可是還是有可能去改到別人的記憶體,因為每個程式共同擁有並使用同一個記憶體和所謂的記憶體空間。4 \$ c0 T. F( s" c- l1 E- Y
1 b/ W/ M5 w; `  n3 D
例如:程式A放在0~128 KBytes,程式B放在512~768KBytes,程式A寫錯位置到B程式的地方,變成程式B毀損,B程式就掛掉了。, p9 I; t# P9 i8 ~% G9 \" b/ m9 e. G

! b8 j4 H. y, x4 T# U  u( r: T" d; l: l上述的記憶體使用情況,不僅給programmer帶來困擾,而且變成記憶體必須被事先決定好誰只能用哪邊?只能使用多大?這樣不但得事先規劃,對於記憶體的使用也不是很高,因此MMU的硬體便被提出來。  L1 F+ Y9 L! [% j
; T5 \5 w6 B8 M, M
簡單來看,MMU記錄著某個虛擬位置所對應到的實體記憶體的位置。
9 p: `0 P" z& h3 s) w  d  _) b+ |! n) ^$ @
作業系統利用這個特性,為每一個user program先做了一個假的記憶體,每個程式都以為他有很大很大的記憶體空間,其實當程式呼叫malloc的時候,才會去設置MMU將這個user program的假記憶體空間和真實記憶體做個連結。這邊很難解釋清楚,其實每個程式都有一個假的記憶體空間的紀錄表格,當OS做context switch到某個program的時候,MMU也會跟著切到這個table上,以便用到正確的紀錄表格。
; i% N0 R, h& `/ z% ^- B1 l# F
* ?! H8 {+ v9 W# Z0 P+ o5 I例如:
1 @: k' `& o: E$ [0 d1 f+ k" d
. a  m; ?3 D' [. s, ~  q. O1 {$ B程式A的表格記錄了他配置0~4K,而這4K對應到真實記憶體的128K~132K的區段。
4 M, [3 q3 e: O" Q程式B的表格記錄了他配置0~4K,而這4K對應到真實記憶體的132K~136K的區段。
( x  n) s* z0 q8 e3 y( e
# I; L# f2 u# [  e3 e, F3 g雖然兩個程式自己都以為他是用到0~4K,可是其實真實記憶體所配到的位置不同,作業系統在切換的時候,會同步將虛擬記憶體的紀錄表格做切換,以便使用到正確的對應表。以上是一種例子,各種OS可能採取的設計方式不同,但是概念大多是一樣的,我們可以看得出來,對每個程式來說,它可以有擁有許多假的連續記憶體空間,對程式撰寫,還有記憶體使用率來說,很有效果。
1 Y, Y) }- I) x1 n$ L4 g9 |( t
到此,CPU多了MMU,現在大多包含MPU的功能。5 d* s2 e8 e& w/ h3 Y3 M0 O6 W
2 V' _/ A) E- D: L
muti-mode CPU + MMU + arbiter bus + memory + DMA
- d7 J8 m: w$ N0 `$ F
5 H- c  o4 ]  k, z$ Q0 z因此OS在kernel mode的時候,如果MMU是打開的,這時候還是使用virtual address。: {2 u! z, c" ?2 [' j
! _7 F! b$ u. g; Y
要讓mmu正常工作,必須要設定,要讓他知道你對位址的規劃是如何。8 ]; a; _( A0 X0 a* U; U8 |9 z4 r

7 w/ P; W1 |! d0 \1 ?例如:RAM被硬體人員安排到0xFF00 0000的位址,可是你希望RAM被當成從0x0開始,你就可以設定MMU將 0xFF00 0000 對應到 0x0,這樣一來你讀取0x0就會自動轉到0xFF00 0000那邊去。
. `  f9 k* p( m& n: N
# t4 N! M$ @6 ?- o" C/ a, w8 ~+ s0x0000 0000 --< mapping >-- 0xFF00 0000% t* H. Y% a8 K; i5 X
& `/ x2 N; ^/ I
作業系統一開始就會初始化這些位址轉換對應的資訊,把它放在所謂的page table裡面,然後把table位址交給MMU,MMU就會依照table的資訊工作。
- [% d% C/ O! [* Y  c2 z3 a
3 t# s  g) o8 h/ E; `假如你今天有兩張table,兩張table設定不一樣,MMU只要在這兩張table之間切換,那記憶體對應的方式也會跟著換。
' e/ O0 @- ~2 q  W( Z( Y9 u9 \' t' x3 z! M' R
這是一個很重要的想法。假如,我每一個process都有自己的 page table,切換process的時候,table也跟著切換,這樣我可以控制每一個process去存取記憶體的方式。假如我是讓所有的process 都共用一個 table,這樣這個table的設定值,就會影響到所有的process。
9 a# S5 v$ p: [) ~4 ]
0 {: [, s9 E) E# j6 e0 Q共用一個table表示每個process用同一個位址去讀寫,透過MMU轉換到的位址是相同的,會讀寫到同一塊。不共用的話,表示processA和processB即使拿同一個位址0x8000 0000去讀寫,可能最後對應到的位址是不同的。
: h! s- q- l$ }* ]0 B2 I
0 u* _0 `" Z) [3 F但是這樣的差別就是有什麼好處??6 z! P8 O0 I5 ]

. ?  y) W9 t; F9 ~3 U因為感覺上複雜化了整個系統,本來我可以很直覺的拿processA傳給我的位址,去讀取它為我準備的資料,現在我可能會因為我使用的 table 不同,就不能在其他process直接使用。感覺很麻煩,要是大家都在同一個 table 工作,不是很簡單嗎?位址空間都是一樣的。
3 `: n! w9 r1 W
& E1 @8 U0 [: H. e; Jwhy?!
! H; Y" {- Z! p1 |$ Y
$ T) q, z1 R9 H字數又超過啦~   
3#
 樓主| 發表於 2008-7-31 13:46:10 | 只看該作者
一、
4 T6 H: K% r: e9 s如果大家都在同一個page table上
* r+ c1 l: B+ L* b- R" E因為彼此用的記憶體應對方式是一樣的
- {/ \" g) e7 f1 N/ q  U" @3 D/ R所以processA要了某個區段 0x0~0x100
3 M( Q! B* m% p3 [' I) P* ?+ u9 d這樣processB就不能使用
0 s8 N- V6 C6 n  c8 d# M% E, F很可能跑了一段時間之後整個系統的memory fragment就會變多" C2 x" ~- q4 f3 d
對記憶體使用率來講不好1 l& J& M  k3 f+ L: r
很可能要一次找到大塊的不好找
# m, c. W" T+ {1 _雖然virtual address有4G但是process分一分* n) Z! A  X/ S
還是可能不太夠
  y4 N9 J! N2 C; d) C
! `* y$ F5 ]) U二、; d1 p. I0 G( _- Z* s4 T4 p$ Z
processB可以看到processA的address space1 h2 w0 }0 l/ |
表示我可以拿到相對應的資源
& U+ y* @; t6 y( X: ?/ R這樣惡意程式很容易就得到一些記憶體上的個人資料0 T+ ~1 H; Y% t2 Z

2 m$ B8 p% C1 {1 f2 h9 f8 ?有些地方的說明不太容易,太簡略容易造成誤解,贅述又怕不容易/ B4 l0 Q( Y2 c' M1 ?1 x
理解。沒表達清楚的地方歡迎提出來討論。

評分

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

查看全部評分

4#
發表於 2008-7-31 20:44:39 | 只看該作者
希望大大以後多多發表文章.
$ {. u- {/ K; ^3 ?5 J透過大大生動的描述.很多複雜的概念就淺顯易懂了.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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