Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

從system bus來看系統

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-31 13:36:49 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
有些基礎不夠深厚  遣詞用句也不是很精確
2 B% B2 |* t6 H以下試圖以自己的體認和觀點  以簡單的辭彙
+ F  U* {4 R5 k去解釋一些process與系統演進的方式
5 `# [* s' C* L0 I' F如果有誤或是清楚的地方  歡迎大家討論
! I( `% `7 C' j7 B+ O
1 t- [! z! t2 z( }! V[本文開始]
. W3 z1 l5 e$ {$ e在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候
( _# x7 O% H, o/ z& N常常會被一下子多出來的專有名詞搞混1 J1 F9 a( y+ t: {. l
像是DMA, memory, cache, mmu, virtual address, physical address 等等
& n: A& R/ }. i7 o5 s1 z8 x/ l尤其大家一開始接觸電腦都是已經發展很久的x86系統: l! B5 n2 b- d8 A( V
即使有單晶片系統的實驗課程6 ^6 i4 G, X1 Y  }
也很難將單晶片的經驗
! w6 r3 T3 A: J3 n9 Z運用到x86或是已經較為複雜的CPU系統上$ ?- w% b& l# H) F) B6 k  A  J

8 V, r3 l4 ]9 u3 p- [2 Y8 W因為CPU上頭又開始加入了越來越複雜的作業系統% b6 B! [8 G+ h0 }# S. e
像是作業系統常提到的kernel mode, user mode* ?/ b5 P2 j7 H# x* z' i& E
常常跟上述的專有名詞physical address or virtural address交互使用% C1 `% X2 g8 U( @
例如刻板印象的『作業系統處於kernel mode時,使用physical address』$ L6 i8 Q2 P! \+ q. {7 l
經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問
. E4 P. m# ]& x& A
7 i- W* k: c4 R4 ~那應該怎麼簡單來看待一個系統?
* F% Z) W: g2 X& \" ^+ T4 h( u, u7 q' A* F
首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』
% D9 W( p. f* K, W" I4 y他是用來處理各種『資料』
+ m8 L0 \* `5 ]4 u9 N: S1 l! h! x+ r1 i7 J
那麼這些資料又放在哪邊?他是如何去存取這些資料?$ b+ Z2 \5 @* P( J4 V8 e: y& E1 T

. `  ?& [3 }! Y6 ^: h9 |通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory
' Z" q  k) H4 ]2 o, `  R7 B
7 ~& c! @/ n6 a' H9 y( f到目前為止,我們得到一個簡單的系統 CPU + bus + memory% z6 J* E+ V( O) k* P0 y3 e

' [) N; w* ~0 ~! B  _接著,我們用兩個角度去看這個簡單系統的發展
5 Z( h- C2 A1 f  a1. 硬體加速
4 }% v, e7 N4 J* _- `- O% g2. 作業系統+ N  y: w1 r. A) n

. X2 p  s- A/ V" v我們先從硬體加速的觀點來看這個系統如何改進:" |8 ~) T5 T9 F7 @. X3 `# V2 V7 U
. U& w  l" D' i  u
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)
" A9 J/ N( l( u% v放在某個地方,然後請你設計好的加速硬體去處理這些資料
' h+ Y, u; y8 l4 B" @$ f5 z/ a可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。; f5 n! B4 \* q+ ^. F6 J
這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。
- l4 S4 A: x# q2 H3 c4 s
  x2 l! x7 p. ]- R. |2 T: bCPU + arbiter bus + memory + DMA
! c9 e; ~5 v: p$ J6 g. G1 g8 s  {
接著我們從作業系統的角度來看:. K9 n0 U7 I* i" b1 S: k/ d
" U6 y5 C# V$ Q1 u8 B7 o' p
一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。
! P4 [0 a0 `1 }* V" b0 R6 Q( d( ?+ M3 d6 w8 {
例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。
/ T! I$ H9 Q# y
* N# x' t* j: U, p3 g4 a到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。
9 i$ w" p. R2 v
2 x2 f3 x  R1 r' N所以我們的系統變成了
; W; q6 e) S1 r
8 B" q' [) \8 x, X' m) imulti-mode CPU + MPU + arbiter bus + memory + DMA
) C" H  c2 k8 i% Z7 O
- u5 ~0 M' V6 X9 \因為字數限制,部分貼到回文當中  =)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
4#
發表於 2008-7-31 20:44:39 | 只看該作者
希望大大以後多多發表文章.
+ i$ w  W' O; U, ~3 a透過大大生動的描述.很多複雜的概念就淺顯易懂了.
3#
 樓主| 發表於 2008-7-31 13:46:10 | 只看該作者
一、
6 b0 w6 u$ P! |如果大家都在同一個page table上
! L4 _* Y9 g5 k$ @3 k因為彼此用的記憶體應對方式是一樣的# y6 N9 W4 |3 M2 A9 _- p' V
所以processA要了某個區段 0x0~0x100& K8 T! S2 I/ `
這樣processB就不能使用
0 V1 u# A* f6 V7 W很可能跑了一段時間之後整個系統的memory fragment就會變多
+ y( ^3 l- [6 @) b對記憶體使用率來講不好4 x& @9 X: W. ^$ h8 o: Z1 z, T
很可能要一次找到大塊的不好找
! y* F! _: ]2 n. F9 O: X/ O! o雖然virtual address有4G但是process分一分% f; F* ?/ U( l& m& V1 N7 u% ~: y
還是可能不太夠9 W" R9 k$ s$ R0 s; k5 [# [+ z

: _, J/ m8 R: c  z二、
5 O! U) b2 y# T& J8 oprocessB可以看到processA的address space0 E) u$ O' ^& l1 ]
表示我可以拿到相對應的資源2 o  E0 Y  Z7 u
這樣惡意程式很容易就得到一些記憶體上的個人資料; ?0 g5 A7 v/ ]
2 R; @4 b. }: N# Y) @
有些地方的說明不太容易,太簡略容易造成誤解,贅述又怕不容易* c2 o, C8 ?4 u' o( N
理解。沒表達清楚的地方歡迎提出來討論。

評分

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

查看全部評分

2#
 樓主| 發表於 2008-7-31 13:43:33 | 只看該作者
接著我們看virtual address和physical address的誕生,這邊相當抽象,需要一些想像。% i# m8 k0 o0 r, ?1 G8 K! D$ M8 y
* p% D/ g* T% T2 W" w4 p9 |
隨著時代進步,越來越多user program產生,user mode的program目前雖然已經不會因為隨意的存取記憶體,造成OS掛點,可是還是有可能去改到別人的記憶體,因為每個程式共同擁有並使用同一個記憶體和所謂的記憶體空間。; v7 H6 a1 c7 S/ U  Y( k

( U/ }# z; ?2 n例如:程式A放在0~128 KBytes,程式B放在512~768KBytes,程式A寫錯位置到B程式的地方,變成程式B毀損,B程式就掛掉了。% L& U$ _6 g* Q

! [9 W6 A- p( T; l4 W9 K上述的記憶體使用情況,不僅給programmer帶來困擾,而且變成記憶體必須被事先決定好誰只能用哪邊?只能使用多大?這樣不但得事先規劃,對於記憶體的使用也不是很高,因此MMU的硬體便被提出來。
' z8 j, S; t7 r( i- b. j# k* M  T4 [1 }1 m# k% u
簡單來看,MMU記錄著某個虛擬位置所對應到的實體記憶體的位置。4 m. w% N& e$ O5 S6 y) F  Q5 }, b
0 h3 i9 R  T" e( J- i9 r
作業系統利用這個特性,為每一個user program先做了一個假的記憶體,每個程式都以為他有很大很大的記憶體空間,其實當程式呼叫malloc的時候,才會去設置MMU將這個user program的假記憶體空間和真實記憶體做個連結。這邊很難解釋清楚,其實每個程式都有一個假的記憶體空間的紀錄表格,當OS做context switch到某個program的時候,MMU也會跟著切到這個table上,以便用到正確的紀錄表格。
- {- S+ ^) H/ s/ B4 k9 Q6 X
, j" z; ^' }: ^4 _8 d例如:# q; [* N7 \% H# _- W4 r

" Y/ B( G3 _; c9 r5 e+ p程式A的表格記錄了他配置0~4K,而這4K對應到真實記憶體的128K~132K的區段。
$ P5 g6 a4 b2 p* f  \0 U程式B的表格記錄了他配置0~4K,而這4K對應到真實記憶體的132K~136K的區段。' v" s9 }; [  @  q
) `+ U5 N  o% E1 A
雖然兩個程式自己都以為他是用到0~4K,可是其實真實記憶體所配到的位置不同,作業系統在切換的時候,會同步將虛擬記憶體的紀錄表格做切換,以便使用到正確的對應表。以上是一種例子,各種OS可能採取的設計方式不同,但是概念大多是一樣的,我們可以看得出來,對每個程式來說,它可以有擁有許多假的連續記憶體空間,對程式撰寫,還有記憶體使用率來說,很有效果。5 a9 ~. R! v' A9 w

+ ~# y0 c! J  y8 p9 ^& X0 \到此,CPU多了MMU,現在大多包含MPU的功能。- V! @8 [9 t8 t4 c5 Y4 m1 M( z
; [" O8 @0 {! f$ b8 e$ d
muti-mode CPU + MMU + arbiter bus + memory + DMA
- k% \8 S( h8 L: s! b  |: ?1 O! Z$ F/ U" N, c
因此OS在kernel mode的時候,如果MMU是打開的,這時候還是使用virtual address。
/ M3 C4 z, G7 W8 Z' z/ D1 ^. q; s  U. i8 `, ~$ Y* S
要讓mmu正常工作,必須要設定,要讓他知道你對位址的規劃是如何。, @! P* {2 a4 f6 y* E

/ O, \, m( Q0 g1 r例如:RAM被硬體人員安排到0xFF00 0000的位址,可是你希望RAM被當成從0x0開始,你就可以設定MMU將 0xFF00 0000 對應到 0x0,這樣一來你讀取0x0就會自動轉到0xFF00 0000那邊去。
: Y3 }' X  z& j3 m3 k
3 Y3 }$ ]" i+ p3 D, o4 L! @0x0000 0000 --< mapping >-- 0xFF00 00004 {5 T- x$ J/ f( K$ _
9 Z: \5 V! n4 g& e0 x; @# E/ u/ r
作業系統一開始就會初始化這些位址轉換對應的資訊,把它放在所謂的page table裡面,然後把table位址交給MMU,MMU就會依照table的資訊工作。
7 [0 j8 a: ~7 m) C' e
* H9 a1 H2 H0 _0 r假如你今天有兩張table,兩張table設定不一樣,MMU只要在這兩張table之間切換,那記憶體對應的方式也會跟著換。1 b) L/ |! B; i/ J4 C6 k; ~: u2 y
2 C) a" `3 `' s$ _, M+ x+ x/ f
這是一個很重要的想法。假如,我每一個process都有自己的 page table,切換process的時候,table也跟著切換,這樣我可以控制每一個process去存取記憶體的方式。假如我是讓所有的process 都共用一個 table,這樣這個table的設定值,就會影響到所有的process。5 ?" W6 S- |# K- `- x' ]% ~. u) A

/ _7 @4 j/ f4 Z2 F+ I' q8 S共用一個table表示每個process用同一個位址去讀寫,透過MMU轉換到的位址是相同的,會讀寫到同一塊。不共用的話,表示processA和processB即使拿同一個位址0x8000 0000去讀寫,可能最後對應到的位址是不同的。
/ N+ Z2 q! L3 O# d9 |7 ?1 ]" f6 b1 D/ o3 H0 Y+ b
但是這樣的差別就是有什麼好處??. x( ~: z' O- a

  _, t. g- L/ y3 i% u因為感覺上複雜化了整個系統,本來我可以很直覺的拿processA傳給我的位址,去讀取它為我準備的資料,現在我可能會因為我使用的 table 不同,就不能在其他process直接使用。感覺很麻煩,要是大家都在同一個 table 工作,不是很簡單嗎?位址空間都是一樣的。) Y7 h7 q  v+ B. C: E; {* [$ N

: H+ p3 G' u) K( i1 lwhy?!& g2 [, t- n8 \3 o' d; j

6 G* A9 U, K  D1 H- {字數又超過啦~   
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-12-29 04:35 PM , Processed in 0.163009 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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