Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

Linux 下的 mmap()

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-8-4 15:17:18 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
以下希望藉由一個實際可以在user mode運作的API, mmap(); l" l/ I$ ^; X# \# \# @
讓programmer能夠感受到MMU這個硬體在系統中所扮演的角色4 b5 N2 \# j4 f1 Z" i) u
$ Y6 ?* X$ x4 T
寫linux底下driver的人常常會看到這個東西 mmap()
( B! b% l* `, n& _在user mode program裡面假如你用open( "/dev/xxx", ... ); i2 H! o- g3 A% J& h( s9 W
去打開一個檔案系統的節點
  O; R; C! p6 r* M4 D& E就可以用這個file descriptor的handler對他做mmap()的動作, w1 R& f$ `: F" C4 `
那這個mmap究竟背後藏了哪些意義?
- [+ S' r; ]) ]# U# p又有哪些硬體在工作才能達成?
' k1 p) H( n! F1 f
( K; q; c) c8 v0 W$ \% _* smmap的字面意義是memory map
7 P6 o9 U( @4 ~' c顧名思義就是『記憶體映對』) b! G5 k$ x" a. r5 b9 Z
簡單來看,就是用mmap()幫你做對映
8 T' `. \  v$ Z6 V" M  [對映好了,對著傳回的address作存取, f" e: f1 c% z( F1 W$ `
就等於對檔案作存取
* b0 w' B9 c' H3 ^
1 h7 T' V# ^" \7 N1. 首先來看mmap()一般是怎麼被使用的 (這邊可以先不用管要傳什麼參數)+ c( y# P! H- H( P' p( A9 Y
int fd, mapSize, offset, start;3 M3 R; D2 Q- r
char* ptr;# O2 D5 k5 }4 `1 m7 s; _
5 F6 R1 E7 v. @' d* D
mapSize = 0x1000; /* 希望映對多大的區塊 */
% D3 I0 l- m& N# E1 O8 a& b, zoffset = 0;7 W" r+ o. K- F9 y* s
start = 0;% H, ~: n& R- Y: m, b; C. `
/* 打開檔案 */% d, s6 o4 b3 E; Q) W9 m
fd = open( "/home/tester/a.txt", O_RDWR | O_SYNC );  ) _" W, |1 s% q, g3 G9 [$ |' g
/* 作mmap動作,取得一個對應好的address */8 n; c& b3 L9 v1 O& D
ptr = mmap( 0, map_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, offset );; v- G/ _! ~% v& N, v- i

( d+ |/ J9 G0 Q6 i假如一切順利的話 ptr 就會接到一個address,這個address會對應到a.txt這個檔案所在的起始位置,
* ?, r2 h- N) W; n如果這時候我們用 strcpy( ptr, "hello!!" );1 x) q5 ?3 Y' ~2 U4 U

$ H8 ~! D  [& U/ ua.txt裡面就會被寫入"hello!!"的字串
# I/ F. e7 X) |/ E% |. U, f6 Z+ h% v1 g; e+ U6 h0 a: e0 C
2. 假如我寫了兩個程式,都是用mmap()到同一個a.txt,程式會不會出問題? 如果不會,那我既然對同一個檔案作mmap(),那我拿到的ptr不是應該是相同的address?" Z$ H4 a: d, v. g/ n8 y
& v% D8 n& t+ g  l, J
答案是:兩個程式可以正常執行,但是這兩個回傳的address不一定相同。
) s; M, G& w& Q+ f* @$ n5 m; ?! ewhy?  為什麼對同一個檔案寫入,也都做同樣的mmap()動作,甚至傳的參數值都相同。: a; u' C: f% y" f0 f4 U
為什麼拿到的address可以是不同的? 更奇怪的是,位址不同,還是同樣寫到同一個檔案上頭。6 O# Z" z, [3 }; a% j: ]% a& t3 |
; s( @: K% r( ]8 J. s. j
假如這一切都是合理的,那表示雖然這兩個位址不一定相同,其實都是對映同一個地方,表示有某種東西記錄著這個對應關係。而且,兩個program的ptr有時候會一樣,可是有時候又不一樣。唯一個可能是表示兩個process各自保有這些映對的方式。
+ x% x: F  N& A" `- ^) Z# K& Z
' v  Y/ }. z+ C* o8 w3. 假設我只寫一個程式,但是mmap()兩次到同一個檔案上呢? 得到的兩個ptr會一樣嗎?4 L; C, |: X: K0 T; p6 o

+ Y! F# A$ C9 E( i' Y答案是:這個兩ptr還是不一樣的,兩個不同program 跑出來的mmap()結果不同也就算了,同一個program呼叫兩次mmap()跑出來的ptr也不一樣,但又都對映著相同的檔案a.txt。因此我們又可以猜測這一個mmap()是動態的,動態去產生一種應對的方式,將傳回的ptr對應到真正的檔案a.txt去,所以同一個process可以對應好幾次,好幾次都用不同的address去對映到相同的檔案上去。) E, b5 X/ L8 X1 S) A% J% s

( T  x2 ]' f- [+ s" |# r' H綜合上面三種現象,我們合理的懷疑系統裡面存在了一個東西,它讓每一個process可以動態地記錄address的對應關係。並且,每個process各自擁有這個table,而這些對映的關係會動態的反應在這個table當中。
- M- o+ x& g4 F( c. ]8 Y; [# F  s4 S6 W; ^9 |
回想一下一個系統有誰會做這種工作,不就是MMU所擔任的重要角色嗎?
- v* S  I: B4 O* j1 R% X# |每個process各自擁有自己的 page table 當他呼叫mmap()的時候,系統就動態地幫她在這個table上寫上紀錄著) {7 E) ~3 I) ]" k
* U/ I$ U6 a$ j0 a: l$ c' H8 J
[processA-pgtable]
0 V5 ?3 H3 P0 E# s. q* F0x00008000 ptr1 --> a.txt
6 z* e1 U+ Q9 W% n' w' u. Z0xa0008000 ptr2 --> a.txt; Y* j6 Z& Z5 t2 ^4 a

. s& C( a  D$ r8 A1 r: W7 L7 C9 a[processB-pgtable]
! M$ _8 b5 z' H- |) D0x00008000 ptr1 --> a.txt
) w, L- u2 T& a# {. H0xb0008000 ptr2 --> a.txt7 [: t& ]+ w( o, z  C$ f3 R8 E( n5 x
5 k' ^5 F# T- T8 d
這樣ptr1, ptr2都可以對應到相同的地方,又因為各個process又有不同table,所以有時候ptr1有可能會相同。
& C6 |4 g7 k5 O如此一來,我們終於可以合理的解釋我們觀察mmap()為何對映出來的address會有如此的表現。原來就是MMU被加入,而且OS又被設計成每個process都會各自擁有一個page table來記錄他對記憶體如何解讀。

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-8-4 15:20:27 | 只看該作者
略寫下兩個延伸的想像問題" ?0 V+ C. d1 X4 `$ D
或許有人有興趣可以回答或是深入研究& Z0 f! ?) N! w1 e3 H% U$ n2 I
$ T3 i! W* a, M. o. Z( a3 }4 B7 r$ r
[延伸想像]
2 }/ r" z7 B$ N; c# w- q, N我們又可以仔細想想假如每個process都有各自的table6 y0 ?  O) a& z/ h
那麼從一個process做context switch到另外一個process的時候
, c/ P0 e. e+ {; l4 {( E代表所用的table是不同的
" H' n$ K2 y- Nwow!!!可想而知系統是很忙碌的,1秒鐘context switch 10次就要替mmu切換10次page table的mmap方式
9 {% A9 m5 u+ a) D& I) m4 o& a' d2 Z' z3 Q不然process用錯page table可能就會指到錯誤的位址' L0 L& ~% I( N) R3 j% U+ r) U
那OS到底怎麼切換這些page table?- o9 m$ \! v- h
kernel和user program的page table有什麼不同??% i/ S# H6 b! T0 v) E

$ Y0 x" C: V" ~7 T' u[延伸想像]8 H9 x: G% h- e3 C$ |
假如我們可以修改page table的權利,是不是就可以寫出一個可以偷取別的process data的東西?因為我可以偷偷的map過去他的address space讀取它的資料??    有辦法嗎? 還是根本沒機會?
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-21 05:58 PM , Processed in 0.170010 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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