[英]Can a 32-bit processor really address 2^32 memory locations?
我覺得這可能是一個奇怪/愚蠢的問題,但是這里......
在問題中,C中的NULL是否需要/定義為零? ,已經確定NULL
指針指向不可尋址的內存位置,並且NULL
也是0
。
現在,據稱32位處理器可以處理2^32
內存位置。
2^32
只是可以使用32
位表示的不同數字的數量。 其中數字是0
。 但是,因為0
,即NULL
,應該指向什么,我們不應該說32位處理器只能處理2^32 - 1
內存位置(因為0
不應該是有效地址) ?
如果32位處理器可以處理2 ^ 32個內存位置,那么這只意味着該架構上的C指針可以引用2 ^ 32-1個位置加上NULL 。
NULL指針指向不可尋址的內存位置
這不是真的。 從您鏈接的問題中接受的答案:
請注意,由於如何制定空指針的規則,用於分配/比較空指針的值保證為零,但實際存儲在指針內的位模式可以是任何其他東西
我所知道的大多數平台實際上通過將地址空間的前幾頁標記為無效來處理此問題。 這並不意味着處理器無法解決這些問題; 它只是一種方便的方法,使低值成為無效指針。 例如,幾個Windows API使用它來區分資源ID和指向實際數據的指針; 低於某個值的所有內容(如果我沒記錯的話,為65k)不是有效指針,而是有效的資源ID。
最后,僅僅因為C說某事並不意味着CPU需要以這種方式受到限制。 當然,C表示訪問null模式是未定義的 - 但是沒有理由在匯編中進行編寫需要受到這些限制。 真正的機器通常可以做得比C標准所說的要多得多。 虛擬內存,SIMD指令和硬件IO是一些簡單的例子。
首先,讓我們注意線性地址(AKA指針的值)和物理地址之間的區別。 雖然線性地址空間實際上是32位(AKA 2 ^ 32個不同的字節),但到存儲器芯片的物理地址並不相同。 線性地址空間的部分(“頁面”)可能會映射到物理內存,或頁面文件,或任意文件,或標記為不可訪問且不受任何內容支持。 第零頁恰好是后者。 映射機制在CPU級別上實現並由OS維護。
也就是說,零地址是不可尋址的內存只是自第一個Unices以來每個保護模式OS強制執行的C約定。 在MS-DOS時代的實模式歌劇系統中,null far指針(0000:0000)是完全可尋址的; 但是,在那里寫文件會破壞系統數據結構並帶來麻煩。 空指針(DS:0000)也可以完全訪問,但運行時庫通常會在零周圍保留一些空間,以防止意外的空指針解除引用。 此外,在實模式下(如DOS),地址空間不是32位的扁平空間,實際上是20位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.