推 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