• 4

作業系統&記憶體關聯 的基礎問題,卡很久想不通⋯⋯

SkyHoop wrote:
先感謝各位的回應,謝謝大家願意花時間為我這電腦白痴解說
還好啦
我從本來略懂,到越聽越不懂,到慢慢明朗,最後真正理解,也花了一年的時間
我是屬於會一直問為什麼的,所以需要很長的時間

SkyHoop wrote:
0000000000000000000000000000000
0000000000000000000000000000001
0000000000000000000000000000002
0000000000000000000000000000010

SkyHoop wrote:
0000000000000000000000000000001
他最終就是個 指令,至於這指令卻是占有空間,也就是 1 byte
不是指令,單純是個編號而已
可以想成門牌號碼,門牌號碼佔有空間嗎?沒有
門牌號碼是方便郵差找到你家把信丟給你
你家才佔有空間
可以再看一次我的文章的圖片,揣摩一下。

SkyHoop wrote:
定址線、位址線 ? 一樣的東西? 哪種稱呼才比較常使用?位址匯流排(Address Bus) 是一樣的東西!?
一般比較常講位址線
位址線就是位址匯流排
定址是動詞,定者,定位也。



關於定址空間
請聯想:一個房子的寬度 x 門牌號碼的發放數量 = 這排房子的總寬度
如果一個位址所定位的記憶體大小是 4 B,
那麼這台機器就能支援 4 B * 2^32 = 16 GB 那麼大的空間了
(不過這只是假設而已,事實上 x86/x64 都是 1 B,沒有例外)



關於記憶體的資料匯流排
寬度就是處理器一次吞入的資料量
目前資料匯流排的寬度是 64 bits,也就是處理器一次抓 8 B 的資料
(若考慮雙通道,則一次抓 16 B)

注意,(處理器外部的) 記憶體資料匯流排的寬度和 (處理器內部的) 暫存器的寬度不一定要相等
例如十年前的 Pentium M,資料匯流排寬度 64x2 bits (雙通道),而暫存器寬度才 32 bits
記憶體比暫存器慢多了,所以資料匯流排寬度較寬,一次多抓一點,合情合理
處理器內有個佇列存放著尚未用到的資料 (資料在排隊)

注意,處理器有時候只需要 1 B 甚至幾個 bits 而已,但處理器仍然一次抓 8 B 的資料
然後丟棄用不到的資料

注意,雖然處理器從記憶體一次抓 8 B,但這並不違背 byte-addressing
一個位址仍然定位到 1 B
記憶體控制器只是省略了最低的那三條線,所以一次抓進 8 B

(越講越玄,這裡如果看不懂就不用勉強)



關於處理器是幾位元
最原始的定義是看暫存器有多寬
8086 的暫存器是 16-bit,所以我們說 8086 電腦是 16-bit 的
386 的暫存器是 32-bit,所以我們說 386 電腦是 32-bit 的
Core i 的暫存器是 64-bit,所以我們說 Core i 電腦是 64-bit 的

不過曾經有個例外
Pentium 的暫存器是 32-bit,但是記憶體的資料匯流排已經拓寬到 64-bit
廠商就說 Pentium 電腦是 64-bit 的 (顯然是商業語言)



x64 有向下相容 x86:在 x86 模式下,某些電路被禁能,等同 x86
所以 x64 當然可以跑 32-bit 的 OS (OS 是程式)
反過來不行,64-bit 程式無法在 x86 執行 (沒有電路要怎麼執行)



大概就這樣。
樓主:

若真願意學習,國外有非常多正確及新的資訊,就您的問題,這不是新的也有很久了,介紹二篇文章,一篇較淺,一片較詳細,我的中打只能幫到這:

2008年的有關32/64-bit記憶體限制的困惑解釋,較簡單: Clearing up the 32/64-bit memory limit confusion, http://www.zdnet.com/blog/hardware/clearing-up-the-3264-bit-memory-limit-confusion/3124


附註:
Note: Wondering how we arrive at that 4GB limit? Here's the math for 32-bit systems:

2^32 = 4,294,967,296 bytes 4,294,967,296 / (1,024 x 1,024) = 4,096 MB = 4GB

It's different for 64-bit:

2^64 = 18,446,744,073,709,551,616 18,446,744,073,709,551,616 / (1,024 x 1,024) = 16EB (exabytes)


WikiPedia有關3GB限制的解釋,較詳盡:http://en.wikipedia.org/wiki/3_GB_barrier





樓主滿好學的,但也很鑽牛角尖!

這個學問是很死的東西,只是數理邏輯比較活、不將它想的太難對你比較好!

ASCII編碼希望可以幫到你的幫!

http://zh.wikipedia.org/wiki/ASCII

這個32位元、64位元密不可分! 以後還可能上看128位元
Pirate 99999
xfile1 wrote:
絕大多數的32bit作業系統在正常情況下,無法讀取到4GB的記憶體,這不是"觀念問題"或觀念的對錯,這是"事實"。

