Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

從system bus來看系統

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-31 13:36:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
有些基礎不夠深厚  遣詞用句也不是很精確
# m. k! g/ l/ H以下試圖以自己的體認和觀點  以簡單的辭彙
7 e/ K9 r  N1 X) E9 E- f3 e去解釋一些process與系統演進的方式) {2 h# j+ Y% ]4 o8 ]
如果有誤或是清楚的地方  歡迎大家討論3 E) f" w) y9 Y: [" P

* ^( L6 T+ G6 {* A/ s[本文開始]3 o6 W4 z6 F1 F
在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候
$ U6 Y. w2 m8 M' W0 V1 \' `常常會被一下子多出來的專有名詞搞混$ W- b. ]$ ]" e$ b2 `; S( B
像是DMA, memory, cache, mmu, virtual address, physical address 等等
' _" Z5 K# h. j+ ^" _5 X尤其大家一開始接觸電腦都是已經發展很久的x86系統+ M9 R' ^" E7 G. E9 w9 b, l
即使有單晶片系統的實驗課程# ^, o6 b: z4 t
也很難將單晶片的經驗
. d  i/ f7 d& y2 {運用到x86或是已經較為複雜的CPU系統上
# M) x5 w0 X/ |2 ]  B0 {! h2 e9 L" |( ]0 m# N) e2 U& Q! R  K9 m$ a
因為CPU上頭又開始加入了越來越複雜的作業系統* a7 N4 L* |; X2 H9 s
像是作業系統常提到的kernel mode, user mode& P* T" n3 Y) M& e( f  D( V
常常跟上述的專有名詞physical address or virtural address交互使用
$ T4 S* T$ t+ D" n+ z7 u5 d2 b% r例如刻板印象的『作業系統處於kernel mode時,使用physical address』. ^' i1 e+ ?5 D6 @' C+ t$ Y
經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問: F+ v/ n; U' X- w

9 a. L8 @3 C) s1 N9 y5 t# f那應該怎麼簡單來看待一個系統?/ ~' H$ d" d1 N& |
( K+ q% W% @7 C" H& B6 `, w
首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』
# Z  |1 V% b; Y0 g* L他是用來處理各種『資料』* H6 l: E* ^9 `4 l9 v( ]" P
# L/ I& L3 W( m: P2 G- S
那麼這些資料又放在哪邊?他是如何去存取這些資料?9 e4 m& y# o: o; G/ u* U2 q( S

8 X: x7 X% |, z! m  q, ~; v! C通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory$ Q. p9 r+ b, u4 j# }1 ]1 }; F' h

6 L: O, r0 U0 C1 [$ m' V( z到目前為止,我們得到一個簡單的系統 CPU + bus + memory+ f$ l6 N9 J* b( d& T) A2 x8 |7 A' J
! e. x* o8 w  A' k$ Q, x
接著,我們用兩個角度去看這個簡單系統的發展5 T! q' Y, }5 h+ H2 \' |
1. 硬體加速  {( e9 y5 s& b
2. 作業系統
; \+ i7 w2 u2 f3 ~# a! r# ?/ Z8 @% `9 q3 W
我們先從硬體加速的觀點來看這個系統如何改進:' b' s7 ^  V( d( I/ D$ O: v
. N5 P8 B9 P; e  d( V! u
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)
8 R7 ?+ s# k/ o# Q& B2 \" `放在某個地方,然後請你設計好的加速硬體去處理這些資料. n$ p) L! q8 B' X: {2 j: k+ D
可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。% G7 [! S/ k+ U7 f
這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。
3 V0 W( [- r4 S* }( O: F
6 ^2 ?4 D: N- c+ b! n, {* SCPU + arbiter bus + memory + DMA
! e( h& e9 U$ j8 p1 X! h( N3 _' D3 L: I
接著我們從作業系統的角度來看:) y/ l) s- Y* [- X0 r( b
( v, ~! g1 ~# H4 `2 D
一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。
  [4 |# ?7 _, R1 @& \! K8 i+ _2 ^+ B+ O5 B5 `+ {3 {
例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。
4 C* X+ o0 y, x  {" i# r& ~
! j! A4 p# I% Z. j7 }到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。9 J& f/ |* p/ [3 v8 j4 V) z7 B

" e- t; @9 t& \1 N3 m, F所以我們的系統變成了
! d; ?* k/ @% [% I
; u8 v4 W7 a, D/ S* C/ pmulti-mode CPU + MPU + arbiter bus + memory + DMA- O3 K: _1 E* [2 L+ D, n
9 w2 c' r9 i* r: U
因為字數限制,部分貼到回文當中  =)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-7-31 13:43:33 | 只看該作者
接著我們看virtual address和physical address的誕生,這邊相當抽象,需要一些想像。! f) y- Q' s1 }3 U
& F. G- M8 Y. c. s
隨著時代進步,越來越多user program產生,user mode的program目前雖然已經不會因為隨意的存取記憶體,造成OS掛點,可是還是有可能去改到別人的記憶體,因為每個程式共同擁有並使用同一個記憶體和所謂的記憶體空間。5 C" k( x1 d% U5 ^& J( g% S1 C
6 N8 e+ p0 J" J4 L
例如:程式A放在0~128 KBytes,程式B放在512~768KBytes,程式A寫錯位置到B程式的地方,變成程式B毀損,B程式就掛掉了。, S# c9 N! y# K: y# n- S6 y

- n: \" X  K. O; y上述的記憶體使用情況,不僅給programmer帶來困擾,而且變成記憶體必須被事先決定好誰只能用哪邊?只能使用多大?這樣不但得事先規劃,對於記憶體的使用也不是很高,因此MMU的硬體便被提出來。7 M! E! a; z2 r, s0 {& ~

6 U3 m# A; I' D( I簡單來看,MMU記錄著某個虛擬位置所對應到的實體記憶體的位置。$ }4 Z; K: b" Z; h3 }! C4 g  _

  ^( P, a: f6 O) s% R+ e作業系統利用這個特性,為每一個user program先做了一個假的記憶體,每個程式都以為他有很大很大的記憶體空間,其實當程式呼叫malloc的時候,才會去設置MMU將這個user program的假記憶體空間和真實記憶體做個連結。這邊很難解釋清楚,其實每個程式都有一個假的記憶體空間的紀錄表格,當OS做context switch到某個program的時候,MMU也會跟著切到這個table上,以便用到正確的紀錄表格。
+ ~. }4 g4 |4 ~7 `! C0 Q) c' Z$ q. ^2 D4 `# `' N- r
例如:
! \( G+ V: o* _: B' C
) i$ [( V3 C6 N$ @程式A的表格記錄了他配置0~4K,而這4K對應到真實記憶體的128K~132K的區段。+ ^' l) r- m$ v3 T+ x/ f! w6 [
程式B的表格記錄了他配置0~4K,而這4K對應到真實記憶體的132K~136K的區段。) Y$ f) q3 ], j1 y+ p) T
" \& h2 v# i* _
雖然兩個程式自己都以為他是用到0~4K,可是其實真實記憶體所配到的位置不同,作業系統在切換的時候,會同步將虛擬記憶體的紀錄表格做切換,以便使用到正確的對應表。以上是一種例子,各種OS可能採取的設計方式不同,但是概念大多是一樣的,我們可以看得出來,對每個程式來說,它可以有擁有許多假的連續記憶體空間,對程式撰寫,還有記憶體使用率來說,很有效果。
7 |) G# p' C& z. b: `  C- J5 P- ?! H: I6 l
到此,CPU多了MMU,現在大多包含MPU的功能。# }' H5 \$ `" k3 p

3 b% q2 _: N5 F; R: x5 u$ Umuti-mode CPU + MMU + arbiter bus + memory + DMA
! U; R. g, V6 H+ p( R# D6 H, j. o4 c9 d- n# Q5 U
因此OS在kernel mode的時候,如果MMU是打開的,這時候還是使用virtual address。. K; W3 ^* r# H8 V- {
- i$ ~& e% v3 _: w' y  ?
要讓mmu正常工作,必須要設定,要讓他知道你對位址的規劃是如何。
+ Y" a$ U8 F" b# W' f+ A
$ d: R+ V$ _" v+ d& q7 p" U2 ?  `例如:RAM被硬體人員安排到0xFF00 0000的位址,可是你希望RAM被當成從0x0開始,你就可以設定MMU將 0xFF00 0000 對應到 0x0,這樣一來你讀取0x0就會自動轉到0xFF00 0000那邊去。
8 n1 v8 L! J, q1 j2 E% n% K' \$ u, d5 u0 u* J) E. G' }$ d
0x0000 0000 --< mapping >-- 0xFF00 0000
* L) n+ O- K4 }/ c# B* ]! ^; S% m- {; m2 Z+ x. `6 J* @0 i  z- s/ V
作業系統一開始就會初始化這些位址轉換對應的資訊,把它放在所謂的page table裡面,然後把table位址交給MMU,MMU就會依照table的資訊工作。
- f- k3 h" J( ]& G0 {* ]3 y+ o6 N+ I4 L/ v( y% n, `9 X' C1 Q
假如你今天有兩張table,兩張table設定不一樣,MMU只要在這兩張table之間切換,那記憶體對應的方式也會跟著換。. x! m. j/ v; d6 u

6 C' }9 j, g( O9 f這是一個很重要的想法。假如,我每一個process都有自己的 page table,切換process的時候,table也跟著切換,這樣我可以控制每一個process去存取記憶體的方式。假如我是讓所有的process 都共用一個 table,這樣這個table的設定值,就會影響到所有的process。
, Q& a/ \* x. @4 e8 f6 G2 R' r; j9 T7 j7 p" u# [/ A
共用一個table表示每個process用同一個位址去讀寫,透過MMU轉換到的位址是相同的,會讀寫到同一塊。不共用的話,表示processA和processB即使拿同一個位址0x8000 0000去讀寫,可能最後對應到的位址是不同的。" J+ [) T) H5 O- `, T
' l9 G# H* _; U7 |; i
但是這樣的差別就是有什麼好處??
: G5 k8 j: t$ C& A3 r
* X4 H# R/ }& _( j6 I" p因為感覺上複雜化了整個系統,本來我可以很直覺的拿processA傳給我的位址,去讀取它為我準備的資料,現在我可能會因為我使用的 table 不同,就不能在其他process直接使用。感覺很麻煩,要是大家都在同一個 table 工作,不是很簡單嗎?位址空間都是一樣的。
! Y- G- ]" g  b- y0 [% L& G1 f/ t/ f! X+ s1 O0 C
why?!7 ?; X4 S( S+ p" ?$ o% o

5 I9 j- ?" x$ p/ ]" ~; K, o字數又超過啦~   
3#
 樓主| 發表於 2008-7-31 13:46:10 | 只看該作者
一、8 i8 V7 N% Z- U/ p  p4 r3 |
如果大家都在同一個page table上$ c2 D. W# q+ I% _& `$ q
因為彼此用的記憶體應對方式是一樣的* }7 E! i) R8 z2 r
所以processA要了某個區段 0x0~0x1008 B5 }+ w1 j* W- O2 L" a
這樣processB就不能使用/ o) R' ~: }4 B5 R! s
很可能跑了一段時間之後整個系統的memory fragment就會變多
, u2 C; i7 C; p1 b0 g對記憶體使用率來講不好
' I0 V# @$ Q6 Y- D: g0 x) Z( e很可能要一次找到大塊的不好找5 m( r! z# E* U% F
雖然virtual address有4G但是process分一分
2 f2 ]- j+ k+ F  N" O還是可能不太夠
% ?5 E/ b. o5 g* \6 R/ Q  u3 R8 P8 s( `
二、6 G% \1 W( p9 J5 U
processB可以看到processA的address space: P8 s2 U+ Q8 O+ }
表示我可以拿到相對應的資源
. X7 B0 }- Z0 q  e" F這樣惡意程式很容易就得到一些記憶體上的個人資料( [* P: v1 g0 R: Q) S( T
: @% k+ S. s! S% R& }6 b9 H6 z( V
有些地方的說明不太容易,太簡略容易造成誤解,贅述又怕不容易
2 I) d! x: v. A- j理解。沒表達清楚的地方歡迎提出來討論。

評分

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

查看全部評分

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

本版積分規則

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

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

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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