Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

Linux 下的 mmap()

[複製鏈接]
跳轉到指定樓層
1#
發表於 2008-8-4 15:17:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
以下希望藉由一個實際可以在user mode運作的API, mmap()" I7 Y+ t% T: ~) U6 a
讓programmer能夠感受到MMU這個硬體在系統中所扮演的角色
/ q# ?5 J* L/ a2 H) H* x
+ ?7 |0 j( k. C寫linux底下driver的人常常會看到這個東西 mmap()
, G$ J  u$ e/ H3 f+ E3 @* ?* z3 ^在user mode program裡面假如你用open( "/dev/xxx", ... )
  f" g, e- Q8 N% y5 ?去打開一個檔案系統的節點- p: u- y- p- l4 f+ f$ e% q: n' m
就可以用這個file descriptor的handler對他做mmap()的動作
! N& V, v/ ?* B( N& {  v6 R9 R+ }那這個mmap究竟背後藏了哪些意義?0 C/ L4 L5 i) g. F: I" c% N
又有哪些硬體在工作才能達成?
% z% A, W" c1 B0 v' Y4 u# _
3 \: c. {! B7 L% l) e9 h# wmmap的字面意義是memory map( X7 V) N" g" ?% q9 ~
顧名思義就是『記憶體映對』
% c  @) A1 A& m7 r簡單來看,就是用mmap()幫你做對映( b. l- V6 W& S3 L/ ?- R
對映好了,對著傳回的address作存取
! L# a$ r4 n4 O, ^5 ^; j就等於對檔案作存取/ L3 f# W) N0 L" i
9 i# y  T+ F1 T) |: Z
1. 首先來看mmap()一般是怎麼被使用的 (這邊可以先不用管要傳什麼參數)! E2 p/ e- F3 _
int fd, mapSize, offset, start;5 J7 |# }9 u6 q8 R
char* ptr;) n4 P  h% T& k, g$ Q
+ u- o+ N6 `, \- w* |$ j
mapSize = 0x1000; /* 希望映對多大的區塊 */8 S8 I0 b0 F& h& s  |' H# l5 m
offset = 0;: Q7 q/ w% H/ h$ N0 u
start = 0;' d) a1 f, B, h) ~
/* 打開檔案 */
3 j& A2 E& M- zfd = open( "/home/tester/a.txt", O_RDWR | O_SYNC );  , q- Z; C6 }7 ]/ J1 ^
/* 作mmap動作,取得一個對應好的address */5 Z8 }) a7 V! Z6 N0 S
ptr = mmap( 0, map_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, offset );( Q4 X# s* b2 S; ]

1 M* P# N2 v) ?; R: S, q/ E& X, D假如一切順利的話 ptr 就會接到一個address,這個address會對應到a.txt這個檔案所在的起始位置,
  M2 I. j- R  q5 S% g" j5 @0 c6 u如果這時候我們用 strcpy( ptr, "hello!!" );0 i6 R5 N) q7 e
# y1 s9 ]! A( V% H1 A; F
a.txt裡面就會被寫入"hello!!"的字串* a0 \# l% R+ Z+ }# z. R" O; V

6 C6 g  o% s4 y2. 假如我寫了兩個程式,都是用mmap()到同一個a.txt,程式會不會出問題? 如果不會,那我既然對同一個檔案作mmap(),那我拿到的ptr不是應該是相同的address?! z1 Q- {4 [0 b/ j

  k9 u7 ?% t/ R" w& i8 I" k答案是:兩個程式可以正常執行,但是這兩個回傳的address不一定相同。
. ^1 J, P$ S9 h% D/ Fwhy?  為什麼對同一個檔案寫入,也都做同樣的mmap()動作,甚至傳的參數值都相同。# k/ [& u! l0 \. T# J
為什麼拿到的address可以是不同的? 更奇怪的是,位址不同,還是同樣寫到同一個檔案上頭。, Z- l. U6 k" W" p, J

5 V2 b2 {2 t/ u+ R假如這一切都是合理的,那表示雖然這兩個位址不一定相同,其實都是對映同一個地方,表示有某種東西記錄著這個對應關係。而且,兩個program的ptr有時候會一樣,可是有時候又不一樣。唯一個可能是表示兩個process各自保有這些映對的方式。( j; Z2 `9 {9 r/ t1 f7 v

2 ~$ \# y8 j  u1 w2 O3. 假設我只寫一個程式,但是mmap()兩次到同一個檔案上呢? 得到的兩個ptr會一樣嗎?% U& t/ C4 E; f! r3 k
# T1 n# ^) E0 {9 X, M
答案是:這個兩ptr還是不一樣的,兩個不同program 跑出來的mmap()結果不同也就算了,同一個program呼叫兩次mmap()跑出來的ptr也不一樣,但又都對映著相同的檔案a.txt。因此我們又可以猜測這一個mmap()是動態的,動態去產生一種應對的方式,將傳回的ptr對應到真正的檔案a.txt去,所以同一個process可以對應好幾次,好幾次都用不同的address去對映到相同的檔案上去。
+ A+ e5 f7 X! T! G* @$ l
2 J( r& c6 ?- `綜合上面三種現象,我們合理的懷疑系統裡面存在了一個東西,它讓每一個process可以動態地記錄address的對應關係。並且,每個process各自擁有這個table,而這些對映的關係會動態的反應在這個table當中。* L. l; q* i4 S# J/ T3 {
  v/ n" N; ], h
回想一下一個系統有誰會做這種工作,不就是MMU所擔任的重要角色嗎?
0 G; e7 J3 O0 a: U0 ]每個process各自擁有自己的 page table 當他呼叫mmap()的時候,系統就動態地幫她在這個table上寫上紀錄著; c4 z, w. G2 S
/ s" S5 e" o8 M+ x. o$ G
[processA-pgtable], [* ]5 ^6 \  H* P& b" L$ g
0x00008000 ptr1 --> a.txt. l6 q6 U* w* N' @+ H
0xa0008000 ptr2 --> a.txt( u  _9 i# C' n& [

4 G/ s; `/ [7 i[processB-pgtable]
3 X  x$ x: k+ Y7 Z8 ]' K1 m& R0x00008000 ptr1 --> a.txt* w+ q% |, t6 P3 J* J! _5 ]
0xb0008000 ptr2 --> a.txt
/ p" Z0 w$ e" l6 {/ M( d' c
- U/ q9 P8 s4 a( t這樣ptr1, ptr2都可以對應到相同的地方,又因為各個process又有不同table,所以有時候ptr1有可能會相同。* ?& x/ @, ^5 G3 Q
如此一來,我們終於可以合理的解釋我們觀察mmap()為何對映出來的address會有如此的表現。原來就是MMU被加入,而且OS又被設計成每個process都會各自擁有一個page table來記錄他對記憶體如何解讀。

評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
 樓主| 發表於 2008-8-4 15:20:27 | 只看該作者
略寫下兩個延伸的想像問題8 U2 g  _  f* X( `- w1 A
或許有人有興趣可以回答或是深入研究1 q5 Y9 H: V2 ^4 g& f0 |
, ~$ T, R6 q3 S. d% V
[延伸想像]! c6 ?5 x. X; u4 z
我們又可以仔細想想假如每個process都有各自的table
& q, g4 I( W% V% s* I那麼從一個process做context switch到另外一個process的時候$ W, h2 s7 J9 [, P+ W
代表所用的table是不同的
! p3 `4 ?; h$ K! e  iwow!!!可想而知系統是很忙碌的,1秒鐘context switch 10次就要替mmu切換10次page table的mmap方式
9 g* b+ ]! M; G3 U. L) @" R% x0 c不然process用錯page table可能就會指到錯誤的位址. a9 n! N9 C. b( T6 e
那OS到底怎麼切換這些page table?2 m5 v( }9 S5 y! {0 L8 O+ `- [+ ?
kernel和user program的page table有什麼不同??
6 D: D1 P* ?& j! q+ n3 W9 B( X: F' L$ P9 |- ?6 ?
[延伸想像]
' t2 P0 Q1 T, J, l0 v: P2 g假如我們可以修改page table的權利,是不是就可以寫出一個可以偷取別的process data的東西?因為我可以偷偷的map過去他的address space讀取它的資料??    有辦法嗎? 還是根本沒機會?
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-9-21 03:26 PM , Processed in 0.170010 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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