計算完很高深的理論值4GB,以及看似很複雜的所謂位址/定址之後,若稍微想一下,這些“總數”必須分給其他元件,例如顯示卡、PCI、ACPI等等之後,請問還會有理論的最大值留下來嗎?
...(恕刪)

以不同的IA-32作業系統來說,包括OSX、FreeBSD、Solaris、Novell、Linux,在跟消費性IA-32 Windows相同的安裝設定條件下(硬體支援memory remapping、啟動XD或NX),就算扣掉MMIO跟硬體裝置所需要佔用的實體定址空間,仍然沒有什麼3.xGB的限制,只有從XP SP2之後的消費性IA-32 Windows版本才安上了這樣的封印,更古早的XP SP1,都還沒有這個封印,也就是裝了4GB記憶體,XP SP1確實可以將4GB記憶體全用上,而不會留下幾百MB用不到。

以Windows Server 2003的IA-32標準版來說,它的授權所允許管理的記憶體上限是4GB,但也是可以貨真價實的將4GB記憶體全部運用上,跟XP SP2以後/Vista/7/8一般被熟知的只能用上3.xGB也並不同。

只是因為消費性Windows出貨量大,因此它的行為跟限制反而被合理化....

SkyHoop wrote:
這邊在稍微統整一下這些資料,再次以我的方式解釋,希望各位幫我看看,謝謝!!
...(恕刪)

仍然不建議你以自己的方式演繹,因為說法幾乎都不對,Stallings網友善意回答了許多,但建議您有興趣,還是要把地基基礎打好,不要一下跳到高樓層。

Stallings wrote:
注意,處理器有時候只需要 1 B 甚至幾個 bits 而已,但處理器仍然一次抓 8 B 的資料
然後丟棄用不到的資料
...(恕刪)

Stallings兄,這裡有個更正:即使某個指令的operand是byte,但是同時被抓進來的前後資料其實不會被丟棄,而是被保存在同一個cache line內,畢竟根據spatial locality原則,前後的資料馬上被使用到的機率是相當高的(cache hit)。
xfile1 wrote:
計算完很高深的理論值4GB,以及看似很複雜的所謂位址/定址之後,若稍微想一下,這些“總數”必須分給其他元件,例如顯示卡、PCI、ACPI等等之後,請問還會有理論的最大值留下來嗎?


即使沒有最大值, 像 x86 在 32位元作業系統下開了 PAE 之後, 可以支援到 64GB, 相形之下顯示卡、PCI、ACPI等等機器會吃得了多少記憶體, 恐怕都還沒有1%(這種機器都是資料庫伺服器等級, 不太會使用太高級的顯示功能, 其他更不用說了), 再說了, 管理IO本來就是作業系統的一環, 難不成作業系統本身佔用的記憶體(特別是驅動程式部份的)就不能算在“總數”裡的? CPU 位址線可設計得有多大就有多大, 顯示卡、PCI、ACPI等等也可以設計吃自己的記憶體(x86 還留有算是很古老 IN/OUT 指令, 這種指令可以把 IO 設備資料直接搬入暫存器), 問題只有一點, 那一種執行的效率比較好, 成本高不高而已, 後面這兩個因素才決定你看到的事實.

KJI01

我完全看不懂您的回文目的及內容,雖然洋洋灑灑的一堆,

樓主的問題癥結,"那32位元作業系統,最大支援 4GB 這我就不懂了!",有人談效率嗎?

我的回文還單純,也不想更不會講一些洋洋灑灑好像很高深卻沒有相關的事:

1. 4GB的最大值用簡單的數學就算出,無須爭辯
2. 是否能走到4GB要看整體的配合,我已分享Wiki的簡單說明,不想浪費時間。
3. 就算扣1KB也是扣,簡單說,最大值就是4GB,不管您要假設有或沒有最大值,至於效率更是完全另一議題與硬體不見的有直接關係。

答非所問的岔題也太遠了。
回文的意義很簡單, 因為他問的是32位元作業系統, 沒有問是 ARM, x86, Windows, Android,... 所以要講的是教科書 "觀念", 等他都懂了, 不會以為4GB是32位元作業系統絕對限制, 那也可以了. 這樣可以了吧???
Whistle Blow wrote:
Stallings兄,這裡有個更正:即使某個指令的operand是byte,但是同時被抓進來的前後資料其實不會被丟棄,而是被保存在同一個cache line內,畢竟根據spatial locality原則,前後的資料馬上被使用到的機率是相當高的(cache hit)。
其實我也快忘光了
我再想一想
對了,有個疑問想問大家
比較晚期的 x86 已經有 36 條位址線了 (如果可以的話請告訴我是從哪一顆開始的)
那麼我在那些機器上灌 32-bit 的 Linux,是不是最多就能用到 64 GB?
謝謝

Stallings wrote:
對了,有個疑問想問大家...(恕刪)


你的問題, 在這裡已有答案了:
http://zh.wikipedia.org/wiki/%E7%89%A9%E7%90%86%E5%9C%B0%E5%9D%80%E6%89%A9%E5%B1%95

其他的不多說, 以免被人嫌.
  • 4
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?