看板 C_and_CPP 關於我們 聯絡資訊
#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
loveme00835:case 1: COW, case 2: 載入到記憶體不同地方 07/08 19:34
loveme00835:有錯還請不吝指教 m(_ _)m 07/08 19:36
loveme00835:程式碼的部份OS會讓不同的行程共用, 堆疊才是各自不同 07/08 19:47
loveme00835:你看到的應該都是虛擬位址, 不是實體位址... 07/08 19:50
loveme00835:後來查到的資料似乎指向 : 邏輯 > 虛擬 > 實體, 這樣 07/09 04:47
loveme00835:的對應關係...> < 07/09 04:47
VictorTom:能請教一下資料嗎?? 小弟不太明白邏輯位址是什麼概念@@" 07/09 09:12
loveme00835:只是一些關於 OS 記憶體管理的文章, 有的會把邏輯、虛 07/09 12:54
loveme00835:擬當成是一樣東西, 有的卻沒有, 邏輯位址就是像在寫 07/09 12:56
loveme00835:組語時跳躍的位址, 但是載入的時候會重定位 07/09 12:59
loveme00835:不過重定位是指對映到虛擬記憶體還是實體記憶體, 都 07/09 13:03
loveme00835:交代不清楚 07/09 13:03
VictorTom:那看起來像是offset, 也就是以當前PC為準往前或往後跳多 07/09 13:16
VictorTom:少; 等loader重定位後, 應該是virtual address吧@_@" 07/09 13:18
loveme00835:不過我發現只要是同樣大的程式, 印出來的記憶體位址都 07/09 13:44
loveme00835:會一樣(堆積也是), 不太可能都共用同一塊吧... 07/09 13:46
tinlans:relocation 完當然還是定位在虛擬位址上,不然怎麼跑。 07/09 21:15
tinlans:以 3G/1G 這樣切 user/kernel space 的 32-bit 系統來說, 07/09 21:17
tinlans:你程式跑起來共用的區間也只有 1G 那塊 kernel space。 07/09 21:17
tinlans:你的 process 在那 3G 區間裡就算 address 跟其它 process 07/09 21:18
tinlans:的某個 pointer 重複,兩個 process 也不會相互影響到對方 07/09 21:18
tinlans:。因為那 3G 的虛擬記憶體空間是每個 process 各自獨有。 07/09 21:19
loveme00835:這樣看起來各自獨有的那些虛擬記憶體比較像是邏輯位址 07/09 21:40
loveme00835:可以這樣想嗎, t 大 ? 07/09 21:40
tinlans:其實我不太想烙名詞。logical address 是在 paging 的系統 07/09 22:30
tinlans:下面用的,有 paging 的系統不等於有 virtual memory 的 07/09 22:31
tinlans:系統。所以有讀過 OS 教科書的都知道,paging 跟 virtual 07/09 22:31
tinlans:memory 是分開講的。logical 用在 paging,virtual 用在 07/09 22:31
tinlans:virtual memory。 07/09 22:32
tinlans:只是 virtual memory 的實作有一種方法是用 paging 的方法 07/09 22:32
tinlans:去搞,所有有些人讀到後面就以為 paging 機制是為了實作 07/09 22:33
tinlans:virtual memory 才發明的。但其實 paging 跟 virtual 07/09 22:33
tinlans:memory 是完全不同的兩回事。 07/09 22:33
tinlans:而到底怎麼定義這些名詞是看 CPU 架構跟 OS 而定。 07/09 22:34
tinlans:Linux + x86 的話,program 送的是 logical,過 MMU 轉 07/09 22:35
tinlans:virtual,之後才轉 physical。 07/09 22:35
tinlans:講得更一般化一點,paging 的目的是要解決 fragment 的 07/09 23:12
tinlans:問題,所以最適合直接跟 process 對應。至於 logical 轉完 07/09 23:13
tinlans:是對到什麼上面,那並不重要;可以對到 virtual,也能對到 07/09 23:13
tinlans:physical。 07/09 23:13
tinlans:這個部分完全看架構設計者高興,他要讓某些特定區間的 07/09 23:17
tinlans:logical = virtual 也是可以。 07/09 23:17
loveme00835:謝謝解惑! <(_ _)> t 大打好多字 @_@ 07/09 23:20
VictorTom:感謝t大<(_ _)> OS的東西全部燒掉了Orz 07/09 23:38
chingggg:你問這種問題很多次了,為什麼不嘗試自己動手寫一個os呢?? 07/12 06:41
chingggg:你那是在windows下才會有兩次執行卻運行在不同virtual 07/12 06:45
chingggg:address, 如果是在Linux下預設應該都是一樣的 07/12 06:46
chingggg:這部分涉及作業系統的virtual memory機制與linker/loader 07/12 06:47
chingggg:如果是windows的工具是假設executable的virtual address 07/12 06:48
chingggg:可以被relocatable.而GNU的binutils以前是假設executable 07/12 06:49
chingggg:的virtual address不可以被relocatable,之後的版本多支援 07/12 06:50
chingggg:了這個假設 07/12 06:50
chingggg:不過這是我trace binutils後的理解,有錯請指正 07/12 06:54