[問題] 關於記憶體位址

看板C_and_CPP作者 (UbuntuSeeker)時間13年前 (2010/10/12 01:20), 編輯推噓11(11032)
留言43則, 7人參與, 最新討論串1/1
遇到的問題: (題意請描述清楚) 想問大家關於記憶體位址問題 通常在32位元的OS底下是 => 0xFFFFFFFF (隨便舉個例子) 關於記憶體位址的"長度": OS:XP(32bits) 位址長度:4個bytes OS:win7(64bits) 位址長度:4個bytes OS:Linux(64bits) 位址長度:6個bytes 我想問的是 位址長度的定義是跟OS有關還是CPU @@? 為什麼64bits跑出來不是8個bytes? 或是說 n-bit的CPU 位址長度一定小於"n除8"bytes 至於幾個bytes 取決於OS? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.172.124.41

10/12 01:27, , 1F
CPU 先定義, 然後 OS 去實現 .
10/12 01:27, 1F

10/12 01:27, , 2F

10/12 01:28, , 3F
為啥64bit 是4byte阿? 這值是哪裡來的
10/12 01:28, 3F

10/12 01:29, , 4F
10/12 01:29, 4F

10/12 01:48, , 5F
個人覺得這和程式編譯成哪種target有關, 32 bit的user
10/12 01:48, 5F

10/12 01:48, , 6F
mode AP拿到64 bit去跑, addr長度才比較可能是4B; 如果
10/12 01:48, 6F

10/12 01:49, , 7F
是原生64 bit AP, 使用的addr應該是8B的(Win7 64 case)
10/12 01:49, 7F

10/12 01:49, , 8F
至於Linux 64那個6是怎麼來的就不清楚了....@_@"
10/12 01:49, 8F

10/12 01:50, , 9F
V大指的原生 是指把這AP丟到XP 32就會crash?
10/12 01:50, 9F

10/12 01:50, , 10F
原生是指 開專案寫程式時就可以設定要寫32還是64bit的平台嗎
10/12 01:50, 10F

10/12 01:51, , 11F
沒碰過64bit...不是很清楚~
10/12 01:51, 11F

10/12 01:52, , 12F
比如VC的proj setting裡, 你可以new一個x64的config出來
10/12 01:52, 12F

10/12 01:53, , 13F
, 它build出來的AP才是原生64的; 至於32b的程式拿到64b
10/12 01:53, 13F

10/12 01:53, , 14F
所以是冠VC時他自動偵測你是64bit 環境所以就會多罐一些東西
10/12 01:53, 14F

10/12 01:53, , 15F
讓你開專案才有這設定可以選嗎
10/12 01:53, 15F

10/12 01:54, , 16F
的OS跑, 原則上是由OS來保證向下相容性, 所以user mode
10/12 01:54, 16F

10/12 01:55, , 17F
相關的部份(如driver), 仍需要有32b的來處理....
10/12 01:55, 17F

10/12 01:55, , 18F
至於有什麼config可以選, 印象中是安裝時有選cross-
10/12 01:55, 18F

10/12 01:56, , 19F
platform compilation什麼碗糕的, 就會幫你裝上; 所以有
10/12 01:56, 19F

10/12 01:56, , 20F
需要也可以build出target在mobile上的binary....
10/12 01:56, 20F

10/12 02:28, , 21F
windows的話,應該是看PE header
10/12 02:28, 21F

10/12 02:36, , 22F
l大推PE這東西 我才剛問 = = 到底是什麼東西啊....
10/12 02:36, 22F

10/12 02:39, , 23F
那是目的檔格式
10/12 02:39, 23F

10/12 03:00, , 24F
PE/PE32 是 executable 的格式. COFF 才是 object
10/12 03:00, 24F

10/12 03:00, , 25F
file 的 format
10/12 03:00, 25F

10/12 03:17, , 26F
補充一下 這是利用%p印出來發現的 覺得64bits很怪@@
10/12 03:17, 26F

10/12 03:26, , 27F
啊勒記錯...Orz
10/12 03:26, 27F

10/12 03:37, , 28F
PE32+
10/12 03:37, 28F

10/12 03:52, , 29F
crash 想太多, 64-bit 是用 PE32+, 32-bit 是用 PE
10/12 03:52, 29F

10/12 03:53, , 30F
你把 64-bit 的 AP 丟到 XP 32. Loader 就把你擋掉了
10/12 03:53, 30F

10/12 03:53, , 31F
哪輪的到 crash
10/12 03:53, 31F

10/12 03:56, , 32F
就像拿PE在dos執行一樣,PE前面會有一小段限定在dos跑
10/12 03:56, 32F

10/12 03:56, , 33F
的code
10/12 03:56, 33F

10/12 03:58, , 34F
只是我不能肯定它是怎麼區分64/32 bit,也許是用
10/12 03:58, 34F

10/12 03:59, , 35F
machine跟OS這兩個欄位決定
10/12 03:59, 35F

10/12 04:01, , 36F
樓上的問題請去看 PE/COFF 的 spec, 他裡面有一個欄
10/12 04:01, 36F

10/12 04:03, , 37F
位會標明他是 PE32 還是 PE32+(Magin number)
10/12 04:03, 37F

10/12 04:03, , 38F
而該欄位會影響後面其他 field 的佈局
10/12 04:03, 38F

10/12 04:06, , 39F
其實跟 PE 在 dos 執行不大一樣. PE 在 dos 執行的部
10/12 04:06, 39F

10/12 04:08, , 40F
份是在前面放一個 stub, 然而 PE32/PE32+ 的差異會在
10/12 04:08, 40F

10/12 04:08, , 41F
上述 magic number 後佈局產生改變. 主要是有關於
10/12 04:08, 41F

10/12 04:09, , 42F
address 的部份會從 4-bytes 擴展到 8-bytes
10/12 04:09, 42F

10/12 04:09, , 43F
IMAGE_OPTIONAL_HEADER開頭那個就是了,太久沒看都忘光
10/12 04:09, 43F
文章代碼(AID): #1CiqTpE7 (C_and_CPP)