Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

從system bus來看系統

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-31 13:36:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
有些基礎不夠深厚  遣詞用句也不是很精確
1 T% O$ m5 {* a以下試圖以自己的體認和觀點  以簡單的辭彙
1 D1 N7 u0 l' W4 @. i; b: K去解釋一些process與系統演進的方式
" |) x* @( \! g8 R4 Y- z, S如果有誤或是清楚的地方  歡迎大家討論! g0 K. U8 E5 W, `1 q) H

! `1 r' }% \: v# \& l' w+ b[本文開始]
  Z6 [" A! D# T: y- o& V在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候
5 M, G3 [  ?9 ]0 O常常會被一下子多出來的專有名詞搞混$ |" C* K2 z1 G
像是DMA, memory, cache, mmu, virtual address, physical address 等等
0 |) v: J+ L6 P/ O, [* H# m" P" n尤其大家一開始接觸電腦都是已經發展很久的x86系統
- \& r+ K  V$ F& S; h7 l; i, A5 {即使有單晶片系統的實驗課程
: x+ {9 O! {) u  \0 R2 l' c也很難將單晶片的經驗
; W, M, z! Z! t: l) k0 c9 x" |運用到x86或是已經較為複雜的CPU系統上3 [) W/ ^# }6 z& B' }) S2 s- `3 u

0 |6 g" a0 B0 R& s% L因為CPU上頭又開始加入了越來越複雜的作業系統3 F+ E: [2 F4 X7 W8 a9 g
像是作業系統常提到的kernel mode, user mode, `) _" ?$ z3 c. i0 w3 [
常常跟上述的專有名詞physical address or virtural address交互使用
, S1 e& l9 F' j3 }  A/ _例如刻板印象的『作業系統處於kernel mode時,使用physical address』
7 m6 r# R* l9 Z0 M, C6 G" W經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問8 u! L* ~+ L; V, T5 B* i) F# h
, i# w" i; d1 ~- I% f! |; f1 t
那應該怎麼簡單來看待一個系統?
) ]9 B* G2 d  {$ N2 ]- E7 J+ N8 y4 B1 _# Q- F
首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』/ t: }  y7 n3 @0 f% n
他是用來處理各種『資料』' n4 @/ q& p" N, S

0 Z$ _8 [) \; q! r那麼這些資料又放在哪邊?他是如何去存取這些資料?' \$ C# ^( ^. {  v0 i7 x) c& F

0 @! O: L! t8 A3 Y通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory
! A' H* n4 b- D( _, {5 v' M
* a+ P; c* V' J, j, H  M到目前為止,我們得到一個簡單的系統 CPU + bus + memory2 \2 g( q- L0 r

5 `, G4 Z, P3 c接著,我們用兩個角度去看這個簡單系統的發展6 W* T% f( h. e5 P3 ]0 F+ k
1. 硬體加速
% I; l% E; Z' @! {' D8 W, {' g2. 作業系統4 v* ]& c, p" S1 d
) u/ x  G3 w  ~1 q% z
我們先從硬體加速的觀點來看這個系統如何改進:2 G$ a* F; n7 E: `1 r  f

& g: X6 G9 C( z! m% A3 a首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)
% i7 C; _% o2 Q: k% ?放在某個地方,然後請你設計好的加速硬體去處理這些資料
" m8 r9 o; ]5 {/ j0 p6 \4 ]可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。: T% }2 y. Q- A
這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。- v( C. _. Y& K/ R; }1 l( V/ a% V

) ~+ E+ e4 p# t; Y- q" h+ O, s& t& ?CPU + arbiter bus + memory + DMA
" u2 h6 K) G" B$ v
7 Y9 H8 }) S. v0 F接著我們從作業系統的角度來看:3 `0 \( d% a6 C' P  Y( D2 g/ @

# D# \9 u4 e% q/ d一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。5 T) |- G; V" O$ U6 ~+ N
  ^; t; k8 `8 ~4 o
例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。
; t* K/ ]7 I" Y
0 u# d: i$ @4 c到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。5 u0 M) l3 P! ?& H" `: T8 e6 O
9 m9 U, a4 ~$ [
所以我們的系統變成了( v, n) s/ E2 U& G
4 [" {; w) P4 N8 D/ ~1 b. {
multi-mode CPU + MPU + arbiter bus + memory + DMA7 H- e! T" q$ {# ]* H7 T# X

5 V& t: Q# U7 N; P1 k  u因為字數限制,部分貼到回文當中  =)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-7-31 13:43:33 | 只看該作者
接著我們看virtual address和physical address的誕生,這邊相當抽象,需要一些想像。
5 P9 y2 E. C0 {; b$ Q# \3 h7 g* [/ t0 q' |% i3 T2 O
隨著時代進步,越來越多user program產生,user mode的program目前雖然已經不會因為隨意的存取記憶體,造成OS掛點,可是還是有可能去改到別人的記憶體,因為每個程式共同擁有並使用同一個記憶體和所謂的記憶體空間。+ `, s* M5 L2 A& S0 Y* p0 V- ?
# A1 g# f/ m  X4 l9 Y8 I
例如:程式A放在0~128 KBytes,程式B放在512~768KBytes,程式A寫錯位置到B程式的地方,變成程式B毀損,B程式就掛掉了。, ^, T( e" f6 i8 K
! Q) p* W* z3 I% m
上述的記憶體使用情況,不僅給programmer帶來困擾,而且變成記憶體必須被事先決定好誰只能用哪邊?只能使用多大?這樣不但得事先規劃,對於記憶體的使用也不是很高,因此MMU的硬體便被提出來。
1 }0 K- E1 V: \
: I" p3 m) _+ |2 C3 v簡單來看,MMU記錄著某個虛擬位置所對應到的實體記憶體的位置。: Y& R. V+ R6 ^+ [
7 r6 s, D8 h! ], N; d# Q$ [, v
作業系統利用這個特性,為每一個user program先做了一個假的記憶體,每個程式都以為他有很大很大的記憶體空間,其實當程式呼叫malloc的時候,才會去設置MMU將這個user program的假記憶體空間和真實記憶體做個連結。這邊很難解釋清楚,其實每個程式都有一個假的記憶體空間的紀錄表格,當OS做context switch到某個program的時候,MMU也會跟著切到這個table上,以便用到正確的紀錄表格。
- w2 @! x  q3 }
: g9 H+ ^- G8 o1 r例如:/ Z, ]# t9 s6 r& L
5 C( g, T) d, W$ z9 o' C* o6 g
程式A的表格記錄了他配置0~4K,而這4K對應到真實記憶體的128K~132K的區段。$ N! I, J3 ?/ V, [
程式B的表格記錄了他配置0~4K,而這4K對應到真實記憶體的132K~136K的區段。
9 G' e* g7 O% @! `# j1 H
1 [' z) G4 q& h雖然兩個程式自己都以為他是用到0~4K,可是其實真實記憶體所配到的位置不同,作業系統在切換的時候,會同步將虛擬記憶體的紀錄表格做切換,以便使用到正確的對應表。以上是一種例子,各種OS可能採取的設計方式不同,但是概念大多是一樣的,我們可以看得出來,對每個程式來說,它可以有擁有許多假的連續記憶體空間,對程式撰寫,還有記憶體使用率來說,很有效果。1 ]. _2 O1 Q5 |6 I% R  v: q9 Y8 o
. a9 z2 _& L6 S; u+ O
到此,CPU多了MMU,現在大多包含MPU的功能。
/ @0 l( V/ w( O9 L# [% P& d2 D4 I5 C6 K* \$ q8 B! H5 z/ f4 W* Q! p
muti-mode CPU + MMU + arbiter bus + memory + DMA
" n% x3 t/ X* w8 q8 X. j# ]+ f; a3 A) B- u7 U/ f
因此OS在kernel mode的時候,如果MMU是打開的,這時候還是使用virtual address。! B( |7 ~. U: {# m

5 G% S, p+ H$ n; u+ }' A0 U; T要讓mmu正常工作,必須要設定,要讓他知道你對位址的規劃是如何。
8 ^) _" e" a0 m9 H1 g0 u8 O7 \' |. @" {% k5 D3 Y! E
例如:RAM被硬體人員安排到0xFF00 0000的位址,可是你希望RAM被當成從0x0開始,你就可以設定MMU將 0xFF00 0000 對應到 0x0,這樣一來你讀取0x0就會自動轉到0xFF00 0000那邊去。. H* x: P+ H% t# m$ d; `) k

- x% P' I: J" T9 v5 i' V1 S0x0000 0000 --< mapping >-- 0xFF00 0000! U* Q1 I4 s+ Q' `7 Q2 l/ F

$ h; A" S3 _& s# K; m作業系統一開始就會初始化這些位址轉換對應的資訊,把它放在所謂的page table裡面,然後把table位址交給MMU,MMU就會依照table的資訊工作。* S+ h5 m5 Q1 U0 K" d
" s! z; f* b* }6 i
假如你今天有兩張table,兩張table設定不一樣,MMU只要在這兩張table之間切換,那記憶體對應的方式也會跟著換。) d+ c' O9 R- _4 i& v' E
0 ^2 I5 [7 S( m; x( n8 ]3 s: Y. @
這是一個很重要的想法。假如,我每一個process都有自己的 page table,切換process的時候,table也跟著切換,這樣我可以控制每一個process去存取記憶體的方式。假如我是讓所有的process 都共用一個 table,這樣這個table的設定值,就會影響到所有的process。
, m1 n% c9 t2 Z9 t0 G  |3 X* w
共用一個table表示每個process用同一個位址去讀寫,透過MMU轉換到的位址是相同的,會讀寫到同一塊。不共用的話,表示processA和processB即使拿同一個位址0x8000 0000去讀寫,可能最後對應到的位址是不同的。
* q0 B1 A2 i4 r( a; f: k2 Z% M) k- W! Z7 ?% A
但是這樣的差別就是有什麼好處??( C0 R5 Z; r; y7 O. _, Z

- ^# N3 f7 C/ g/ o3 ?因為感覺上複雜化了整個系統,本來我可以很直覺的拿processA傳給我的位址,去讀取它為我準備的資料,現在我可能會因為我使用的 table 不同,就不能在其他process直接使用。感覺很麻煩,要是大家都在同一個 table 工作,不是很簡單嗎?位址空間都是一樣的。2 j$ s+ o' C, }, y" w+ R
. i7 `4 r% t' Z/ s4 d" d6 k
why?!1 @9 `4 W* v) Z

0 `7 t2 E7 |/ J% a* v字數又超過啦~   
3#
 樓主| 發表於 2008-7-31 13:46:10 | 只看該作者
一、
. x7 N, t/ y4 s! |2 @  S1 A如果大家都在同一個page table上
: ^4 c4 Z3 s" c& i. m% P因為彼此用的記憶體應對方式是一樣的. l8 ~0 j# a& S6 h* w3 Z! [6 M
所以processA要了某個區段 0x0~0x100: f" ]& F2 z" D6 W; f* l: x  p
這樣processB就不能使用) s3 p# M, D' e3 i( @
很可能跑了一段時間之後整個系統的memory fragment就會變多3 z) [3 Z1 z7 x& ^& {8 Y" y4 U
對記憶體使用率來講不好
$ u) o+ V( v& F7 W很可能要一次找到大塊的不好找4 N, _. K2 T& y8 f3 M/ Z
雖然virtual address有4G但是process分一分
- S% K! G6 X9 H* M, f+ c4 c; y/ b還是可能不太夠' i9 R1 l. i" i2 w5 d$ Z
; j/ g' [- n4 P! }
二、9 l( p7 j) Q. |+ H
processB可以看到processA的address space
, v  i; C* {( h0 v) E2 b表示我可以拿到相對應的資源
& H& F5 B$ K* E+ t1 T這樣惡意程式很容易就得到一些記憶體上的個人資料# U. P' W: x* ]5 Q% J

  ]' F9 j7 `2 G$ r有些地方的說明不太容易,太簡略容易造成誤解,贅述又怕不容易- _) v: x- Z3 H: ]% L; P7 i
理解。沒表達清楚的地方歡迎提出來討論。

評分

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

查看全部評分

4#
發表於 2008-7-31 20:44:39 | 只看該作者
希望大大以後多多發表文章./ E2 S# M  k+ k4 U2 d8 u( {8 x
透過大大生動的描述.很多複雜的概念就淺顯易懂了.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-1-1 09:52 AM , Processed in 0.173010 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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