簡答:4GB是定址空間
閱讀前需要對CPU有基本的瞭解
1. CPU和Register(暫存器)
32位CPU通常是講這個CPU的instructions多長
32位CPU意味著register長度為32位
最近在學mips。
mips32是一種有32個暫存器,適用於RISC (Reduces Instruction Set Computer)的長度為32位的指令集
以mips的load和store為例,兩個instructions都是對記憶體操作,從記憶體特定位置獲得word載入指定register,或將指定register的word存入記憶體的指定位置。這個位置就是記憶體地址。對記憶體操作就必須知道並高效的表達來源或目標地址
接下來就可以講為什麼32位處理器或者系統只支援4GB記憶體了
2. 記憶體
現在的記憶體可以看作一個很長的,每項寬度8位(即1Bit)的很長的數列
既然是數列,那麼每一項便對應一個序號,這個序號便是地址,就如同你家在一條大街的第幾號一樣
上面說,需要知道並高效的表達記憶體地址,表達就意味著你需要把地址的數字傳遞到register
3. 重點來了
你的register是32位的,也就意味著,其最大可以表達2^32個數字(即0至2^32-1)
也就意味著你用一個register,可以表達出2^32個不同的記憶體地址。
這,就是定址空間
然後我們要做的就是一些數學計算
2^32=4,294,967,296,就是這麼多地址
4,294,967,296個地址是多大呢,上面說了一個地址對應8bit的寬度,就是1Byte,也就意味著這麼多地址可以對應4,294,967,296Byte
換算一下
4,294,967,296Byte=4Gibibyte(GB)
由此得出,32位處理器或作業系統只能支援4GB的定址空間
該空間為0到4294967295
4. Conclusion
如果我們不做任何軟體調整
讓一個32位的機器強行識別4GiB以上的記憶體和,會發生什麼(i.e我要我的計算機訪問4*2^32
稍微對程式設計有點了解的人都知道,會溢位
register在全部位為1,再加一的時候,會全部變成0,所以當你試圖用register(假設我們assign到$s0)表達2^32(4294967296)地址的時候,$s0的word是0x00000000,如果無視這個現象(計算機的事情,沒有錯誤,有錯誤的只能是人,所以稱作現象)當下一個指令試圖訪問 $S0 的值的地址,訪問的就是記憶體地址在0的(而不是4294967296)
題外話: 為什麼64位的就能支援4GiB以上,64位的支援上限是多少
其實上面講了那麼多,已經很容易算出來了
64位就是2^64個數字,2^64=18,446,744,073,709,551,616
這些Byte換算一下就是
16,777,216 TiB = 16 EiB
GiB向上是TiB,TiB向上是PiB,PiB再往上才是EiB
寫出TiB的值是因為我估計大家心裡對EiB估計沒什麼譜,我也沒譜(我見到EB這個單位的次數可能不超過20次,第一次是在激活了學校賬號後分配的googledrive圖示上,學校給所有學生無限大小的googledrive使用,受限於Windows 64位的限制,只能識別為1EB)
當年有一段時間,大量遊戲放棄對32位系統的支援其實就是因為,它們嫌4GiB太小了
是真的小了(你當使命召喚一個100多GB總大小的遊戲執行在4GiB電腦上,什麼神仙最佳化能做得到啊)
然後那段時間就開始吹64位這個概念,甚至看到有人展望128位什麼時候出現。。。。
我估計咱們普通老百姓還沒用到1PB記憶體呢,下下下代計算系統都出現了,別說128位了
真就是出現了128位處理器和系統,也絕對不是因為記憶體定址空間
扯遠了
回答完畢
附上容量換算表,很多人搞不懂容量單位換算的具體細節,經常在這方面被忽悠,被手機店員工忽悠,或者被網友忽悠然後跑手機店去跟良心員工bb(自己被當槍使了還不知道)
簡答:4GB是定址空間
閱讀前需要對CPU有基本的瞭解
Register ,暫存器,是CPU對接收到的資訊直接處理的地方,本回答只考慮32位計算機下Register長度為32的情況word,字,MIPS指令集術語,一個32bit的二進位制串,組成一個word,一個register可load一個word,一個instruction可以是一個wordInstruction,指令,本回答只考慮32位情況,因此長度為32溢位,溢位是指一個計數器在限定位數下接收的數值超出了其可表達的範圍(比如一個三位數可以表達0到999,但不能表達一千,一千對於一個三位數會顯示成000,即0進位制,進位制不做過多介紹,能問出這樣的問題的人應該能理解計數是什麼1. CPU和Register(暫存器)
32位CPU通常是講這個CPU的instructions多長
32位CPU意味著register長度為32位
最近在學mips。
mips32是一種有32個暫存器,適用於RISC (Reduces Instruction Set Computer)的長度為32位的指令集
以mips的load和store為例,兩個instructions都是對記憶體操作,從記憶體特定位置獲得word載入指定register,或將指定register的word存入記憶體的指定位置。這個位置就是記憶體地址。對記憶體操作就必須知道並高效的表達來源或目標地址
接下來就可以講為什麼32位處理器或者系統只支援4GB記憶體了
2. 記憶體
現在的記憶體可以看作一個很長的,每項寬度8位(即1Bit)的很長的數列
既然是數列,那麼每一項便對應一個序號,這個序號便是地址,就如同你家在一條大街的第幾號一樣
上面說,需要知道並高效的表達記憶體地址,表達就意味著你需要把地址的數字傳遞到register
3. 重點來了
你的register是32位的,也就意味著,其最大可以表達2^32個數字(即0至2^32-1)
不知道為什麼不是0到2^32-1的想象一下十進位制的三位數你可以從000一直+1到999再+1就是1000,因為左邊的1是第四位無法顯示,會被抹去變成000即一個三位數可以表達0到10^3-1,上面類似也就意味著你用一個register,可以表達出2^32個不同的記憶體地址。
這,就是定址空間
然後我們要做的就是一些數學計算
2^32=4,294,967,296,就是這麼多地址
4,294,967,296個地址是多大呢,上面說了一個地址對應8bit的寬度,就是1Byte,也就意味著這麼多地址可以對應4,294,967,296Byte
換算一下
4,294,967,296Byte=4Gibibyte(GB)
由此得出,32位處理器或作業系統只能支援4GB的定址空間
該空間為0到4294967295
4. Conclusion
如果我們不做任何軟體調整
讓一個32位的機器強行識別4GiB以上的記憶體和,會發生什麼(i.e我要我的計算機訪問4*2^32
稍微對程式設計有點了解的人都知道,會溢位
register在全部位為1,再加一的時候,會全部變成0,所以當你試圖用register(假設我們assign到$s0)表達2^32(4294967296)地址的時候,$s0的word是0x00000000,如果無視這個現象(計算機的事情,沒有錯誤,有錯誤的只能是人,所以稱作現象)當下一個指令試圖訪問 $S0 的值的地址,訪問的就是記憶體地址在0的(而不是4294967296)
題外話: 為什麼64位的就能支援4GiB以上,64位的支援上限是多少
其實上面講了那麼多,已經很容易算出來了
64位就是2^64個數字,2^64=18,446,744,073,709,551,616
這些Byte換算一下就是
16,777,216 TiB = 16 EiB
GiB向上是TiB,TiB向上是PiB,PiB再往上才是EiB
寫出TiB的值是因為我估計大家心裡對EiB估計沒什麼譜,我也沒譜(我見到EB這個單位的次數可能不超過20次,第一次是在激活了學校賬號後分配的googledrive圖示上,學校給所有學生無限大小的googledrive使用,受限於Windows 64位的限制,只能識別為1EB)
當年有一段時間,大量遊戲放棄對32位系統的支援其實就是因為,它們嫌4GiB太小了
是真的小了(你當使命召喚一個100多GB總大小的遊戲執行在4GiB電腦上,什麼神仙最佳化能做得到啊)
然後那段時間就開始吹64位這個概念,甚至看到有人展望128位什麼時候出現。。。。
我估計咱們普通老百姓還沒用到1PB記憶體呢,下下下代計算系統都出現了,別說128位了
真就是出現了128位處理器和系統,也絕對不是因為記憶體定址空間
扯遠了
回答完畢
附上容量換算表,很多人搞不懂容量單位換算的具體細節,經常在這方面被忽悠,被手機店員工忽悠,或者被網友忽悠然後跑手機店去跟良心員工bb(自己被當槍使了還不知道)