Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

Linux 下的 mmap()

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-8-4 15:17:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
以下希望藉由一個實際可以在user mode運作的API, mmap()8 e1 z: i( o$ V# S5 Y
讓programmer能夠感受到MMU這個硬體在系統中所扮演的角色6 T+ t! G! N+ H$ z& ]" D: `
& I& i4 }4 Y4 @; [' @- G
寫linux底下driver的人常常會看到這個東西 mmap()
7 z3 y6 ~2 t8 O  u# g4 P在user mode program裡面假如你用open( "/dev/xxx", ... )
- ^6 s  ?# g' g4 P4 y: E* S5 Z去打開一個檔案系統的節點
* T: L& H. c  v+ z% ~4 t" S. B就可以用這個file descriptor的handler對他做mmap()的動作; t2 L" Q9 x2 F$ a. C$ @
那這個mmap究竟背後藏了哪些意義?
8 H7 M6 C. W) _( g. i6 b. J又有哪些硬體在工作才能達成?
+ h1 k! ?% V2 }3 ~2 W! T
# e; h& d, L3 I: ^; g1 \( c. vmmap的字面意義是memory map
! V) ?- }4 s$ g/ p) U- A  b1 j顧名思義就是『記憶體映對』
- D" z: f) K% v* S簡單來看,就是用mmap()幫你做對映
0 }  l/ Q2 ^& C對映好了,對著傳回的address作存取
3 k8 |0 Y3 V. {) n8 h; x3 o. Z# H就等於對檔案作存取
7 Z6 n, x8 R5 {. P/ E& T4 U3 ~$ \* h4 l
1. 首先來看mmap()一般是怎麼被使用的 (這邊可以先不用管要傳什麼參數)
" G- e7 c: q$ T" X8 bint fd, mapSize, offset, start;
5 I) q* c1 t) @; o* Cchar* ptr;
2 j, L9 w# H& @. O+ X4 ^
5 p# y% k+ |% w7 F; p' EmapSize = 0x1000; /* 希望映對多大的區塊 */9 v. R9 T3 k3 p; Q7 r' s
offset = 0;6 [" ~7 p% ?7 B
start = 0;
! \/ L- M) a3 C/* 打開檔案 */
; H+ ?7 E5 l6 k5 k# {fd = open( "/home/tester/a.txt", O_RDWR | O_SYNC );  
9 ]" s9 u% K3 d' o! J6 n  B/* 作mmap動作,取得一個對應好的address */
; C' e/ s' J% `  i/ rptr = mmap( 0, map_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, offset );
$ m2 _5 I4 m' B
; t: M1 u+ d9 k$ I; c: |; E假如一切順利的話 ptr 就會接到一個address,這個address會對應到a.txt這個檔案所在的起始位置,5 f& q  |4 v2 ^1 n% E* Y0 {
如果這時候我們用 strcpy( ptr, "hello!!" );
4 b$ x- t' \" E- Q+ }: c0 Y, \+ l7 r9 Y
a.txt裡面就會被寫入"hello!!"的字串
! D) Y. O) ?4 V7 v0 x
4 J8 a, A5 V& M" F1 }5 I  l! F2. 假如我寫了兩個程式,都是用mmap()到同一個a.txt,程式會不會出問題? 如果不會,那我既然對同一個檔案作mmap(),那我拿到的ptr不是應該是相同的address?
( l( E' j9 }+ _/ n' K2 d# Z% m4 ]
& U$ y: t' l$ j. X# f$ V$ M" h答案是:兩個程式可以正常執行,但是這兩個回傳的address不一定相同。+ m5 p7 n$ R0 U2 _0 u6 f6 J
why?  為什麼對同一個檔案寫入,也都做同樣的mmap()動作,甚至傳的參數值都相同。
0 s8 v/ D9 z! l& \3 }6 T為什麼拿到的address可以是不同的? 更奇怪的是,位址不同,還是同樣寫到同一個檔案上頭。
4 m0 U7 J% c# N* D. [1 _1 I
3 g! q8 z5 e% p假如這一切都是合理的,那表示雖然這兩個位址不一定相同,其實都是對映同一個地方,表示有某種東西記錄著這個對應關係。而且,兩個program的ptr有時候會一樣,可是有時候又不一樣。唯一個可能是表示兩個process各自保有這些映對的方式。
0 K# ]& G; ^& O7 X: A) P) U0 N+ C0 F8 A! e0 [$ l
3. 假設我只寫一個程式,但是mmap()兩次到同一個檔案上呢? 得到的兩個ptr會一樣嗎?
" v% G# l; ?1 K& y
$ o' h. H+ E, `; e- x  K* c8 Y答案是:這個兩ptr還是不一樣的,兩個不同program 跑出來的mmap()結果不同也就算了,同一個program呼叫兩次mmap()跑出來的ptr也不一樣,但又都對映著相同的檔案a.txt。因此我們又可以猜測這一個mmap()是動態的,動態去產生一種應對的方式,將傳回的ptr對應到真正的檔案a.txt去,所以同一個process可以對應好幾次,好幾次都用不同的address去對映到相同的檔案上去。
9 r0 A: |/ A$ ?2 k5 K4 R0 `
" S' y, `* }) s綜合上面三種現象,我們合理的懷疑系統裡面存在了一個東西,它讓每一個process可以動態地記錄address的對應關係。並且,每個process各自擁有這個table,而這些對映的關係會動態的反應在這個table當中。3 `& ?9 |3 O! v+ H; c1 w( e4 j

! s& W  j1 }# o' p4 F$ b4 |" O回想一下一個系統有誰會做這種工作,不就是MMU所擔任的重要角色嗎?' l8 s6 X. y& {6 B% t1 a
每個process各自擁有自己的 page table 當他呼叫mmap()的時候,系統就動態地幫她在這個table上寫上紀錄著# Y. N: P+ m1 W+ k& y
7 D1 _; U4 \; k# v: a/ U. [
[processA-pgtable]; k) k* z/ Q$ I& f1 l
0x00008000 ptr1 --> a.txt& U' k+ T& t9 a; H+ ]7 {  K  C' O
0xa0008000 ptr2 --> a.txt& v7 e$ [, i: {7 s, H5 \

: N; M7 D( o8 Q; ][processB-pgtable]8 i9 }# m8 p9 b0 P& x4 z
0x00008000 ptr1 --> a.txt+ n2 F  l% U$ |+ j1 r# `  u9 Z+ ^0 d
0xb0008000 ptr2 --> a.txt
2 }0 {5 c& U1 v( E9 z& }+ H& \
& m) G  N( b1 Y, h. f' t$ E這樣ptr1, ptr2都可以對應到相同的地方,又因為各個process又有不同table,所以有時候ptr1有可能會相同。2 G" T2 l0 ]2 e0 z+ L1 R- f1 Y( c
如此一來,我們終於可以合理的解釋我們觀察mmap()為何對映出來的address會有如此的表現。原來就是MMU被加入,而且OS又被設計成每個process都會各自擁有一個page table來記錄他對記憶體如何解讀。

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-8-4 15:20:27 | 只看該作者
略寫下兩個延伸的想像問題& C5 m# s9 z3 n$ b. Y+ d0 B
或許有人有興趣可以回答或是深入研究
8 D/ T6 [! M9 `( F" b
( l6 I  D- U* d' G3 A[延伸想像]
& ]4 W, t6 \9 l+ T) H我們又可以仔細想想假如每個process都有各自的table1 F7 p% X) ]; {. `  w
那麼從一個process做context switch到另外一個process的時候
0 a  @" y. o- t3 |$ ^; Y& t2 D; y5 @代表所用的table是不同的
2 o4 W7 v; t, I% y/ Z! [1 U! a: ?% kwow!!!可想而知系統是很忙碌的,1秒鐘context switch 10次就要替mmu切換10次page table的mmap方式& T% g1 h6 A1 T) F
不然process用錯page table可能就會指到錯誤的位址
7 U- E0 f* l) n1 ]( S7 ~# `; |$ _那OS到底怎麼切換這些page table?
% h$ E2 ]" {  ~: r- {& T, [& Bkernel和user program的page table有什麼不同??
0 q" Q5 k1 h# R. S* Z- X" T0 n& h3 a: x
[延伸想像]: B* i. [& o6 m
假如我們可以修改page table的權利,是不是就可以寫出一個可以偷取別的process data的東西?因為我可以偷偷的map過去他的address space讀取它的資料??    有辦法嗎? 還是根本沒機會?
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2025-1-22 11:45 PM , Processed in 0.156000 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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