Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

從system bus來看系統

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-31 13:36:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
有些基礎不夠深厚  遣詞用句也不是很精確
. q% M  z# ]3 k) a# c以下試圖以自己的體認和觀點  以簡單的辭彙: z+ ~; X* \2 z+ Q! k2 [" F( M
去解釋一些process與系統演進的方式
3 m. N3 ], g7 N0 E如果有誤或是清楚的地方  歡迎大家討論% H" E. F2 [0 V% S4 j1 i4 S- R; z
- z& d$ j1 f) Y+ f4 P
[本文開始]; T8 j$ A% c- e: K5 W: W
在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候
/ P% R$ I  k! `0 F; j) J* C& S  J% J常常會被一下子多出來的專有名詞搞混
4 x$ w6 K$ r* D像是DMA, memory, cache, mmu, virtual address, physical address 等等
" m( ~5 D" N$ b- i尤其大家一開始接觸電腦都是已經發展很久的x86系統
/ e( {5 r* J3 n; A; ~% f即使有單晶片系統的實驗課程6 s# Z8 f( _+ ^$ D; @
也很難將單晶片的經驗
+ T. B! h" v5 }運用到x86或是已經較為複雜的CPU系統上- K: |  f" Y; L  y9 o  O

6 P; y/ {% ?( O; S2 w因為CPU上頭又開始加入了越來越複雜的作業系統$ S1 Z- I2 m5 I7 T# x: {- r3 C* d% V
像是作業系統常提到的kernel mode, user mode
" B7 [# n$ \% b6 I; K8 e常常跟上述的專有名詞physical address or virtural address交互使用
! B! k% j$ `1 I& m1 N例如刻板印象的『作業系統處於kernel mode時,使用physical address』
8 s9 G7 r& s1 ~! p, t; o+ \# f4 f; u7 w經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問( t1 |: Q7 V- V) M3 c0 U' v9 e

