[問題] virtual memory的疑惑

看板C_and_CPP作者 (我愛阿蓉)時間15年前 (2010/07/08 19:23), 編輯推噓9(9044)
留言53則, 4人參與, 最新討論串1/2 (看更多)
#include <iostream> #include <windows.h> using namespace std; class A{ public: A() { cout<<"CSTR:"<<this<<endl; } ~A(){cout<<"DSTR:"<<this<<endl;} }; A a; int main() { system("PAUSE"); } 簡單的測試程式 我把這程式build出的 exe檔案 Test case 1: ======================= 點兩下執行 印出第一個this的address OK我exe還不關掉 再點兩下開另一個exe 奇怪this的位址還是一樣...... ========================= Test Case 2: ========================= 點兩下 跑完關掉exe 在點兩下 兩次的address會不一樣 奇怪??這跟case1差別在哪? ========================= Test Case 3: ========================= 我把exe檔案複製一份改檔名 test1.exe和test2.exe 分別作 case1的事情 只要同檔名的 印出的address會一樣 不同檔名印出來的卻不一樣 ========================= 以上該怎麼解釋這現象呢?? 我觀念是不同process 跟檔名無關 應該都是不同的 physical memory 雖然virtual address有這奇怪的現象但應該對應到physical都不一樣阿 以上請教各位 thx~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.64.222

07/08 19:34, , 1F
case 1: COW, case 2: 載入到記憶體不同地方
07/08 19:34, 1F

07/08 19:36, , 2F
有錯還請不吝指教 m(_ _)m
07/08 19:36, 2F

07/08 19:47, , 3F
程式碼的部份OS會讓不同的行程共用, 堆疊才是各自不同
07/08 19:47, 3F

07/08 19:50, , 4F
你看到的應該都是虛擬位址, 不是實體位址...
07/08 19:50, 4F

07/09 04:47, , 5F
後來查到的資料似乎指向 : 邏輯 > 虛擬 > 實體, 這樣
07/09 04:47, 5F

07/09 04:47, , 6F
的對應關係...> <
07/09 04:47, 6F

07/09 09:12, , 7F
能請教一下資料嗎?? 小弟不太明白邏輯位址是什麼概念@@"
07/09 09:12, 7F

07/09 12:54, , 8F
只是一些關於 OS 記憶體管理的文章, 有的會把邏輯、虛
07/09 12:54, 8F

07/09 12:56, , 9F
擬當成是一樣東西, 有的卻沒有, 邏輯位址就是像在寫
07/09 12:56, 9F

07/09 12:59, , 10F
組語時跳躍的位址, 但是載入的時候會重定位
07/09 12:59, 10F

07/09 13:03, , 11F
不過重定位是指對映到虛擬記憶體還是實體記憶體, 都
07/09 13:03, 11F

07/09 13:03, , 12F
交代不清楚
07/09 13:03, 12F

07/09 13:16, , 13F
那看起來像是offset, 也就是以當前PC為準往前或往後跳多
07/09 13:16, 13F

07/09 13:18, , 14F
少; 等loader重定位後, 應該是virtual address吧@_@"
07/09 13:18, 14F

07/09 13:44, , 15F
不過我發現只要是同樣大的程式, 印出來的記憶體位址都
07/09 13:44, 15F

07/09 13:46, , 16F
會一樣(堆積也是), 不太可能都共用同一塊吧...
07/09 13:46, 16F

07/09 21:15, , 17F
relocation 完當然還是定位在虛擬位址上,不然怎麼跑。
07/09 21:15, 17F

07/09 21:17, , 18F
以 3G/1G 這樣切 user/kernel space 的 32-bit 系統來說,
07/09 21:17, 18F

07/09 21:17, , 19F
你程式跑起來共用的區間也只有 1G 那塊 kernel space。
07/09 21:17, 19F

07/09 21:18, , 20F
你的 process 在那 3G 區間裡就算 address 跟其它 process
07/09 21:18, 20F

07/09 21:18, , 21F
的某個 pointer 重複,兩個 process 也不會相互影響到對方
07/09 21:18, 21F

