Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

從system bus來看系統

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-31 13:36:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
有些基礎不夠深厚  遣詞用句也不是很精確3 ]# U/ M$ t- k! c, B2 ?
以下試圖以自己的體認和觀點  以簡單的辭彙
% A( k9 _0 `8 [, b7 S' e去解釋一些process與系統演進的方式
( H4 X5 I$ b0 @$ S: S如果有誤或是清楚的地方  歡迎大家討論$ x; g# E3 i* B# N/ U# C

* E! d  l  ^/ h. f* ?- V1 w[本文開始]
, @7 L( L! x3 g9 ?4 N7 ~在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候4 F7 z7 L. m& a1 b+ z
常常會被一下子多出來的專有名詞搞混
$ D$ G* R# V( [. U. N3 |* d像是DMA, memory, cache, mmu, virtual address, physical address 等等4 I# ~2 C1 c* f8 w
尤其大家一開始接觸電腦都是已經發展很久的x86系統6 y- q7 U* {) h7 N3 i8 k3 z8 s7 C
即使有單晶片系統的實驗課程& M: [8 U# k$ x+ p$ Z$ m* P
也很難將單晶片的經驗0 k+ a$ @  N" M7 z9 @
運用到x86或是已經較為複雜的CPU系統上
' ^1 @2 b6 V( _; h' m3 l' [: j7 i5 ]1 c: Z
因為CPU上頭又開始加入了越來越複雜的作業系統7 Z: r. `( H& t  W  Q. k* T5 T
像是作業系統常提到的kernel mode, user mode
0 Z1 _3 s! H3 W; W# M7 I常常跟上述的專有名詞physical address or virtural address交互使用
0 i: R8 ^$ @# @3 \7 z例如刻板印象的『作業系統處於kernel mode時,使用physical address』1 y2 A! x# S3 F" p. t6 M3 G7 _
經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問
' ~2 c  Q8 y- V; A! R3 y
6 |) J! c! F% j: J那應該怎麼簡單來看待一個系統?
( R, N$ h0 n$ E; e9 |4 H: H/ }2 u+ N" s4 H; w# q: m
首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』- C0 b7 V1 {% |
他是用來處理各種『資料』
7 ?/ C# O0 g4 E5 Y9 s1 Q) A/ F1 I5 n9 \' P; e
那麼這些資料又放在哪邊?他是如何去存取這些資料?6 _; _, Y% r9 L% t; f! K4 Y" c' x
5 J7 Z* g; i1 T: m
通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory
5 `: B& M# [/ l6 x; f7 T( R2 G
3 @: n1 u1 [( A0 s+ O9 T# a  m! g1 y到目前為止,我們得到一個簡單的系統 CPU + bus + memory- S7 [4 s7 j* c4 g% {* u
2 T3 b# |! Z1 e; d
接著,我們用兩個角度去看這個簡單系統的發展
0 e, f% N7 e, E7 N: N) z" `1. 硬體加速
3 j9 C: q1 I- y+ i1 z2. 作業系統4 a) a. o: }+ W
/ x) _7 n2 |% i3 N6 B2 ?1 `
我們先從硬體加速的觀點來看這個系統如何改進:- o) F' f3 v; R; {$ q5 ]6 Y1 x
( S/ N; a1 `1 g3 v& Y& {) k
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)
7 V6 o  G# ]* b1 {+ c! Z2 q3 J7 v放在某個地方,然後請你設計好的加速硬體去處理這些資料
9 u2 g0 b- [0 ?7 e可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。
% h/ Y9 [! ^4 H" M& G2 z這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。& O8 T* q7 I* C8 A( q
$ }7 M( ^, W) m/ A/ ^
CPU + arbiter bus + memory + DMA$ B: s7 U) R- m1 R4 D