" D- {: `3 j4 A& g! `; b4 \  ~" X; }( Z+ X那應該怎麼簡單來看待一個系統?
4 D+ P! F6 O0 p1 X  P3 ?) K' W3 \! m( A& m8 ?: _  m8 ]
首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』7 B* g; b* x; P5 z# z4 F" \
他是用來處理各種『資料』
( W" t* q7 Q7 M* z0 F2 h( P8 p. B6 A3 w/ n# Y
那麼這些資料又放在哪邊?他是如何去存取這些資料?4 t: t* f% `# ]  z7 ~+ y. I& i

- G% ^$ v. s8 h) S. l通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory4 g+ }  V, H* j8 U* \: [

+ c+ z1 F+ U3 l$ S. W- H' A0 h到目前為止,我們得到一個簡單的系統 CPU + bus + memory
3 `1 O; }- W9 r! b! S- ~& P$ O2 {6 ]$ H0 T3 G# k5 e  l
接著,我們用兩個角度去看這個簡單系統的發展
/ `1 U+ y5 I3 f/ ?7 J1. 硬體加速  }, @- w8 ]& y6 J0 h
2. 作業系統
; o- C$ B$ Z7 J, Z4 a! |/ z/ B. p$ g5 Y& c
我們先從硬體加速的觀點來看這個系統如何改進:
. o& K7 W; A- l) M) E  i+ H( Z) T3 I4 j$ ~' l. T# f; i4 K
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)/ n9 J! }: R- R; F) E
放在某個地方,然後請你設計好的加速硬體去處理這些資料
( ^7 s8 m8 b. i9 t3 ^* P4 B可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。
0 B) i( h! P- l' b  a. ?6 K6 \這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。
, t1 y3 ?4 ~: e+ D. f( Q( y0 Y7 C9 }3 l% V4 C1 K; n9 H
CPU + arbiter bus + memory + DMA. I+ n% T( a1 b# j/ n8 s! W& x6 S

4 F5 {% Z; m+ X6 r$ h接著我們從作業系統的角度來看:
5 Z4 I3 Z; ~1 q- H6 `$ l' T+ R; C3 x. C
一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。
8 d+ Y7 {. I' J/ M, v# S# `- S
, b' l9 _0 ~5 B例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。
$ z; P# J* a: U  H. c5 ?
/ k7 h' H( ^" {! \6 u; R到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。
7 v8 f8 [  t* N! ^( G. p
8 j! p% M4 }& U) A5 U所以我們的系統變成了0 v* c% |" T1 u( [# J; l
' B$ c. e  C) X4 T5 ?
multi-mode CPU + MPU + arbiter bus + memory + DMA5 q7 |6 ^+ S/ V
* ~. h( h$ L- c* ~
因為字數限制,部分貼到回文當中  =)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-7-31 13:43:33 | 只看該作者
接著我們看virtual address和physical address的誕生,這邊相當抽象,需要一些想像。3 O: g! h  z1 e
. _0 g  \3 @0 T3 K! B
隨著時代進步,越來越多user program產生,user mode的program目前雖然已經不會因為隨意的存取記憶體,造成OS掛點,可是還是有可能去改到別人的記憶體,因為每個程式共同擁有並使用同一個記憶體和所謂的記憶體空間。( Q2 w1 A8 W' z8 l' f: b" h3 J7 a  a
4 g( N+ A# I- `' e' J9 f
例如:程式A放在0~128 KBytes,程式B放在512~768KBytes,程式A寫錯位置到B程式的地方,變成程式B毀損,B程式就掛掉了。
) ?) q' s! x% ~! O7 W: B" R# J; C; ]& \, B% W% j6 F8 v
上述的記憶體使用情況,不僅給programmer帶來困擾,而且變成記憶體必須被事先決定好誰只能用哪邊?只能使用多大?這樣不但得事先規劃,對於記憶體的使用也不是很高,因此MMU的硬體便被提出來。
- ~  h% F% l4 S; i9 V$ \4 r5 S- V: N6 ^/ [
簡單來看,MMU記錄著某個虛擬位置所對應到的實體記憶體的位置。
% y# U9 n6 w7 R7 C
" ^4 @0 a1 k( r" y8 q* O; B作業系統利用這個特性,為每一個user program先做了一個假的記憶體,每個程式都以為他有很大很大的記憶體空間,其實當程式呼叫malloc的時候,才會去設置MMU將這個user program的假記憶體空間和真實記憶體做個連結。這邊很難解釋清楚,其實每個程式都有一個假的記憶體空間的紀錄表格,當OS做context switch到某個program的時候,MMU也會跟著切到這個table上,以便用到正確的紀錄表格。  N+ v( |% G! w
9 E. w: _. z$ h6 B1 }5 i% W0 a
例如:9 a6 S1 m# r% p' N: }
. w8 n- k4 i$ z* b
程式A的表格記錄了他配置0~4K,而這4K對應到真實記憶體的128K~132K的區段。
% X) y' W" x" l# a程式B的表格記錄了他配置0~4K,而這4K對應到真實記憶體的132K~136K的區段。3 i, r4 d) }# \7 L

2 ?# t+ M8 B5 p7 ~7 @) j$ b/ w雖然兩個程式自己都以為他是用到0~4K,可是其實真實記憶體所配到的位置不同,作業系統在切換的時候,會同步將虛擬記憶體的紀錄表格做切換,以便使用到正確的對應表。以上是一種例子,各種OS可能採取的設計方式不同,但是概念大多是一樣的,我們可以看得出來,對每個程式來說,它可以有擁有許多假的連續記憶體空間,對程式撰寫,還有記憶體使用率來說,很有效果。$ C6 m9 c( o2 Z  ?
1 A! U0 k% W% O& x
到此,CPU多了MMU,現在大多包含MPU的功能。
  _5 W- O4 `+ j0 \8 v( R# T6 d4 u
" S7 w" s6 T- T0 bmuti-mode CPU + MMU + arbiter bus + memory + DMA( l* s$ W5 X6 V0 l9 D) X

) ^" h: G7 d4 I# x$ G7 J' \; ]' @因此OS在kernel mode的時候,如果MMU是打開的,這時候還是使用virtual address。
) B$ I2 q6 Q! Y' i6 V' v9 Y7 [, E) K" P0 B0 W) D9 A9 ~, g
要讓mmu正常工作,必須要設定,要讓他知道你對位址的規劃是如何。4 F% G. Q3 c9 O
- k. s, r0 Y) ~% ]8 p
例如:RAM被硬體人員安排到0xFF00 0000的位址,可是你希望RAM被當成從0x0開始,你就可以設定MMU將 0xFF00 0000 對應到 0x0,這樣一來你讀取0x0就會自動轉到0xFF00 0000那邊去。: l: z, Z5 ?" u3 Y4 S: n/ F+ n0 q
% J+ u8 e. l  m+ ?+ C3 F: Z
0x0000 0000 --< mapping >-- 0xFF00 00000 ~& P8 H- H: f
" O2 H+ O% z$ }5 D* y
作業系統一開始就會初始化這些位址轉換對應的資訊,把它放在所謂的page table裡面,然後把table位址交給MMU,MMU就會依照table的資訊工作。5 O6 B7 o  D! x: o- g5 K, a% A

4 f1 O$ L- `* T# p6 e/ ]假如你今天有兩張table,兩張table設定不一樣,MMU只要在這兩張table之間切換,那記憶體對應的方式也會跟著換。
$ K4 }9 @" @. D: R" I; n) |5 Z$ V! a: n: S/ J" X% d
這是一個很重要的想法。假如,我每一個process都有自己的 page table,切換process的時候,table也跟著切換,這樣我可以控制每一個process去存取記憶體的方式。假如我是讓所有的process 都共用一個 table,這樣這個table的設定值,就會影響到所有的process。; o% A1 [- d7 e0 g% ^& R% c" _

( a% A! _- u$ H共用一個table表示每個process用同一個位址去讀寫,透過MMU轉換到的位址是相同的,會讀寫到同一塊。不共用的話,表示processA和processB即使拿同一個位址0x8000 0000去讀寫,可能最後對應到的位址是不同的。& A/ E3 ?0 H9 n: n7 P

( t% @0 k) O  i- B5 ?但是這樣的差別就是有什麼好處??7 J5 G6 b8 v6 T) {* o0 H4 S7 b. t

% p0 x- Z- z& K因為感覺上複雜化了整個系統,本來我可以很直覺的拿processA傳給我的位址,去讀取它為我準備的資料,現在我可能會因為我使用的 table 不同,就不能在其他process直接使用。感覺很麻煩,要是大家都在同一個 table 工作,不是很簡單嗎?位址空間都是一樣的。
( p5 t* g/ {. [% T+ z, u% I! A5 M0 A
9 I/ z3 S+ d: twhy?!2 x3 K: `% ?- p. y7 M% Q/ Z! U: Z, \
0 i. u; y0 v$ T) ^% G4 [
字數又超過啦~   
3#
 樓主| 發表於 2008-7-31 13:46:10 | 只看該作者
一、: b, A! [8 @; I$ v
如果大家都在同一個page table上& x! j3 d( f, ^* j" f9 _
因為彼此用的記憶體應對方式是一樣的
& h, u! |- ]/ q6 @1 k3 m  c: O, N所以processA要了某個區段 0x0~0x100
: k7 _+ N9 O; _! _8 K7 ^這樣processB就不能使用; ~' p5 [  e  i0 F3 f2 ~6 C
很可能跑了一段時間之後整個系統的memory fragment就會變多5 k4 B: b! R% C$ K- g
對記憶體使用率來講不好
5 x! U: B% S& X9 S( J( t6 I很可能要一次找到大塊的不好找
) Y$ b) [/ D; I: j" w雖然virtual address有4G但是process分一分/ |/ s0 L: u  N! L3 v: w4 N0 M
還是可能不太夠  a" B- F8 S' b6 G4 E; e
# Q  E4 P. K; l# F: T3 W3 v
二、0 Y; W# ]7 S, L' U4 i
processB可以看到processA的address space, T+ ~4 a) {' o. i! e7 b( L& j
表示我可以拿到相對應的資源6 V1 g& j* W8 s$ C* H
這樣惡意程式很容易就得到一些記憶體上的個人資料
8 S5 N! T1 k, ~' b( X! {7 l8 z( \" p& x( B1 j; V6 M( l+ x
有些地方的說明不太容易,太簡略容易造成誤解,贅述又怕不容易
6 P* @3 n; j& b, J理解。沒表達清楚的地方歡迎提出來討論。

評分

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

查看全部評分

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

本版積分規則

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

GMT+8, 2024-11-16 08:11 AM , Processed in 0.154009 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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