07/09 21:19, , 22F
。因為那 3G 的虛擬記憶體空間是每個 process 各自獨有。
07/09 21:19, 22F

07/09 21:40, , 23F
這樣看起來各自獨有的那些虛擬記憶體比較像是邏輯位址
07/09 21:40, 23F

07/09 21:40, , 24F
可以這樣想嗎, t 大 ?
07/09 21:40, 24F

07/09 22:30, , 25F
其實我不太想烙名詞。logical address 是在 paging 的系統
07/09 22:30, 25F

07/09 22:31, , 26F
下面用的,有 paging 的系統不等於有 virtual memory 的
07/09 22:31, 26F

07/09 22:31, , 27F
系統。所以有讀過 OS 教科書的都知道,paging 跟 virtual
07/09 22:31, 27F

07/09 22:31, , 28F
memory 是分開講的。logical 用在 paging,virtual 用在
07/09 22:31, 28F

07/09 22:32, , 29F
virtual memory。
07/09 22:32, 29F

07/09 22:32, , 30F
只是 virtual memory 的實作有一種方法是用 paging 的方法
07/09 22:32, 30F

07/09 22:33, , 31F
去搞,所有有些人讀到後面就以為 paging 機制是為了實作
07/09 22:33, 31F

07/09 22:33, , 32F
virtual memory 才發明的。但其實 paging 跟 virtual
07/09 22:33, 32F

07/09 22:33, , 33F
memory 是完全不同的兩回事。
07/09 22:33, 33F

07/09 22:34, , 34F
而到底怎麼定義這些名詞是看 CPU 架構跟 OS 而定。
07/09 22:34, 34F

07/09 22:35, , 35F
Linux + x86 的話,program 送的是 logical,過 MMU 轉
07/09 22:35, 35F

07/09 22:35, , 36F
virtual,之後才轉 physical。
07/09 22:35, 36F

07/09 23:12, , 37F
講得更一般化一點,paging 的目的是要解決 fragment 的
07/09 23:12, 37F

07/09 23:13, , 38F
問題,所以最適合直接跟 process 對應。至於 logical 轉完
07/09 23:13, 38F

07/09 23:13, , 39F
是對到什麼上面,那並不重要;可以對到 virtual,也能對到
07/09 23:13, 39F

07/09 23:13, , 40F
physical。
07/09 23:13, 40F

07/09 23:17, , 41F
這個部分完全看架構設計者高興,他要讓某些特定區間的
07/09 23:17, 41F

07/09 23:17, , 42F
logical = virtual 也是可以。
07/09 23:17, 42F

07/09 23:20, , 43F
謝謝解惑! <(_ _)> t 大打好多字 @_@
07/09 23:20, 43F

07/09 23:38, , 44F
感謝t大<(_ _)> OS的東西全部燒掉了Orz
07/09 23:38, 44F

07/12 06:41, , 45F
你問這種問題很多次了,為什麼不嘗試自己動手寫一個os呢??
07/12 06:41, 45F

07/12 06:45, , 46F
你那是在windows下才會有兩次執行卻運行在不同virtual
07/12 06:45, 46F

07/12 06:46, , 47F
address, 如果是在Linux下預設應該都是一樣的
07/12 06:46, 47F

07/12 06:47, , 48F
這部分涉及作業系統的virtual memory機制與linker/loader
07/12 06:47, 48F

07/12 06:48, , 49F
如果是windows的工具是假設executable的virtual address
07/12 06:48, 49F

07/12 06:49, , 50F
可以被relocatable.而GNU的binutils以前是假設executable
07/12 06:49, 50F

07/12 06:50, , 51F
的virtual address不可以被relocatable,之後的版本多支援
07/12 06:50, 51F

07/12 06:50, , 52F
了這個假設
07/12 06:50, 52F

07/12 06:54, , 53F
不過這是我trace binutils後的理解,有錯請指正
07/12 06:54, 53F
文章代碼(AID): #1CDRLEcL (C_and_CPP)
文章代碼(AID): #1CDRLEcL (C_and_CPP)