Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

從system bus來看系統

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-7-31 13:36:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
有些基礎不夠深厚  遣詞用句也不是很精確1 ?7 C3 t  @) T- j. l/ y) d( O1 I
以下試圖以自己的體認和觀點  以簡單的辭彙' i5 r+ E3 Q$ G& b
去解釋一些process與系統演進的方式( n' n1 C6 x% k: I, a+ [, w* K! X
如果有誤或是清楚的地方  歡迎大家討論- ^9 R/ u" t; ^( f" E

: n$ E' T; I" R! [0 i/ f[本文開始]
, y. k) s1 N- I: E在學校學computer architecture或者做一些簡單的單晶片介面卡實驗課程的時候. Z8 ?% Z! h4 ]+ b( ~
常常會被一下子多出來的專有名詞搞混# B7 G, B% }1 Z8 v1 }0 P9 ^( e
像是DMA, memory, cache, mmu, virtual address, physical address 等等
/ Z4 D7 ~6 h' v尤其大家一開始接觸電腦都是已經發展很久的x86系統7 z1 {. ~- J! T, f: I- n* c/ j
即使有單晶片系統的實驗課程
, Z; ^0 X( @# n. w9 F0 Y7 C& s1 G也很難將單晶片的經驗5 ?: f7 V* F0 S9 U5 i% ~$ Z
運用到x86或是已經較為複雜的CPU系統上
2 `" r: p( [5 I! V5 O+ e( A0 f2 }& O# _" n  _
因為CPU上頭又開始加入了越來越複雜的作業系統
5 I# O  k# `* a9 A7 p6 M- {像是作業系統常提到的kernel mode, user mode; P2 i, ^; |/ u0 b; z& ^4 }9 _
常常跟上述的專有名詞physical address or virtural address交互使用4 ]$ G7 o* t1 w1 w
例如刻板印象的『作業系統處於kernel mode時,使用physical address』( u# V+ G* E8 S3 E4 K/ i
經常讓一剛要學習撰寫driver或是OS的軟體人員產生非常多的疑問
! m$ |. Q5 }$ u+ q4 i  H0 C4 y" D
那應該怎麼簡單來看待一個系統?3 t* V4 _" t2 H& h8 v9 G
* K. R8 J& j" S3 L9 z5 Q
首先,我們回歸到CPU這個字的字義上,我們稱呼它為『處理器』% Q$ g) i( V6 Z. }% s1 E
他是用來處理各種『資料』+ A' i8 j( l5 f0 c+ F, Z2 ^% A
% y' u* @( j% F- y
那麼這些資料又放在哪邊?他是如何去存取這些資料?
9 s' W; O* t" T3 Y- ~9 M0 z# e, P* b1 @
通常可以被處理的資料都在memory當中,CPU透過所謂的 bus 去存取memory
' M. f5 H, b' P  o! {' U5 `. {
! t2 G  w& |* _到目前為止,我們得到一個簡單的系統 CPU + bus + memory
2 j9 m) C: y% A4 ?
, ?& v4 b( h4 ?! x5 c7 X( C接著,我們用兩個角度去看這個簡單系統的發展: e4 S  d! F) k/ m# n
1. 硬體加速
& [' X4 Y- s* U9 g9 I2. 作業系統, F" G, P- }# p

0 y( I9 G- K. Q5 n# J2 Q; {我們先從硬體加速的觀點來看這個系統如何改進:
6 y* \, ]( J' ~8 @! I- l, l& Q% j0 c" E& c( a0 Y1 V
首先,硬體加速通常就是把某種特殊格式的資料準備好 (例如電影)8 M% Y7 M6 Y3 O; t# ]3 s7 j* Q1 T% F
放在某個地方,然後請你設計好的加速硬體去處理這些資料
7 `# v! d9 N8 s7 W/ b5 v  B+ ]# R可以看得出來,這些資料勢必會被放在某塊地方,讓硬體可以直接讀取。
( r% h5 A$ \$ ?; m9 ^這個想法造就了 DMA ,也讓系統也開始複雜化,因為這樣一來,同時之間會有兩個東西去存取記憶體。所以bus的設計上變得複雜,必須處理DMA和CPU同時發出request 的狀況,這邊bus變成需要多了arbiter的功能,以便決定目前誰是master可以存取memory。從另外一個角度來說,她們會互搶資料,也就是你加入越多DMA,CPU那邊的效率有可能更差,因為他要不到資料,必須等待,但另一方面他多出了一些時間可以處理其他資料,而將一些固定特殊的工作交給加速硬體去完成。  k" H$ x; u, L; Y
# K4 w0 l+ T- V1 L
CPU + arbiter bus + memory + DMA7 l9 L) q2 M* ]" c4 t+ P& d8 {5 M
  J1 y2 \7 o+ R9 w
接著我們從作業系統的角度來看:
/ A8 O. A3 j8 D9 |4 K& |, G. m& q) l: e
一開始的作業系統沒有分kernel mode和user mode,也沒有出現virtual address,只有一種模式和一種定址方式。可是這樣會因為程式撰寫錯誤,直接改寫到OS所處記憶體位置,變成整個系統都不能工作。! V2 s" u6 E: T- @. {  q& p/ {9 F

: O( E+ \0 v3 T& h8 `% Q* R例如: OS被載入到 memory 0 的開頭位置,某個程式寫錯資料,把資料也寫到0的位置,這樣原本的OS就被亂改到,萬一程式跑到這邊系統可能就掛掉了。面對這樣的問題,發展了user mode和 kernel mode,並藉由硬體的保護,使得user mode下不能直接存取某塊被保護的memory區塊,這個硬體就是現在的MPU。& P* n3 z, Y2 \
( i. ~2 u# e2 S3 P
到目前為止我們可以看出來整個系統更加複雜了,CPU必須多一些模式,以便支持作業系統的kernel mode和user mode,kernel mode可以去改寫MPU設定要保護的memory區段,等到設定好了,切換成user mode,這樣 user program 就可以安心的使用記憶體,也不擔心惡意程式去搞壞OS。: A8 l0 V! F  k( _
2 b: [0 e( i- y1 j
所以我們的系統變成了
8 \) s+ y- U  _* G, g
1 I, K* B/ N% j8 P1 G$ Smulti-mode CPU + MPU + arbiter bus + memory + DMA9 Y$ i  T# R. ^- K

* E. G- M: Q7 ?+ A# U. Q因為字數限制,部分貼到回文當中  =)

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-7-31 13:43:33 | 只看該作者
接著我們看virtual address和physical address的誕生,這邊相當抽象,需要一些想像。
( \4 ~  v% t$ \0 c2 T- d* A9 O; Q% |
隨著時代進步,越來越多user program產生,user mode的program目前雖然已經不會因為隨意的存取記憶體,造成OS掛點,可是還是有可能去改到別人的記憶體,因為每個程式共同擁有並使用同一個記憶體和所謂的記憶體空間。: C& @0 t9 U+ H% r4 B
6 f$ o* D0 P' D1 p% {& ^0 s
例如:程式A放在0~128 KBytes,程式B放在512~768KBytes,程式A寫錯位置到B程式的地方,變成程式B毀損,B程式就掛掉了。
2 g) _( [- C4 a3 j3 h# f7 T3 M: S# I5 F
上述的記憶體使用情況,不僅給programmer帶來困擾,而且變成記憶體必須被事先決定好誰只能用哪邊?只能使用多大?這樣不但得事先規劃,對於記憶體的使用也不是很高,因此MMU的硬體便被提出來。
, [# N1 L+ z5 [3 T$ P" t" w
; O7 m# a" x9 u/ F! Q6 G, e0 W簡單來看,MMU記錄著某個虛擬位置所對應到的實體記憶體的位置。) s  i% }1 q0 c7 ^7 l

0 k6 q! M0 n! j/ d  k# j% g# l+ ^作業系統利用這個特性,為每一個user program先做了一個假的記憶體,每個程式都以為他有很大很大的記憶體空間,其實當程式呼叫malloc的時候,才會去設置MMU將這個user program的假記憶體空間和真實記憶體做個連結。這邊很難解釋清楚,其實每個程式都有一個假的記憶體空間的紀錄表格,當OS做context switch到某個program的時候,MMU也會跟著切到這個table上,以便用到正確的紀錄表格。  I7 W; Z" Z: c" a' x5 ~
2 B. R$ `; i6 S/ e; b' c4 g
例如:: a9 \* c! H1 s* M, g& \

+ S  F' w% n9 n& @# P# k程式A的表格記錄了他配置0~4K,而這4K對應到真實記憶體的128K~132K的區段。
5 G  p: U9 t, e: S- E程式B的表格記錄了他配置0~4K,而這4K對應到真實記憶體的132K~136K的區段。5 e- {* C+ Y. K
0 I8 z, V; k1 S$ u' t; f+ S
雖然兩個程式自己都以為他是用到0~4K,可是其實真實記憶體所配到的位置不同,作業系統在切換的時候,會同步將虛擬記憶體的紀錄表格做切換,以便使用到正確的對應表。以上是一種例子,各種OS可能採取的設計方式不同,但是概念大多是一樣的,我們可以看得出來,對每個程式來說,它可以有擁有許多假的連續記憶體空間,對程式撰寫,還有記憶體使用率來說,很有效果。
8 n7 D1 H3 O" y) E! k# B
( c' ~& b/ v6 k1 l( G4 b到此,CPU多了MMU,現在大多包含MPU的功能。
+ E/ B/ |: ?8 J7 f8 z5 y) [( a" q+ e
4 i% }- s4 J: q4 X; |! i6 `1 l( rmuti-mode CPU + MMU + arbiter bus + memory + DMA# U% E9 J0 h3 G7 x+ [0 ]! G

& U( h8 D$ W4 y, b! p0 J因此OS在kernel mode的時候,如果MMU是打開的,這時候還是使用virtual address。) C1 y: c5 N6 c! j! ]. j
% Y* ^# \$ ]5 U- J6 p6 Z8 U# L$ c" ~
要讓mmu正常工作,必須要設定,要讓他知道你對位址的規劃是如何。& i/ }& z- `6 e4 {- p: [8 K

, T5 h, P2 j  k例如:RAM被硬體人員安排到0xFF00 0000的位址,可是你希望RAM被當成從0x0開始,你就可以設定MMU將 0xFF00 0000 對應到 0x0,這樣一來你讀取0x0就會自動轉到0xFF00 0000那邊去。
& a9 k0 a' U' `! n# ?& j7 |' r2 B& {  A% u0 @
0x0000 0000 --< mapping >-- 0xFF00 0000
) ^  x, e, J" R. V1 s  c: c5 T
" f5 d; h1 _2 H1 i6 w( @  p作業系統一開始就會初始化這些位址轉換對應的資訊,把它放在所謂的page table裡面,然後把table位址交給MMU,MMU就會依照table的資訊工作。
7 ~1 Y; X* M# W/ ~: l: v$ X
1 q9 \8 c0 a+ v# M" I6 T假如你今天有兩張table,兩張table設定不一樣,MMU只要在這兩張table之間切換,那記憶體對應的方式也會跟著換。8 C8 `* R9 V. X$ }- \

9 G8 M- @3 \# B這是一個很重要的想法。假如,我每一個process都有自己的 page table,切換process的時候,table也跟著切換,這樣我可以控制每一個process去存取記憶體的方式。假如我是讓所有的process 都共用一個 table,這樣這個table的設定值,就會影響到所有的process。4 N( W# b# S! L3 ]) m! ]
7 J3 L. r  `3 \# w8 u3 N
共用一個table表示每個process用同一個位址去讀寫,透過MMU轉換到的位址是相同的,會讀寫到同一塊。不共用的話,表示processA和processB即使拿同一個位址0x8000 0000去讀寫,可能最後對應到的位址是不同的。6 a0 ^4 E% B* C/ G
! s; [1 ^1 U, K; p
但是這樣的差別就是有什麼好處??
! T9 E. c6 C3 B- _, Q! z3 x+ X0 F
因為感覺上複雜化了整個系統,本來我可以很直覺的拿processA傳給我的位址,去讀取它為我準備的資料,現在我可能會因為我使用的 table 不同,就不能在其他process直接使用。感覺很麻煩,要是大家都在同一個 table 工作,不是很簡單嗎?位址空間都是一樣的。9 `4 ^. p" L. S0 \  d* q, N  A

5 T! g: R2 B6 b! _) [1 z5 Jwhy?!4 w) M: A8 e" ^& ^
1 C# e! n# C4 A! Q8 j$ O
字數又超過啦~   
3#
 樓主| 發表於 2008-7-31 13:46:10 | 只看該作者
一、* U" h9 Z, f) w) Q
如果大家都在同一個page table上& d0 V4 s5 @8 a- `
因為彼此用的記憶體應對方式是一樣的
8 i4 Q( t$ p7 y# _" t所以processA要了某個區段 0x0~0x1009 A: A, P. P1 I1 Z3 E
這樣processB就不能使用
" w. o) L2 p7 C3 ~1 K' P+ [很可能跑了一段時間之後整個系統的memory fragment就會變多
( @2 A" z! X% n+ q對記憶體使用率來講不好6 P/ s, M+ B* t. V
很可能要一次找到大塊的不好找$ h; Q& M( Y- y. Q8 `6 D  X3 F  `4 O
雖然virtual address有4G但是process分一分" o# J  S4 G  v7 @" S: ]+ K
還是可能不太夠5 g: f% C( t$ r% I
& Y: z  C8 b: ^8 u
二、8 a# G: D5 n: p  c
processB可以看到processA的address space
1 Z' `5 ]3 E. T% U2 J6 f  J, W* E表示我可以拿到相對應的資源0 K5 e* ^5 x& Z4 D  h6 i
這樣惡意程式很容易就得到一些記憶體上的個人資料
1 p( }$ n/ E) s7 m2 L1 j$ F0 b2 Q( g7 u
有些地方的說明不太容易,太簡略容易造成誤解,贅述又怕不容易5 s/ m) g# e& ~0 B( ~& U
理解。沒表達清楚的地方歡迎提出來討論。

評分

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

查看全部評分

4#
發表於 2008-7-31 20:44:39 | 只看該作者
希望大大以後多多發表文章.
& E* q4 L4 J; `0 w透過大大生動的描述.很多複雜的概念就淺顯易懂了.
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-1-23 01:07 AM , Processed in 0.171600 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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