Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

Linux 下的 mmap()

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-8-4 15:17:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
以下希望藉由一個實際可以在user mode運作的API, mmap()
: _) M0 C7 i1 G7 M- x讓programmer能夠感受到MMU這個硬體在系統中所扮演的角色' X) H" M- E2 x' L. e
) M5 x: X4 E5 O' X# p% U
寫linux底下driver的人常常會看到這個東西 mmap()0 B, ^! X" B/ q( }& S
在user mode program裡面假如你用open( "/dev/xxx", ... )
  `. s( O; X8 b7 p0 ]8 ?' h去打開一個檔案系統的節點% f: J. A. Y. p# O; i
就可以用這個file descriptor的handler對他做mmap()的動作3 Q/ W  ?6 _3 \& @: g
那這個mmap究竟背後藏了哪些意義?) n, e7 T9 z# I) T% D
又有哪些硬體在工作才能達成?8 T: C: q1 J4 C8 ]2 r( B

( m2 Q% J5 Z& `  B( Y: ]4 P7 B$ {mmap的字面意義是memory map
0 P2 W; {  x/ K/ o顧名思義就是『記憶體映對』
/ g% E# |) |% l9 k, e9 F6 E. Q簡單來看,就是用mmap()幫你做對映) o, n5 |7 o5 ^& f' V
對映好了,對著傳回的address作存取* n8 |( P  ~( X6 Q  ^
就等於對檔案作存取% U" {4 a* @9 U* `; t& W
% z4 V- F. a* k6 s' ^; Q3 v  ?" z
1. 首先來看mmap()一般是怎麼被使用的 (這邊可以先不用管要傳什麼參數)
5 A! e/ v& V: l& k- A; M' e8 B' _int fd, mapSize, offset, start;: q- S# @* R" f4 z; O
char* ptr;7 L& w3 I! Q- m+ W% |; N

9 Q" \3 d; r% k" X. X2 qmapSize = 0x1000; /* 希望映對多大的區塊 */
2 {. J8 @9 i6 c" I$ c" Aoffset = 0;9 w2 |+ _; t! V& K4 m7 O6 E- M
start = 0;2 X5 y% K! }2 c1 @7 Z# l
/* 打開檔案 */
6 S; W7 r' V1 t; g& [fd = open( "/home/tester/a.txt", O_RDWR | O_SYNC );  $ T( G4 k- ~& }
/* 作mmap動作,取得一個對應好的address */
' h% G9 A1 B6 {2 M/ }ptr = mmap( 0, map_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, offset );; Q2 ~8 [8 _9 @" p5 ^' M
3 s4 w1 s- H1 V5 O$ A* {
假如一切順利的話 ptr 就會接到一個address,這個address會對應到a.txt這個檔案所在的起始位置,, t5 _" n5 t/ e5 x; ?, `' h8 _  I( \; E
如果這時候我們用 strcpy( ptr, "hello!!" );; n1 H; `$ m: E) B& n# N+ D  I4 b
4 w, h' n# U* t6 Q4 w. x( e$ W
a.txt裡面就會被寫入"hello!!"的字串
3 P  [9 F0 t; P4 w1 K3 j& n8 p8 N
3 Q: v, I' U  L- M- G( u* _2. 假如我寫了兩個程式,都是用mmap()到同一個a.txt,程式會不會出問題? 如果不會,那我既然對同一個檔案作mmap(),那我拿到的ptr不是應該是相同的address?
  V2 l2 F# E  v% K: b
4 r- l* \' c; x# s- V3 O答案是:兩個程式可以正常執行,但是這兩個回傳的address不一定相同。2 S8 W; c0 L. S3 ?
why?  為什麼對同一個檔案寫入,也都做同樣的mmap()動作,甚至傳的參數值都相同。: v( o1 |( N( y
為什麼拿到的address可以是不同的? 更奇怪的是,位址不同,還是同樣寫到同一個檔案上頭。
; T2 n- ?* A" K' r6 v% U1 C0 b8 o8 s( [1 H: x% H$ `
假如這一切都是合理的,那表示雖然這兩個位址不一定相同,其實都是對映同一個地方,表示有某種東西記錄著這個對應關係。而且,兩個program的ptr有時候會一樣,可是有時候又不一樣。唯一個可能是表示兩個process各自保有這些映對的方式。
) Z# ^- ^, P5 u4 ?/ q  ]2 B$ M9 ]7 I) f+ _4 C. c
3. 假設我只寫一個程式,但是mmap()兩次到同一個檔案上呢? 得到的兩個ptr會一樣嗎?7 F% q9 R$ L6 w: ^( Y' o

3 R6 I) `+ ]7 s/ V$ ?: Z答案是:這個兩ptr還是不一樣的,兩個不同program 跑出來的mmap()結果不同也就算了,同一個program呼叫兩次mmap()跑出來的ptr也不一樣,但又都對映著相同的檔案a.txt。因此我們又可以猜測這一個mmap()是動態的,動態去產生一種應對的方式,將傳回的ptr對應到真正的檔案a.txt去,所以同一個process可以對應好幾次,好幾次都用不同的address去對映到相同的檔案上去。" i* P. U  E) _  h. [. }- b- ]
* Q9 @$ k  V7 o: M& ]3 E* \
綜合上面三種現象,我們合理的懷疑系統裡面存在了一個東西,它讓每一個process可以動態地記錄address的對應關係。並且,每個process各自擁有這個table,而這些對映的關係會動態的反應在這個table當中。
# o" d$ C, B' S
* f: l& }$ N6 H( `6 o) |3 y回想一下一個系統有誰會做這種工作,不就是MMU所擔任的重要角色嗎?- @+ z3 _% a/ A5 t1 l
每個process各自擁有自己的 page table 當他呼叫mmap()的時候,系統就動態地幫她在這個table上寫上紀錄著& q; P9 g9 l! X+ f- O1 [  u

! ^; @  t9 a( e4 T3 h$ W" `[processA-pgtable]
/ g5 Y3 F" C. Y' ]& U0x00008000 ptr1 --> a.txt* q- |! h* ]/ G' N: L* |4 K
0xa0008000 ptr2 --> a.txt
* q) Q) H. U9 A+ b5 A! |) J$ R9 o; O5 w0 b+ }
[processB-pgtable]& p. C  @, k( v' G8 w; p) m
0x00008000 ptr1 --> a.txt: {+ P" l3 f4 c0 [; _
0xb0008000 ptr2 --> a.txt/ Z& K5 ^8 F9 y+ h- Z# M, j
+ B2 J% Z, ^, M
這樣ptr1, ptr2都可以對應到相同的地方,又因為各個process又有不同table,所以有時候ptr1有可能會相同。9 r( L* Q+ s" L/ ?  u" H; i
如此一來,我們終於可以合理的解釋我們觀察mmap()為何對映出來的address會有如此的表現。原來就是MMU被加入,而且OS又被設計成每個process都會各自擁有一個page table來記錄他對記憶體如何解讀。

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-8-4 15:20:27 | 只看該作者
略寫下兩個延伸的想像問題
0 e/ t' ?: ?5 ^$ D9 o或許有人有興趣可以回答或是深入研究# [+ o' }% a5 F9 ]% {6 v) _

; j1 `$ h, F, I9 m5 w* q[延伸想像]+ C" t3 y( s$ @( X6 O" n: K  o! b
我們又可以仔細想想假如每個process都有各自的table
% O+ w* p$ c! g. L- x那麼從一個process做context switch到另外一個process的時候
8 N7 g% b* X% B& T/ p代表所用的table是不同的
+ j4 d( K4 Z- ~9 Mwow!!!可想而知系統是很忙碌的,1秒鐘context switch 10次就要替mmu切換10次page table的mmap方式, }4 i9 M( ~+ L( `/ X4 |9 m; w9 w) i3 i
不然process用錯page table可能就會指到錯誤的位址
6 m. y) @" G% v+ @那OS到底怎麼切換這些page table?- v9 T. U7 Y8 r
kernel和user program的page table有什麼不同??% ~5 ]) i8 T+ h$ H
; B2 Y) Z( U- P$ y) ]0 ^& r8 C
[延伸想像]# \) o7 M, B9 @( I
假如我們可以修改page table的權利,是不是就可以寫出一個可以偷取別的process data的東西?因為我可以偷偷的map過去他的address space讀取它的資料??    有辦法嗎? 還是根本沒機會?
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-28 04:20 AM , Processed in 0.161009 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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