Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

從system bus來看系統

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-31 13:36:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
有些基礎不夠深厚  遣詞用句也不是很精確
3 s5 u$ W8 W8 v# y7 w以下試圖以自己的體認和觀點  以簡單的辭彙, M4 c4 l! r* g6 ?$ H- d5 i
去解釋一些process與系統演進的方式
$ P' q" q3 S1 D8 B* ~: E如果有誤或是清楚的地方  歡迎大家討論- \2 B& F% ?, c: i5 ?

, |2 a- n( |, l9 [4 t[本文開始]! g7 c- p0 f+ b* C) E
在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候( L) X" I5 L; f
常常會被一下子多出來的專有名詞搞混: I* |- u- D. r% w
像是DMA, memory, cache, mmu, virtual address, physical address 等等6 e! o+ J, k9 A3 J
尤其大家一開始接觸電腦都是已經發展很久的x86系統
: V- }- W: t7 d8 P7 I$ M4 w8 ~即使有單晶片系統的實驗課程
4 F2 x& d/ x7 J8 B5 ^也很難將單晶片的經驗- V' q8 X- _9 U
運用到x86或是已經較為複雜的CPU系統上& y# x7 G7 N8 l7 i# a% U
) e0 _+ M5 ?' @6 Q
因為CPU上頭又開始加入了越來越複雜的作業系統1 g( X; V2 S8 l( v# n  X
像是作業系統常提到的kernel mode, user mode
+ I2 K5 s$ J# o常常跟上述的專有名詞physical address or virtural address交互使用
5 A. f8 i' }9 {# p& i$ B$ A  Q. t例如刻板印象的『作業系統處於kernel mode時,使用physical address』3 `; e5 x+ U) u6 c1 d
經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問+ p4 B; m# ^5 J6 S0 `( S+ V2 t( P- Y9 V

2 y( W# q* C0 s9 W$ U那應該怎麼簡單來看待一個系統?
0 u! O" O6 u5 G! q& u0 y
: v0 O# V; B. y首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』
5 S: F6 ~7 o, b7 Y他是用來處理各種『資料』0 T/ C; ?  e3 y2 C# J
1 \3 I% d' O! V- f' h
那麼這些資料又放在哪邊?他是如何去存取這些資料?
! J# Y1 T6 n/ O4 _$ _! z$ O
& @4 {% N  z3 k% j- r) Z通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory
% `( c8 |4 o/ {) m. ^; |& j% B+ E! E# q$ W6 g! S
到目前為止,我們得到一個簡單的系統 CPU + bus + memory. |. m; K9 P) D# x

7 M+ Y1 L+ b1 e: J+ H接著,我們用兩個角度去看這個簡單系統的發展
" p  I4 X7 s* N5 G0 f1. 硬體加速
: M3 O9 v  k% I& U  ~0 q% k! l% u2. 作業系統
+ x  @( C9 Y. |9 c4 @  o% Q+ n% I* f7 a9 L5 B4 W9 x  K, N* V; j' H& `
我們先從硬體加速的觀點來看這個系統如何改進:
: \8 ~$ A5 @/ h& a/ w6 x& a( e0 `) n5 M
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)* q" v- [) U/ b2 T& ^2 K
放在某個地方,然後請你設計好的加速硬體去處理這些資料
3 [- y' x: s9 b0 k4 f7 Y2 d可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。
: b) k/ Z. T6 }* {' q這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。
! Z5 g: S# L7 h
& C( i% ^: ^- c3 T5 S( _" HCPU + arbiter bus + memory + DMA, p( ~# G9 Z, l8 s

" p* Z! D  g6 M接著我們從作業系統的角度來看:
5 k- J/ u7 F: s' W7 T( r: Y- k6 s% C3 ^5 P" o
一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。
7 A0 L; ]3 H: D! y% ?4 c* f
2 C; w/ b& ?! u: s例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。
# A" T0 C! b* [% P/ O$ o
5 u/ @/ }, V6 Q2 G* C) E2 {: z到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。& I! S' D9 \- Q( x1 Y) k. q
* R& w7 T: ?9 F, k1 a$ A0 f
所以我們的系統變成了
. S( T, @, p: q
* @+ G9 c- V* N0 |multi-mode CPU + MPU + arbiter bus + memory + DMA
% L3 A' O- m( E  m- F
) j# \8 {# U* ~1 s7 R因為字數限制,部分貼到回文當中  =)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-7-31 13:43:33 | 只看該作者
接著我們看virtual address和physical address的誕生,這邊相當抽象,需要一些想像。& Z' ]& F2 [# h% c& s4 A0 l

# K" j. q. S( j. B' ]3 J隨著時代進步,越來越多user program產生,user mode的program目前雖然已經不會因為隨意的存取記憶體,造成OS掛點,可是還是有可能去改到別人的記憶體,因為每個程式共同擁有並使用同一個記憶體和所謂的記憶體空間。4 B, g2 _6 J0 Y# q  r2 `, ?

! \" i# w: m" F例如:程式A放在0~128 KBytes,程式B放在512~768KBytes,程式A寫錯位置到B程式的地方,變成程式B毀損,B程式就掛掉了。
& q( A4 k0 G3 N8 J9 j2 ]
7 y  x1 s' u3 \: s: j; W! g上述的記憶體使用情況,不僅給programmer帶來困擾,而且變成記憶體必須被事先決定好誰只能用哪邊?只能使用多大?這樣不但得事先規劃,對於記憶體的使用也不是很高,因此MMU的硬體便被提出來。
: e  |/ s" L2 U9 {5 K! D( `1 J/ l. ]% `+ s
簡單來看,MMU記錄著某個虛擬位置所對應到的實體記憶體的位置。. X0 [2 q* X: ^5 _5 N2 a, Q, ~7 Z
% g: O1 M0 M3 i/ u) V
作業系統利用這個特性,為每一個user program先做了一個假的記憶體,每個程式都以為他有很大很大的記憶體空間,其實當程式呼叫malloc的時候,才會去設置MMU將這個user program的假記憶體空間和真實記憶體做個連結。這邊很難解釋清楚,其實每個程式都有一個假的記憶體空間的紀錄表格,當OS做context switch到某個program的時候,MMU也會跟著切到這個table上,以便用到正確的紀錄表格。
- ^3 M7 \# n& p& Y, m* ]% j5 g7 \0 Z2 Y
例如:$ _5 a4 V2 g. A# S$ K% s: J% w

% M% g8 L% K) q  G: `程式A的表格記錄了他配置0~4K,而這4K對應到真實記憶體的128K~132K的區段。% f  W3 v7 r5 ]" }* c5 t
程式B的表格記錄了他配置0~4K,而這4K對應到真實記憶體的132K~136K的區段。
; l  M2 Z+ ~. d$ t( v; Y$ d% Q+ z: t; R5 X9 c
雖然兩個程式自己都以為他是用到0~4K,可是其實真實記憶體所配到的位置不同,作業系統在切換的時候,會同步將虛擬記憶體的紀錄表格做切換,以便使用到正確的對應表。以上是一種例子,各種OS可能採取的設計方式不同,但是概念大多是一樣的,我們可以看得出來,對每個程式來說,它可以有擁有許多假的連續記憶體空間,對程式撰寫,還有記憶體使用率來說,很有效果。* c( r0 m. g; ~- p& m; R3 f% N
3 o* ^1 V1 q) i  \4 `
到此,CPU多了MMU,現在大多包含MPU的功能。/ r- ^( u$ S+ R, A% ?
4 \' v" I) D' S* J
muti-mode CPU + MMU + arbiter bus + memory + DMA
* ^1 r4 s+ b( q3 I( e# d1 `
! B* a  \/ o  K' g' W: k% j& B因此OS在kernel mode的時候,如果MMU是打開的,這時候還是使用virtual address。
& p" _: a2 ?. U0 m- M# u& `
3 k6 I" s$ ?; Y) c5 n- ^- L要讓mmu正常工作,必須要設定,要讓他知道你對位址的規劃是如何。, f% S8 d  y8 c; j/ s( D
% m* r/ |/ I* a+ C
例如:RAM被硬體人員安排到0xFF00 0000的位址,可是你希望RAM被當成從0x0開始,你就可以設定MMU將 0xFF00 0000 對應到 0x0,這樣一來你讀取0x0就會自動轉到0xFF00 0000那邊去。) j$ G1 a( j) A& t: |/ j
4 l/ C5 D% }# }
0x0000 0000 --< mapping >-- 0xFF00 0000
2 z: w+ F/ }0 k( t4 q% y3 J# q7 _# X' f: d& A% u( e/ W
作業系統一開始就會初始化這些位址轉換對應的資訊,把它放在所謂的page table裡面,然後把table位址交給MMU,MMU就會依照table的資訊工作。
4 l( X7 ^. P6 P3 @$ ]4 m0 s
% o  ~; |2 u5 B# x3 c" b8 U假如你今天有兩張table,兩張table設定不一樣,MMU只要在這兩張table之間切換,那記憶體對應的方式也會跟著換。* M, q' b% D( L# Y0 Z; h. ^
1 c0 s* s4 j9 x. G4 Q
這是一個很重要的想法。假如,我每一個process都有自己的 page table,切換process的時候,table也跟著切換,這樣我可以控制每一個process去存取記憶體的方式。假如我是讓所有的process 都共用一個 table,這樣這個table的設定值,就會影響到所有的process。
6 o! N" n2 s5 q, ~, X
! [' f3 O, }' L6 n6 y( v6 l共用一個table表示每個process用同一個位址去讀寫,透過MMU轉換到的位址是相同的,會讀寫到同一塊。不共用的話,表示processA和processB即使拿同一個位址0x8000 0000去讀寫,可能最後對應到的位址是不同的。5 w8 p$ A" r) ?

2 V% s* p6 W* ^- t- Z2 U7 R但是這樣的差別就是有什麼好處??- |0 D. p  p. Q7 Y( c6 q" H  n( z

5 w4 D8 v  A, p& S/ N  \; a因為感覺上複雜化了整個系統,本來我可以很直覺的拿processA傳給我的位址,去讀取它為我準備的資料,現在我可能會因為我使用的 table 不同,就不能在其他process直接使用。感覺很麻煩,要是大家都在同一個 table 工作,不是很簡單嗎?位址空間都是一樣的。, P4 W. N$ b& W# X$ |) O/ L
( n; d% I" h5 Y8 c
why?!
: z+ w$ p! M3 S
1 t5 X4 s4 n( _! e字數又超過啦~   
3#
 樓主| 發表於 2008-7-31 13:46:10 | 只看該作者
一、6 Z) ?  s9 L) K1 U0 W6 M
如果大家都在同一個page table上
. F# i( k/ I! \  G% }" F/ j" B& M因為彼此用的記憶體應對方式是一樣的4 T) S4 C: S+ _* s! a) X$ v
所以processA要了某個區段 0x0~0x100
6 t) A8 R2 a7 b3 y' x; q這樣processB就不能使用
# j3 H$ ~$ B( A很可能跑了一段時間之後整個系統的memory fragment就會變多+ g3 K, E( N9 ~
對記憶體使用率來講不好& s; X  M) G4 C3 A' K. f
很可能要一次找到大塊的不好找4 N, N2 q9 h- w
雖然virtual address有4G但是process分一分
* S" L( i5 m+ q/ V: v還是可能不太夠
6 o. {4 m1 e# {" N6 ~4 \
7 Z: Z7 c& B; J4 N" F% y0 u二、
$ p$ t% L- \. n' |processB可以看到processA的address space: }: g0 [  ^1 N7 D& h# p$ g3 |
表示我可以拿到相對應的資源" Z8 K$ g& Z- P% ?' |1 X3 |
這樣惡意程式很容易就得到一些記憶體上的個人資料
: H: e& q/ A' V9 {* M- d( W6 V" E* m
有些地方的說明不太容易,太簡略容易造成誤解,贅述又怕不容易, g" ~' w& k) p
理解。沒表達清楚的地方歡迎提出來討論。

評分

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

查看全部評分

4#
發表於 2008-7-31 20:44:39 | 只看該作者
希望大大以後多多發表文章.
# X- N: |/ N8 f5 D* q# @透過大大生動的描述.很多複雜的概念就淺顯易懂了.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-21 03:38 PM , Processed in 0.169010 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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