Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

Linux 下的 mmap()

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-8-4 15:17:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
以下希望藉由一個實際可以在user mode運作的API, mmap()
7 X8 T4 V( u7 @2 T讓programmer能夠感受到MMU這個硬體在系統中所扮演的角色
" H6 p. |) I. Z" z" K
% m5 Q' u' S7 \! Y寫linux底下driver的人常常會看到這個東西 mmap()
1 G7 n( o3 L  z/ [% Q在user mode program裡面假如你用open( "/dev/xxx", ... )* e. a3 b! V* Z. r1 `6 R
去打開一個檔案系統的節點
3 @$ C' a; c1 a: b' x就可以用這個file descriptor的handler對他做mmap()的動作; K6 m4 E2 _& I/ U+ {5 {
那這個mmap究竟背後藏了哪些意義?* [  s8 ^  {& _  j0 E! |
又有哪些硬體在工作才能達成?2 u1 y6 m# g4 ]( F* P+ A/ _
  |1 Y( Q  m, o( }) `; p
mmap的字面意義是memory map
& y( t+ ~; S# K* E顧名思義就是『記憶體映對』
  }5 }! _! N+ E$ K% `3 T* F$ `簡單來看,就是用mmap()幫你做對映
8 I3 x, L0 W/ _! U6 {5 N9 s/ c對映好了,對著傳回的address作存取! v1 \8 K; ^% c. O" {
就等於對檔案作存取
' d4 k' e* p4 C, O2 P7 `4 S6 [2 |, g8 `$ x  n
1. 首先來看mmap()一般是怎麼被使用的 (這邊可以先不用管要傳什麼參數)
3 ?6 O1 `2 C% w# f* s6 Y* e% [int fd, mapSize, offset, start;
" H. e+ d' a; ~1 Dchar* ptr;; ~/ A! y: _, I$ U, M- d1 k

# j; }1 d8 l5 h; I+ I; J7 AmapSize = 0x1000; /* 希望映對多大的區塊 */& }9 v  r3 i7 n7 X
offset = 0;
+ y; ]8 _$ B1 f' C% ostart = 0;% S- S! P9 {# N; C- z2 L( j* |) k( _
/* 打開檔案 */# ^1 j0 e+ R8 {. P/ {* {3 r
fd = open( "/home/tester/a.txt", O_RDWR | O_SYNC );  6 K( c4 }- a. p+ c% t2 e$ D, p6 ~
/* 作mmap動作,取得一個對應好的address */% w. [4 N& R% u9 R5 w* c/ U( L- U
ptr = mmap( 0, map_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, offset );
1 k+ G, \" F+ F4 F: b9 e  [5 @/ d/ r) I, j6 Z7 [8 [' A7 V
假如一切順利的話 ptr 就會接到一個address,這個address會對應到a.txt這個檔案所在的起始位置,0 [% j" u1 x& f9 H
如果這時候我們用 strcpy( ptr, "hello!!" );
  c9 ?, r/ o1 l2 n2 ^
0 h0 g: C- W5 [; {9 za.txt裡面就會被寫入"hello!!"的字串# j7 ^. N3 k* `

) l  a# _9 k1 R; [& t2. 假如我寫了兩個程式,都是用mmap()到同一個a.txt,程式會不會出問題? 如果不會,那我既然對同一個檔案作mmap(),那我拿到的ptr不是應該是相同的address?; x, a; D3 L5 ~& t
# n. T& t& `) g) R! u
答案是:兩個程式可以正常執行,但是這兩個回傳的address不一定相同。1 a- `# `' D! Q! ^6 G4 n6 O
why?  為什麼對同一個檔案寫入,也都做同樣的mmap()動作,甚至傳的參數值都相同。
" o! p; O) ~' Q$ }為什麼拿到的address可以是不同的? 更奇怪的是,位址不同,還是同樣寫到同一個檔案上頭。
& f4 y# Z6 y# Y( [& k, n
) H% m# p. s+ X7 G0 ?, ^# u! l假如這一切都是合理的,那表示雖然這兩個位址不一定相同,其實都是對映同一個地方,表示有某種東西記錄著這個對應關係。而且,兩個program的ptr有時候會一樣,可是有時候又不一樣。唯一個可能是表示兩個process各自保有這些映對的方式。
. C) I5 ^# C( ]& k1 P9 d
! Q( C( f. Y/ D' q+ e2 H! }3. 假設我只寫一個程式,但是mmap()兩次到同一個檔案上呢? 得到的兩個ptr會一樣嗎?# k+ b: P9 X3 M) i3 o  o

+ t0 n% k, H& W答案是:這個兩ptr還是不一樣的,兩個不同program 跑出來的mmap()結果不同也就算了,同一個program呼叫兩次mmap()跑出來的ptr也不一樣,但又都對映著相同的檔案a.txt。因此我們又可以猜測這一個mmap()是動態的,動態去產生一種應對的方式,將傳回的ptr對應到真正的檔案a.txt去,所以同一個process可以對應好幾次,好幾次都用不同的address去對映到相同的檔案上去。3 L" o1 l; p9 c* h0 T* x
1 e- p" D' D! A9 R( u1 _  h
綜合上面三種現象,我們合理的懷疑系統裡面存在了一個東西,它讓每一個process可以動態地記錄address的對應關係。並且,每個process各自擁有這個table,而這些對映的關係會動態的反應在這個table當中。  d7 U' O# ?3 q+ p3 G
8 A7 _+ G% V" |
回想一下一個系統有誰會做這種工作,不就是MMU所擔任的重要角色嗎?
+ U6 w+ ^. U$ q* V, e+ ?, W每個process各自擁有自己的 page table 當他呼叫mmap()的時候,系統就動態地幫她在這個table上寫上紀錄著
4 @- Q  _  ^* O8 {8 c; _" ?! b' Z8 a1 b' e2 K: f# O
[processA-pgtable]
! E+ v7 w+ E% o# B# @0x00008000 ptr1 --> a.txt9 U2 [9 |0 U& Q6 C
0xa0008000 ptr2 --> a.txt
3 r  {3 d# Z& L* H4 d, X
$ \% \0 l- x  r, U0 W. |[processB-pgtable]
7 i  m  \4 d' N9 v, @& o0x00008000 ptr1 --> a.txt+ G3 [2 l. x/ g# p4 ~4 J. t% ~& P
0xb0008000 ptr2 --> a.txt. C1 _, a* O# [* U, D( b5 o

7 [0 r; O4 b+ |3 t+ l5 X這樣ptr1, ptr2都可以對應到相同的地方,又因為各個process又有不同table,所以有時候ptr1有可能會相同。
' W2 e! Y8 P& i0 r8 x3 u( F/ C如此一來,我們終於可以合理的解釋我們觀察mmap()為何對映出來的address會有如此的表現。原來就是MMU被加入,而且OS又被設計成每個process都會各自擁有一個page table來記錄他對記憶體如何解讀。

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-8-4 15:20:27 | 只看該作者
略寫下兩個延伸的想像問題+ M$ g2 [  c5 B- |) J  c: _
或許有人有興趣可以回答或是深入研究/ y. u# o. ^. B* p7 O! l5 e1 i

: s# e" I% [7 |- e- W[延伸想像]
6 P+ O5 a# q* f我們又可以仔細想想假如每個process都有各自的table
+ S$ Z3 x8 A7 D那麼從一個process做context switch到另外一個process的時候; ]5 l) G- t7 k8 S4 g) M2 P
代表所用的table是不同的. o: ?$ C9 @, `$ n  t' c( u
wow!!!可想而知系統是很忙碌的,1秒鐘context switch 10次就要替mmu切換10次page table的mmap方式
& C8 E: ?- f% s1 ~' r& [# k不然process用錯page table可能就會指到錯誤的位址
8 p4 d4 S+ N* i/ j9 H那OS到底怎麼切換這些page table?4 [9 L' b- j- p
kernel和user program的page table有什麼不同??0 u# h# l% |( j7 T: d9 c
" G" s# y# v6 I$ l6 X+ b
[延伸想像]
8 q8 y' d- J; K' o4 p( w6 t假如我們可以修改page table的權利,是不是就可以寫出一個可以偷取別的process data的東西?因為我可以偷偷的map過去他的address space讀取它的資料??    有辦法嗎? 還是根本沒機會?
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-21 08:48 PM , Processed in 0.159009 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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