Re: [問題] dll和記憶體的關係 觀念請教?
※ 引述《QQ29 (我愛阿蓉)》之銘言:
: 請教各位前輩
: 我一直很想把DLL搞得很清楚是什麼
: 但是我不知道有什麼書或式什麼資料 明確的介紹DLL的觀念...
: 我現在是 export 一個dll 裡面有個function : void PRINT(){ cout<<#}
: 而這個num是一個global的變數
: (沒有export出來這變數, 但就算export出來也算是global吧?)
: 我兩隻程式都去load這dll 用GetProcAddress 去 呼叫PRINT
: 印出相同的位址
: 這好像不是巧合....但是因為我沒有確切的資料能夠解釋這是為什麼????
因為process load DLL時 是把DLL的image放進(拷貝進)自己的address space
所以兩個process address space中的DLL image是彼此獨立的
而Load的DLL的image會放在memory space哪邊取決於OS
通常來說 DLL會有一個預設想放得地方 問題是要是process已經把那一塊用掉了的話
OS就會幫你作relocate的動作
如果你的程式沒有用掉那一塊 那麼理所當然你去印num的位址都會一樣
不過兩隻程式雖然印出來的num的位址都一樣 不過並不代表兩個num是同一個
他門仍是兩個不同的num 只是在兩個process中擁有相同的virtual address
: 所以不知道該怎麼建立觀念..... 我google打 : dll memory, dll 記憶體 都goo不到
: ...
: 我又測試了兩個case
: 1.
: 把這dll 檔案 複製一份 並且把檔名 1.dll改成2.dll
: 這兩支程式(a.ex, b.exe) a load 1.dll 和b load 2.dll
: &num印出來又是一樣的位址
理由同上
: 2.
: 把這兩隻1.dll和2.dll 用同一個程式去load (a.exe load 1.dll和2.dll)
: 再呼叫個別的PRINT 印出來的&num就不一樣了
理由同上
當你load 1.dll時 1.dll已經把那塊他想用的space用掉了
既然2.dll是1.dll的拷貝 自然2.dll也想用那一塊
在已經備用掉的情況下 OS會把2.dll relocate到別的地方去
所以2.dll裡面的print num會印到被relocate的num的位址
至於OS怎麼作relocate跟patch程式中的relocatable
那又是另外一個故事了
: 以上這幾個現象 不太知道原因
: 目前有的心得就是 dll 給不同的process load
: 他們的virtual address好像都會一樣 但mapping到 physical address就不一樣了
: 但是會一樣有什麼意義 這也是變成兩份阿?
: 問了一下朋友 好像還有分r/w data 和 r only data....
: 但是他也不清楚
: 資料也找不太到~~
: 可以請教各位是否能讓我建立完整的觀念呢~~??
: 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.87.28
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 4 篇):