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

看板C_and_CPP作者 (我愛阿蓉)時間15年前 (2010/03/04 04:37), 編輯推噓3(3012)
留言15則, 5人參與, 最新討論串1/4 (看更多)
請教各位前輩 我一直很想把DLL搞得很清楚是什麼 但是我不知道有什麼書或式什麼資料 明確的介紹DLL的觀念... 我現在是 export 一個dll 裡面有個function : void PRINT(){ cout<<&num;} 而這個num是一個global的變數 (沒有export出來這變數, 但就算export出來也算是global吧?) 我兩隻程式都去load這dll 用GetProcAddress 去 呼叫PRINT 印出相同的位址 這好像不是巧合....但是因為我沒有確切的資料能夠解釋這是為什麼???? 所以不知道該怎麼建立觀念..... 我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就不一樣了 以上這幾個現象 不太知道原因 目前有的心得就是 dll 給不同的process load 他們的virtual address好像都會一樣 但mapping到 physical address就不一樣了 但是會一樣有什麼意義 這也是變成兩份阿? 問了一下朋友 好像還有分r/w data 和 r only data.... 但是他也不清楚 資料也找不太到~~ 可以請教各位是否能讓我建立完整的觀念呢~~?? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.64.222

03/04 12:39, , 1F
我也想知道
03/04 12:39, 1F

03/04 12:57, , 2F
我也想知道 ><
03/04 12:57, 2F

03/04 13:07, , 3F
virtual address的好處是每個process都自己使用獨立的定
03/04 13:07, 3F

03/04 13:07, , 4F
址空間, 不然每個process對address操作都還要檢查physic
03/04 13:07, 4F

03/04 13:08, , 5F
addr有沒有衝突你不是程式要判斷到瘋掉(或者compiler幫
03/04 13:08, 5F

03/04 13:08, , 6F
你加check加到瘋掉); 把virt addr與phy addr的mapping交
03/04 13:08, 6F

03/04 13:09, , 7F
給OS來管理, 這兩份甚至N份不同的addr space就方便很多.
03/04 13:09, 7F

03/04 13:10, , 8F
兩個.exe去印出來&num一樣可能是剛好, 請寫兩個規模差很
03/04 13:10, 8F

03/04 13:11, , 9F
多的.exe再各別去load看看; 用VC的話, 你可以debugger
03/04 13:11, 9F

03/04 13:11, , 10F
在load完.dll後break起來看看module頁面, 會有這些不同
03/04 13:11, 10F

03/04 13:12, , 11F
binary的起始位址. 至於一個.exe load兩個獨立的.dll它
03/04 13:12, 11F

03/04 13:12, , 12F
們佔據到的addr space本來就會不同, 不然多個.dll要是可
03/04 13:12, 12F

03/04 13:13, , 13F
能佔用同addr, 你的virt addr space自己就亂到炸掉了.
03/04 13:13, 13F

03/04 13:52, , 14F
其實這跟C沒關 逃~
03/04 13:52, 14F

03/04 18:51, , 15F
Win32的exe讀進ram裡面也是都固定從0x00400000開始放啊 XD
03/04 18:51, 15F
文章代碼(AID): #1BZpa5Mg (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BZpa5Mg (C_and_CPP)