Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

從system bus來看系統

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-31 13:36:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
有些基礎不夠深厚  遣詞用句也不是很精確
4 O$ o' r' r) R. }& K7 X$ g$ |以下試圖以自己的體認和觀點  以簡單的辭彙$ A  h% E, t/ f, Z. y$ A; Y5 I
去解釋一些process與系統演進的方式3 B/ E# M+ {" y/ H2 _
如果有誤或是清楚的地方  歡迎大家討論" c$ L9 U, M+ U( u

( }8 f+ t- j! ?$ J& v+ ~6 {[本文開始]& \' `, @9 a% E1 j2 R
在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候$ {1 R3 W; |4 P6 a9 N
常常會被一下子多出來的專有名詞搞混
# |3 j7 x; z( n% a, R/ ]像是DMA, memory, cache, mmu, virtual address, physical address 等等# k* h9 `2 z' N4 {
尤其大家一開始接觸電腦都是已經發展很久的x86系統+ x9 Z7 V9 R' \/ N0 ^+ W& }$ q
即使有單晶片系統的實驗課程# @3 L  m) \% O. W7 s( o
也很難將單晶片的經驗
$ Y& I" p1 M' M/ @4 a2 m: o4 {運用到x86或是已經較為複雜的CPU系統上
9 M# |0 e9 p4 Y2 j& z& p# i
0 T( S9 u, p9 F" X% Q因為CPU上頭又開始加入了越來越複雜的作業系統. ]) k* j+ j* Y! r" }  u/ D. i
像是作業系統常提到的kernel mode, user mode' x0 I4 V* F' R8 a& Q6 S! S& f" c
常常跟上述的專有名詞physical address or virtural address交互使用
$ U; i& u4 ]- M) v3 s3 [$ w* x例如刻板印象的『作業系統處於kernel mode時,使用physical address』+ [- P, I& n  Z# O2 R
經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問
1 t# [- e2 r1 D# f$ ~" ~" r- {0 B: W3 m8 `$ L
那應該怎麼簡單來看待一個系統?# h4 w8 `1 g$ X! L8 Z
) b6 l1 w0 z  t3 m
首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』
( i4 |  `% S5 U/ b0 G/ ^他是用來處理各種『資料』
+ T5 E% D, x5 Z# T, e6 J& J( a: A& J1 A2 {" C
那麼這些資料又放在哪邊?他是如何去存取這些資料?4 y/ s  a: h( q% [( _

2 s5 }% i) ~6 u5 z) m/ V通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory
* u( a! c' B( X" X6 ~( [
1 v- o7 z0 O+ G) v1 ]4 Z! b到目前為止,我們得到一個簡單的系統 CPU + bus + memory
8 P  ~, _5 O, P' R& y
: k! J$ c( t1 j5 n: K接著,我們用兩個角度去看這個簡單系統的發展. [* \3 u% g1 o( Z) R. S6 U* m
1. 硬體加速
8 I  K4 l7 i# P5 P; ?1 r6 q2. 作業系統' v9 F5 u8 p1 J9 e' O, r$ o$ E

4 \/ y( W( N6 c- r5 k. W5 y. X我們先從硬體加速的觀點來看這個系統如何改進:" \3 F; V% S& e0 x* }5 j& i1 v
0 y% Q$ J  }7 E' X& u; F
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)7 `9 K4 G0 Z" k  @, Q
放在某個地方,然後請你設計好的加速硬體去處理這些資料
' E. P  E( e2 {9 [可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。6 q/ L/ O% k7 r5 i! c! L
這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。* Z2 w2 L  N" g4 J
- n7 B2 i& S& O+ r8 Y5 W
CPU + arbiter bus + memory + DMA
& ~9 Z2 l5 ~6 j1 n& o
; I" ?9 h  U. }# Y: _6 ?: W接著我們從作業系統的角度來看:
" U) `) W8 {1 c
2 y5 G1 }$ `1 x% P一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。
: S+ r/ K. P! I) L: S0 b* i9 Y, v2 m& M. j4 J
例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。
  b' S7 k7 r+ C9 [' `; Q1 w8 \4 h  `  G4 a$ s
到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。1 T% I+ k; z% ^1 Y0 z' v, V) Q

/ U0 B7 N1 O/ A) Z& t' }2 z所以我們的系統變成了4 B: K: G' W/ g9 u, H
, J/ f' Z$ ]" t/ n/ T
multi-mode CPU + MPU + arbiter bus + memory + DMA# S' ?% ]- h4 Z8 i2 C3 m

1 X, H5 }, Z- S! s% a1 Y7 J1 w' z* k因為字數限制,部分貼到回文當中  =)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-7-31 13:43:33 | 只看該作者
接著我們看virtual address和physical address的誕生,這邊相當抽象,需要一些想像。4 g1 C) q) O2 k

- }  s; V* B, _% O隨著時代進步,越來越多user program產生,user mode的program目前雖然已經不會因為隨意的存取記憶體,造成OS掛點,可是還是有可能去改到別人的記憶體,因為每個程式共同擁有並使用同一個記憶體和所謂的記憶體空間。& L# {/ t  i1 {6 o

" T& O# J2 N  F7 ~& f  e# _: U例如:程式A放在0~128 KBytes,程式B放在512~768KBytes,程式A寫錯位置到B程式的地方,變成程式B毀損,B程式就掛掉了。
/ S! y" M% j: `, J" s9 f# p
  W# }' `) y; u" x. G上述的記憶體使用情況,不僅給programmer帶來困擾,而且變成記憶體必須被事先決定好誰只能用哪邊?只能使用多大?這樣不但得事先規劃,對於記憶體的使用也不是很高,因此MMU的硬體便被提出來。
& u8 e; t7 \1 N' p4 b! S4 H2 K# q3 _  a2 Q/ ~
簡單來看,MMU記錄著某個虛擬位置所對應到的實體記憶體的位置。' e3 v) m& \" I# a( N) o8 ^, p

6 N4 }% X# V; O' r# A; R2 ~) o作業系統利用這個特性,為每一個user program先做了一個假的記憶體,每個程式都以為他有很大很大的記憶體空間,其實當程式呼叫malloc的時候,才會去設置MMU將這個user program的假記憶體空間和真實記憶體做個連結。這邊很難解釋清楚,其實每個程式都有一個假的記憶體空間的紀錄表格,當OS做context switch到某個program的時候,MMU也會跟著切到這個table上,以便用到正確的紀錄表格。
1 ]& n( r8 ]" n
9 h+ Y3 j2 L* R% O例如:+ H1 C0 V1 Z1 I8 r$ R