+ @) i. V& F3 N) O5 Y接著我們從作業系統的角度來看:7 N( B# o/ O) s. o" A. O( o

# B* |0 Y9 [, a$ I5 S一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。) m6 K4 z- M' Q4 q8 A) \" _

8 n" g6 D, {* V( ?' p9 S  i例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。
' [- A3 x; y0 b' D) ?1 Q) u) ^3 b$ p! `% n8 G
到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。/ Y- i9 O! k3 c
7 X) }* B8 T! T& Z" [
所以我們的系統變成了
0 g8 A- I) g0 l5 N
$ j1 S) K8 w( s( b" D. h8 L) }multi-mode CPU + MPU + arbiter bus + memory + DMA
. P* s* X0 b6 P1 s% V8 V, U. s; z% P6 {! _
因為字數限制,部分貼到回文當中  =)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-7-31 13:43:33 | 只看該作者
接著我們看virtual address和physical address的誕生,這邊相當抽象,需要一些想像。
* Q% [% c- w6 @+ [+ u, s: e* l' u; x5 U) r  T4 w7 n& Q
隨著時代進步,越來越多user program產生,user mode的program目前雖然已經不會因為隨意的存取記憶體,造成OS掛點,可是還是有可能去改到別人的記憶體,因為每個程式共同擁有並使用同一個記憶體和所謂的記憶體空間。6 p: V0 T' H9 e7 Y5 r- Y

/ K: i: ?7 L) f4 m6 [6 B5 t# y例如:程式A放在0~128 KBytes,程式B放在512~768KBytes,程式A寫錯位置到B程式的地方,變成程式B毀損,B程式就掛掉了。
7 G5 Y2 u9 r( ~, p" E
7 B. J9 Q' Y0 G3 K: X  L# a上述的記憶體使用情況,不僅給programmer帶來困擾,而且變成記憶體必須被事先決定好誰只能用哪邊?只能使用多大?這樣不但得事先規劃,對於記憶體的使用也不是很高,因此MMU的硬體便被提出來。
, \' [: {; M" h$ V3 ]  T* B+ V  \; `/ m4 [* Y# U" {& p& ?- ?$ R
簡單來看,MMU記錄著某個虛擬位置所對應到的實體記憶體的位置。
; [0 R. Y  }% ?4 s$ ]% n
) C% B2 ~% d9 ]( i作業系統利用這個特性,為每一個user program先做了一個假的記憶體,每個程式都以為他有很大很大的記憶體空間,其實當程式呼叫malloc的時候,才會去設置MMU將這個user program的假記憶體空間和真實記憶體做個連結。這邊很難解釋清楚,其實每個程式都有一個假的記憶體空間的紀錄表格,當OS做context switch到某個program的時候,MMU也會跟著切到這個table上,以便用到正確的紀錄表格。
; K) N( f9 r) q$ @% {9 z4 m. i+ ~% {3 A, ~) b) f$ W
例如:
! c, q$ F' {. }/ _/ `2 `4 H8 F- Q. f5 T. a9 O
程式A的表格記錄了他配置0~4K,而這4K對應到真實記憶體的128K~132K的區段。6 z0 D4 a  {3 U, Q
程式B的表格記錄了他配置0~4K,而這4K對應到真實記憶體的132K~136K的區段。+ h) n- p5 y- d' H

