Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

Linux 下的 mmap()

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-8-4 15:17:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
以下希望藉由一個實際可以在user mode運作的API, mmap()
) C. B! ^8 v' J# G讓programmer能夠感受到MMU這個硬體在系統中所扮演的角色# [  A$ j( e9 S9 M7 U8 \

/ _2 O- l) V2 [# H$ j7 Q; |# H寫linux底下driver的人常常會看到這個東西 mmap()
7 G/ n& V# p9 @: ~) R/ u在user mode program裡面假如你用open( "/dev/xxx", ... )
0 ~8 b$ f1 ?% ~2 ]" @去打開一個檔案系統的節點, H+ G: U& @& h9 _+ d6 D
就可以用這個file descriptor的handler對他做mmap()的動作
, k+ U3 s9 ]  G% b& o$ ?1 S, e4 Q那這個mmap究竟背後藏了哪些意義?7 `& F" y* L  m; A8 b
又有哪些硬體在工作才能達成?
' z& g0 ?* G5 X
# w8 u6 l6 I3 E. ommap的字面意義是memory map0 \- m( s' N& ]/ I; Q9 `
顧名思義就是『記憶體映對』$ x/ T" q. f1 i. n% j* M8 G- ?
簡單來看,就是用mmap()幫你做對映7 d. _( |) [0 ^# U+ u: [
對映好了,對著傳回的address作存取
5 A$ G; {) ^1 j+ y  L就等於對檔案作存取
5 J" T" K0 g- F
5 E4 A! M6 c( G2 b% X1. 首先來看mmap()一般是怎麼被使用的 (這邊可以先不用管要傳什麼參數)$ {' X* p0 e5 L2 i; q
int fd, mapSize, offset, start;
! |( x6 u: u, b4 wchar* ptr;
/ |$ b; |6 b. p+ O6 s7 f  N/ u+ j. p6 b7 t9 n- ~. a1 k" Z
mapSize = 0x1000; /* 希望映對多大的區塊 */
8 A" @/ d) u+ r1 [offset = 0;/ L4 Z0 o2 E/ w: _, O) P
start = 0;
/ F& E, C( `/ H* K* E/* 打開檔案 */# q* A& v* z# p# ^$ B2 A- ]
fd = open( "/home/tester/a.txt", O_RDWR | O_SYNC );  9 h2 D! q4 _' }& b1 ?4 b4 n
/* 作mmap動作,取得一個對應好的address */  ~7 J; Y. d! |& E
ptr = mmap( 0, map_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, offset );
* ~8 ^6 A; h' L# A/ g, ~6 H. n# c4 I
假如一切順利的話 ptr 就會接到一個address,這個address會對應到a.txt這個檔案所在的起始位置,
" C- A1 Z5 r5 `! M, @# a( X; g* ^如果這時候我們用 strcpy( ptr, "hello!!" );5 m" P  G7 l7 |! X% k

' [) T% z  m! `8 o: ua.txt裡面就會被寫入"hello!!"的字串
& _9 C1 `5 z  p7 t$ N% A2 @
& D* n- P* P  G: L, R! d/ A. Q$ q2. 假如我寫了兩個程式,都是用mmap()到同一個a.txt,程式會不會出問題? 如果不會,那我既然對同一個檔案作mmap(),那我拿到的ptr不是應該是相同的address?
3 [( S, l$ f- x9 ?6 p6 Q9 x
: b$ K6 w) b* q" q5 P% J( s答案是:兩個程式可以正常執行,但是這兩個回傳的address不一定相同。
% i0 \8 H" R8 Y- C% C7 E" ?6 ?1 @why?  為什麼對同一個檔案寫入,也都做同樣的mmap()動作,甚至傳的參數值都相同。
  C1 @& |0 l; s為什麼拿到的address可以是不同的? 更奇怪的是,位址不同,還是同樣寫到同一個檔案上頭。8 W3 p- V3 i& z
. m0 @. P7 n, _& O; f
假如這一切都是合理的,那表示雖然這兩個位址不一定相同,其實都是對映同一個地方,表示有某種東西記錄著這個對應關係。而且,兩個program的ptr有時候會一樣,可是有時候又不一樣。唯一個可能是表示兩個process各自保有這些映對的方式。
' H$ G1 |2 ^. d- _- d9 [9 M& r9 }/ w, a
8 a+ P$ Q% V' Q4 D) k( J$ C3. 假設我只寫一個程式,但是mmap()兩次到同一個檔案上呢? 得到的兩個ptr會一樣嗎?& [. |8 D+ \: \1 n6 ]

& K8 y1 ]" y) u9 @% Y4 O3 l答案是:這個兩ptr還是不一樣的,兩個不同program 跑出來的mmap()結果不同也就算了,同一個program呼叫兩次mmap()跑出來的ptr也不一樣,但又都對映著相同的檔案a.txt。因此我們又可以猜測這一個mmap()是動態的,動態去產生一種應對的方式,將傳回的ptr對應到真正的檔案a.txt去,所以同一個process可以對應好幾次,好幾次都用不同的address去對映到相同的檔案上去。
0 }) D- o2 B' T+ h& l2 ~% U2 Q
4 H! G# e0 Y* H3 J% J3 J綜合上面三種現象,我們合理的懷疑系統裡面存在了一個東西,它讓每一個process可以動態地記錄address的對應關係。並且,每個process各自擁有這個table,而這些對映的關係會動態的反應在這個table當中。# U4 C$ }  [/ Q2 D) H/ O9 r2 y' A

9 t  I! E- u( l( k. P0 n回想一下一個系統有誰會做這種工作,不就是MMU所擔任的重要角色嗎?
1 ?4 s2 Y" @& i. F" K; k每個process各自擁有自己的 page table 當他呼叫mmap()的時候,系統就動態地幫她在這個table上寫上紀錄著
9 h+ E9 f' I. }5 d. q7 \* c2 B' M& C: N; S. R8 _+ P
[processA-pgtable]
+ O9 q! O- Y6 B0 t/ Y0x00008000 ptr1 --> a.txt7 C% R1 E, B1 P- W; B
0xa0008000 ptr2 --> a.txt! ^+ ]& }- C# N& a: \, C5 z
% D+ Z( K9 E. T* p. r% b& I, j9 t
[processB-pgtable]
$ W  Q  F6 \" F# C, Z7 H4 _0x00008000 ptr1 --> a.txt9 ^% D- J$ O6 d/ {: M7 l! K
0xb0008000 ptr2 --> a.txt# W$ F8 E1 D. f1 t9 E

8 k' q# e2 V9 r這樣ptr1, ptr2都可以對應到相同的地方,又因為各個process又有不同table,所以有時候ptr1有可能會相同。* T9 c4 U) d6 m
如此一來,我們終於可以合理的解釋我們觀察mmap()為何對映出來的address會有如此的表現。原來就是MMU被加入,而且OS又被設計成每個process都會各自擁有一個page table來記錄他對記憶體如何解讀。

評分

參與人數 1Chipcoin +5 收起 理由
jacky002 + 5 以資鼓勵,再接再厲!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-8-4 15:20:27 | 只看該作者
略寫下兩個延伸的想像問題
. g" J7 r& m, e; ?或許有人有興趣可以回答或是深入研究
5 A0 O5 e1 v. c* C  V8 _
; q4 l) L3 b# c; G& p5 s[延伸想像]
/ Z2 y3 `. U0 Q# p8 j$ \% I我們又可以仔細想想假如每個process都有各自的table7 Y5 L! T/ i* m; }4 A, O$ ~* j: G
那麼從一個process做context switch到另外一個process的時候6 [" w! d) V1 O1 K  J
代表所用的table是不同的
" o* k2 T9 ?0 T4 u; Y3 Bwow!!!可想而知系統是很忙碌的,1秒鐘context switch 10次就要替mmu切換10次page table的mmap方式1 ]* }* H# f' p# R
不然process用錯page table可能就會指到錯誤的位址7 W& F% c( @: [8 X0 s. }& `
那OS到底怎麼切換這些page table?
4 H+ ]* e5 u# b, ?kernel和user program的page table有什麼不同??- g! s) d/ n/ Q' i
, }, Q' n+ @" u8 P$ W, `
[延伸想像]
/ N+ K- X; |, H) ^" U7 L4 j' {假如我們可以修改page table的權利,是不是就可以寫出一個可以偷取別的process data的東西?因為我可以偷偷的map過去他的address space讀取它的資料??    有辦法嗎? 還是根本沒機會?
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-28 04:17 AM , Processed in 0.149009 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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