Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

Linux 下的 mmap()

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-8-4 15:17:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
以下希望藉由一個實際可以在user mode運作的API, mmap()# c, s6 \, i! q0 P! U9 `
讓programmer能夠感受到MMU這個硬體在系統中所扮演的角色
4 g/ n7 `3 s7 O  ~+ h, f6 P7 Y! h2 A: e$ h) d/ ]" f6 {  a% `5 m
寫linux底下driver的人常常會看到這個東西 mmap()
- S9 N$ P" `' n4 Z# N8 S在user mode program裡面假如你用open( "/dev/xxx", ... )
7 r) f- d2 B6 W& c: f去打開一個檔案系統的節點( L" P# s3 p* U0 t
就可以用這個file descriptor的handler對他做mmap()的動作
7 ]" U. k# p' i1 {那這個mmap究竟背後藏了哪些意義?
8 W6 w0 A9 e4 O又有哪些硬體在工作才能達成?$ _2 e9 r* ?: Y

6 C$ }+ n, Y" @  ~/ l' J2 Qmmap的字面意義是memory map2 g; g# r; X% `
顧名思義就是『記憶體映對』
6 o$ }/ c/ x7 ~* a$ C- `0 c" m+ k3 h簡單來看,就是用mmap()幫你做對映* K( T0 ]2 t. M5 H( t4 w* S
對映好了,對著傳回的address作存取
9 O( J' J# N8 \( r5 ?* ?% c+ g7 w就等於對檔案作存取8 }  J& K* v% s! p; P* K' }2 q/ W
5 }9 N. V) I0 `+ z
1. 首先來看mmap()一般是怎麼被使用的 (這邊可以先不用管要傳什麼參數)
! ^. L) V* ^$ D3 q& lint fd, mapSize, offset, start;
2 `/ q) L* w7 U6 I5 x" lchar* ptr;: K) K, W7 R8 C' b! t1 g- Q1 n% e
4 l3 q9 k4 [, C) S  C) h
mapSize = 0x1000; /* 希望映對多大的區塊 */, i- b  Q; k5 X) `7 q( ~9 r
offset = 0;3 A4 G2 W; `# t- P  _
start = 0;
7 h( R- h: m8 K( m2 A* S/* 打開檔案 */8 ^7 s" a0 R! t% E/ [& o$ a
fd = open( "/home/tester/a.txt", O_RDWR | O_SYNC );  ! F$ I3 I6 K# W) d# c
/* 作mmap動作,取得一個對應好的address */
( d+ A9 g5 V, R5 e) x! Hptr = mmap( 0, map_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, offset );
) [0 n' [, j. |& U
( x0 E* r% x$ S假如一切順利的話 ptr 就會接到一個address,這個address會對應到a.txt這個檔案所在的起始位置,% p) m3 W7 i7 r+ b5 R4 V. w8 s' ]; _
如果這時候我們用 strcpy( ptr, "hello!!" );
7 V* D7 i6 M) s, V4 q3 D6 ]* y1 c2 ]
a.txt裡面就會被寫入"hello!!"的字串2 T+ g/ i, u; a8 n& h5 z7 h
1 a# t4 V$ Z& E. C3 K+ c
2. 假如我寫了兩個程式,都是用mmap()到同一個a.txt,程式會不會出問題? 如果不會,那我既然對同一個檔案作mmap(),那我拿到的ptr不是應該是相同的address?
/ f6 ^! r, U3 x2 f* c& O' \% G9 I. Q; W9 j6 Z$ q) C
答案是:兩個程式可以正常執行,但是這兩個回傳的address不一定相同。
) t, f8 r1 p' {" ~: d0 Xwhy?  為什麼對同一個檔案寫入,也都做同樣的mmap()動作,甚至傳的參數值都相同。
* [1 H0 b6 U6 t- F6 \% m5 Q; r0 g為什麼拿到的address可以是不同的? 更奇怪的是,位址不同,還是同樣寫到同一個檔案上頭。
+ F: \5 f0 p5 i2 H
, V" J0 _$ Y3 B8 h/ A* ^假如這一切都是合理的,那表示雖然這兩個位址不一定相同,其實都是對映同一個地方,表示有某種東西記錄著這個對應關係。而且,兩個program的ptr有時候會一樣,可是有時候又不一樣。唯一個可能是表示兩個process各自保有這些映對的方式。" }% Y% I( y  O) ^

3 q8 B$ D; a( r  k! p8 }3. 假設我只寫一個程式,但是mmap()兩次到同一個檔案上呢? 得到的兩個ptr會一樣嗎?
* T) K6 g# ]. Z6 i) Y9 A+ B3 }7 |3 }8 u2 T
答案是:這個兩ptr還是不一樣的,兩個不同program 跑出來的mmap()結果不同也就算了,同一個program呼叫兩次mmap()跑出來的ptr也不一樣,但又都對映著相同的檔案a.txt。因此我們又可以猜測這一個mmap()是動態的,動態去產生一種應對的方式,將傳回的ptr對應到真正的檔案a.txt去,所以同一個process可以對應好幾次,好幾次都用不同的address去對映到相同的檔案上去。
+ m0 `. c8 U$ `9 c- ?7 }+ h% e  ^$ P
綜合上面三種現象,我們合理的懷疑系統裡面存在了一個東西,它讓每一個process可以動態地記錄address的對應關係。並且,每個process各自擁有這個table,而這些對映的關係會動態的反應在這個table當中。
1 R+ L7 I( k& ]. O  r5 n- [, C: E
$ s5 I0 U4 n- t) P回想一下一個系統有誰會做這種工作,不就是MMU所擔任的重要角色嗎?
0 t! ~# \$ m, y. s* T每個process各自擁有自己的 page table 當他呼叫mmap()的時候,系統就動態地幫她在這個table上寫上紀錄著
' S1 h; y/ ^# E) m7 [
/ _& M! T/ V: C9 a" ]1 v& L9 F[processA-pgtable]0 r+ {( a9 l( y2 `7 T. e, E8 P' c
0x00008000 ptr1 --> a.txt
: B- d7 N7 K. p6 @0 p4 I0xa0008000 ptr2 --> a.txt( b# {1 [  d) D8 L- y

" X# N/ x* c  {8 m9 W, |( H; R[processB-pgtable]8 I: k) Q* o) y! T, v
0x00008000 ptr1 --> a.txt( Z& @3 t( g( {
0xb0008000 ptr2 --> a.txt
+ i. x( m  f. r. [
( D4 U6 K2 j. U5 _2 D% x這樣ptr1, ptr2都可以對應到相同的地方,又因為各個process又有不同table,所以有時候ptr1有可能會相同。; n: Q+ h  Z6 C% m  T
如此一來,我們終於可以合理的解釋我們觀察mmap()為何對映出來的address會有如此的表現。原來就是MMU被加入,而且OS又被設計成每個process都會各自擁有一個page table來記錄他對記憶體如何解讀。

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-8-4 15:20:27 | 只看該作者
略寫下兩個延伸的想像問題
; H3 X6 J8 E, ~( e7 P或許有人有興趣可以回答或是深入研究
. \5 }7 |  t0 ?
7 o! K3 ?3 z! ]3 @- V[延伸想像]+ K$ J! A7 c( {; F$ g& @' r1 F7 ]5 v
我們又可以仔細想想假如每個process都有各自的table& a4 o5 ]- x! q7 d; t7 H. G, w+ K
那麼從一個process做context switch到另外一個process的時候9 u  f& z' L! T$ K( N
代表所用的table是不同的  {6 s' g! F. B& {) [% [
wow!!!可想而知系統是很忙碌的,1秒鐘context switch 10次就要替mmu切換10次page table的mmap方式
( I. V& |0 l8 L不然process用錯page table可能就會指到錯誤的位址0 S: }% X! o. H8 @9 Q
那OS到底怎麼切換這些page table?4 b! \* R9 s2 |# b  [
kernel和user program的page table有什麼不同??
9 e& T. q1 e* d- J7 z+ b
$ o- z( z, e7 Z+ \, v; M8 G* C[延伸想像]% U4 C7 }& R5 O( {8 j4 R5 J7 S
假如我們可以修改page table的權利,是不是就可以寫出一個可以偷取別的process data的東西?因為我可以偷偷的map過去他的address space讀取它的資料??    有辦法嗎? 還是根本沒機會?
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-21 05:53 PM , Processed in 0.164009 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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