9 R9 ?* G4 O* ~2 ^, c. P+ `5 \  B# W程式A的表格記錄了他配置0~4K,而這4K對應到真實記憶體的128K~132K的區段。. Q% I: l, i* h5 M4 x/ d0 ~! t
程式B的表格記錄了他配置0~4K,而這4K對應到真實記憶體的132K~136K的區段。2 H9 W) J. e; q$ c9 ~
: ^, }/ r9 u# [5 m
雖然兩個程式自己都以為他是用到0~4K,可是其實真實記憶體所配到的位置不同,作業系統在切換的時候,會同步將虛擬記憶體的紀錄表格做切換,以便使用到正確的對應表。以上是一種例子,各種OS可能採取的設計方式不同,但是概念大多是一樣的,我們可以看得出來,對每個程式來說,它可以有擁有許多假的連續記憶體空間,對程式撰寫,還有記憶體使用率來說,很有效果。, S$ f$ f! \/ [8 Q
4 c7 h0 n' M0 n) N, F* S: [
到此,CPU多了MMU,現在大多包含MPU的功能。4 x2 t6 g; l0 p0 k3 \+ F
7 b* f& `, @: a% b, y% Q8 Y
muti-mode CPU + MMU + arbiter bus + memory + DMA6 w3 D9 K* J9 |* [8 P# D, ?& B

$ H2 c# ^  y- F+ f因此OS在kernel mode的時候,如果MMU是打開的,這時候還是使用virtual address。
5 e* C- E- S, b5 _3 d% z( ?% x. B& e) Y) F; M
要讓mmu正常工作,必須要設定,要讓他知道你對位址的規劃是如何。9 j( @. o/ T* t  \+ J, J
4 L5 N7 @! S) P' u
例如:RAM被硬體人員安排到0xFF00 0000的位址,可是你希望RAM被當成從0x0開始,你就可以設定MMU將 0xFF00 0000 對應到 0x0,這樣一來你讀取0x0就會自動轉到0xFF00 0000那邊去。
3 t1 K0 d/ b) p& S0 X# R8 g9 `
4 c' l- N* G! J1 W5 U1 |0x0000 0000 --< mapping >-- 0xFF00 0000
( Z5 b2 U3 x( J: T, P
9 K" `7 f( W+ D& J+ S  ~作業系統一開始就會初始化這些位址轉換對應的資訊,把它放在所謂的page table裡面,然後把table位址交給MMU,MMU就會依照table的資訊工作。
- C" G: X, t; S' H
9 G( D, t& W1 C2 _" `假如你今天有兩張table,兩張table設定不一樣,MMU只要在這兩張table之間切換,那記憶體對應的方式也會跟著換。
* A/ A1 t! U6 f) l. V' ^0 b& U/ t2 q3 a: B- I' w6 P
這是一個很重要的想法。假如,我每一個process都有自己的 page table,切換process的時候,table也跟著切換,這樣我可以控制每一個process去存取記憶體的方式。假如我是讓所有的process 都共用一個 table,這樣這個table的設定值,就會影響到所有的process。9 E' S! N8 |+ r( E9 j4 V

3 A& E/ o- x& t; w- O& x5 M共用一個table表示每個process用同一個位址去讀寫,透過MMU轉換到的位址是相同的,會讀寫到同一塊。不共用的話,表示processA和processB即使拿同一個位址0x8000 0000去讀寫,可能最後對應到的位址是不同的。8 U' E! a9 J0 z# @4 h6 ]) i' M* x4 q/ C
6 a( N: }5 m8 a+ _
但是這樣的差別就是有什麼好處??
, G: K+ R1 P9 s1 u* E
" t* u! d0 E; j因為感覺上複雜化了整個系統,本來我可以很直覺的拿processA傳給我的位址,去讀取它為我準備的資料,現在我可能會因為我使用的 table 不同,就不能在其他process直接使用。感覺很麻煩,要是大家都在同一個 table 工作,不是很簡單嗎?位址空間都是一樣的。* v# D9 y3 T0 f6 s

# g) W; t; [# ^8 ~$ t* jwhy?!0 y: z7 A1 {# W. D4 d9 o4 N) Q
# ?, t9 b: U* O  l9 ^- k
字數又超過啦~   
3#
 樓主| 發表於 2008-7-31 13:46:10 | 只看該作者
一、; a- S1 S. I8 n, `' X
如果大家都在同一個page table上$ {4 V% \8 S5 o6 Y' k" d
因為彼此用的記憶體應對方式是一樣的
, q+ {- W4 v& D6 G5 _所以processA要了某個區段 0x0~0x100
* T) h5 O! l) M' ~: b# q. P這樣processB就不能使用! d, x4 [& ^4 f2 D8 M6 W0 o
很可能跑了一段時間之後整個系統的memory fragment就會變多$ F) c- T* ?" C/ x$ I. c
對記憶體使用率來講不好
% c" b- S# W/ p6 s$ \很可能要一次找到大塊的不好找
- |9 z! {: N- Z! @6 K" A雖然virtual address有4G但是process分一分, w/ R* Y# E( t' C. X& ?
還是可能不太夠
; D# p/ U( F: ]8 Y/ C5 Q- _: g! |3 X, \7 a' g9 W9 I& j
二、2 K0 _3 [3 ]; _
processB可以看到processA的address space
0 j0 l; r# j$ Q表示我可以拿到相對應的資源5 f" L$ U4 @( X1 M6 p8 E# s
這樣惡意程式很容易就得到一些記憶體上的個人資料
- ^7 A% Q2 F. f
) K8 s! o! o6 X! Z. @. Z有些地方的說明不太容易,太簡略容易造成誤解,贅述又怕不容易3 {* e  ?7 u/ z, T. a
理解。沒表達清楚的地方歡迎提出來討論。

評分

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

查看全部評分

4#
發表於 2008-7-31 20:44:39 | 只看該作者
希望大大以後多多發表文章.
% j1 Z0 W$ s' ^* T  O透過大大生動的描述.很多複雜的概念就淺顯易懂了.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-28 04:16 AM , Processed in 0.169010 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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