8 i  Y3 q9 ~) z+ n雖然兩個程式自己都以為他是用到0~4K,可是其實真實記憶體所配到的位置不同,作業系統在切換的時候,會同步將虛擬記憶體的紀錄表格做切換,以便使用到正確的對應表。以上是一種例子,各種OS可能採取的設計方式不同,但是概念大多是一樣的,我們可以看得出來,對每個程式來說,它可以有擁有許多假的連續記憶體空間,對程式撰寫,還有記憶體使用率來說,很有效果。) g$ b5 c* f2 C$ @$ W: T; o. t
& x/ ?5 q7 k4 H6 Y' q! u# T4 q
到此,CPU多了MMU,現在大多包含MPU的功能。, o9 s7 @5 a6 X; q( }( Q
2 Y" |6 l  h9 w
muti-mode CPU + MMU + arbiter bus + memory + DMA7 u4 L+ ?" z/ s

3 b" L* a: u, \0 c因此OS在kernel mode的時候,如果MMU是打開的,這時候還是使用virtual address。4 o. z, a$ K: I* }  [$ W

, I. ?" d. r$ X要讓mmu正常工作,必須要設定,要讓他知道你對位址的規劃是如何。+ @  D2 M- \7 v( |9 i( W* c! y# i
4 d1 d+ g& I. s6 S: {2 n2 m
例如:RAM被硬體人員安排到0xFF00 0000的位址,可是你希望RAM被當成從0x0開始,你就可以設定MMU將 0xFF00 0000 對應到 0x0,這樣一來你讀取0x0就會自動轉到0xFF00 0000那邊去。
% H# P8 d1 g. V" W/ C. T
- J: d4 B# x, T0x0000 0000 --< mapping >-- 0xFF00 0000
( a  ?- I  v4 X4 O' I2 x, E3 c
作業系統一開始就會初始化這些位址轉換對應的資訊,把它放在所謂的page table裡面,然後把table位址交給MMU,MMU就會依照table的資訊工作。7 u$ q: r6 Q/ N. a; o/ X' D
2 g6 {, R. X' W2 Q
假如你今天有兩張table,兩張table設定不一樣,MMU只要在這兩張table之間切換,那記憶體對應的方式也會跟著換。. ~. D* {. v* D: n% f5 g/ f

( ]0 \3 w6 ]+ @  _/ _8 e) j這是一個很重要的想法。假如,我每一個process都有自己的 page table,切換process的時候,table也跟著切換,這樣我可以控制每一個process去存取記憶體的方式。假如我是讓所有的process 都共用一個 table,這樣這個table的設定值,就會影響到所有的process。! V* v- x& \( q* f3 p% l# j

/ f& x9 n. \+ x- g6 w共用一個table表示每個process用同一個位址去讀寫,透過MMU轉換到的位址是相同的,會讀寫到同一塊。不共用的話,表示processA和processB即使拿同一個位址0x8000 0000去讀寫,可能最後對應到的位址是不同的。/ Z4 [. \; c9 S1 @& z4 e8 |3 V! F0 v. c
8 S) ]  ?* }% i7 t
但是這樣的差別就是有什麼好處??
4 l1 W) T0 }' F4 _+ X& c  k: W( E9 ^
因為感覺上複雜化了整個系統,本來我可以很直覺的拿processA傳給我的位址,去讀取它為我準備的資料,現在我可能會因為我使用的 table 不同,就不能在其他process直接使用。感覺很麻煩,要是大家都在同一個 table 工作,不是很簡單嗎?位址空間都是一樣的。
& ^) b  j0 w% K) Y& M+ a+ ~
0 ]  c- `1 K+ C# ^4 g8 Jwhy?!
) V6 `$ ?: L3 \: }* G7 [- k0 C! b5 W8 ^
字數又超過啦~   
3#
 樓主| 發表於 2008-7-31 13:46:10 | 只看該作者
一、, ~4 [  p' ^8 F. K' g/ d
如果大家都在同一個page table上5 ^! b3 U& r: S+ q! K$ u5 {
因為彼此用的記憶體應對方式是一樣的. H  J, J+ Q+ B( H) q
所以processA要了某個區段 0x0~0x100
" u0 `( N, a" ]4 }這樣processB就不能使用  o  `8 u- w" c* Q9 f. m
很可能跑了一段時間之後整個系統的memory fragment就會變多8 X* |0 Y2 X+ }4 Q$ N5 N
對記憶體使用率來講不好5 o/ Y) i+ |) C- {
很可能要一次找到大塊的不好找
2 o9 I  s0 A0 I6 K: u雖然virtual address有4G但是process分一分
% o0 E  n* O) ^' |9 k還是可能不太夠
- i+ A' M( s" a  U
- o* H  t3 Y: t3 k# [2 k* _二、
0 ^& g; @9 {4 n) g" ~5 C- ?. ZprocessB可以看到processA的address space4 {0 j! Z- S4 s
表示我可以拿到相對應的資源" _& o# o, i. G$ g: z9 S1 q
這樣惡意程式很容易就得到一些記憶體上的個人資料: |6 S8 C  z0 G1 h* s, {& F

% P: P  N0 `/ ?6 s6 c有些地方的說明不太容易,太簡略容易造成誤解,贅述又怕不容易1 b+ P( m$ l7 d1 b* o
理解。沒表達清楚的地方歡迎提出來討論。

評分

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

查看全部評分

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

本版積分規則

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

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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