Re: [問題] dll和記憶體的關係 觀念請教?

看板C_and_CPP作者 (inevitable......)時間15年前 (2010/03/04 05:20), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/4 (看更多)
※ 引述《QQ29 (我愛阿蓉)》之銘言: : 請教各位前輩 : 我一直很想把DLL搞得很清楚是什麼 : 但是我不知道有什麼書或式什麼資料 明確的介紹DLL的觀念... : 我現在是 export 一個dll 裡面有個function : void PRINT(){ cout<<&num;} : 而這個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
文章代碼(AID): #1BZqC6Nx (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BZqC6Nx (C_and_CPP)