關於指針,地址總線的一些思考。

記得以前看到有人說一個進程最大隻有4G。這個問題是一個看百度知道上面一個人說的。但是不知道是怎麼來的。前些天又看到一個人問void *指針是多大。我告訴他所有C語言指針都是4個字節。羣裏馬上有人反駁,然後就查了一下。發現還真不是。於是問題就產生了,爲什麼C語言的指針在大部分情況下是4個字節?


首先,2^32等於4G。所以32應當是個突破口。然後我想了想,好象在哪看過,地址總線決定了所有設備的位置。即操作系統通過地址總線,將所有設備看成內存地址來訪問。那麼對於一個4字節的指針,那麼就可以訪問全部4G的內容了。到這裏我想起,似乎XP最大隻支持3.5G的內存空間。貌似很不科學啊?爲什麼不是完整的4G呢?前面的解釋似乎就已經說明了,因爲不只是內存,所有的外設也全部都是當作內存地址來尋址的啊。這一點我相信有單片機編程經驗的人都瞭解吧。要是想通過總線來訪問設備,必須先得找到設備地址,然後才能在總線上傳數據。而且大設備可能還有自己專門的地址空間。剛纔還特意搜了一下,有人說是爲了支持虛擬存儲,但學過操作系統的人就明白,操作系統的虛擬存儲系統是通過磁盤來擴充的,與這個根本無關。甚至這個論斷的邏輯也有問題,如果按虛擬存儲來看,那麼內存應該比實際的大才對。


網上還有人說是因爲系統是32位的。其實這個答案不夠準確,我借同學64位的in7來測試指針的長度也是4個字節。當時我就很懷疑他的電腦是不是64位的系統。。但是在網上查了一下才發現是編譯的問題。應該說是由於翻譯出來的彙編指令是32位的纔對。這些天學了點彙編,可以算是猜想吧,具體的還沒有測試。彙編是按位來的,分爲16位 32位 64位。於是只要是你生成32位彙編那麼你的尋址範圍就固定的是4G的大小。64位的系統向下支持32位的彙編指令,於是編譯器如果不自己設定的話,那麼就自動產生32位的程序了。那麼也就說明指針爲什麼是4個字節的原因了。


昨天找操作系統的老師問爲什麼進程最大隻支持到4G的呢,一開始她還沒有弄明白我的意思。所以說還可以支持到8G。。用數據結構來訪問。。不過倒是啓發了我一下。爲什麼不能通過標識符將內存地址劃分出來呢?每個區域用字各自的指針,那麼這樣就可以支持更大的內存空間了,想買大內存條的也可以隨便買了。不過我很快就打消了這個想法,因爲想想組成原理裏面的總線結構就明白了。如果增加地址空間,那麼只能用多級的總線結構了,必定會導致訪存的速度進一步的降低。尋址也變得更加的麻煩,相對來說內存是增大了,但是速度也慢了。根據局部性原理來看的話,可能效果提升並不明顯。這樣一看就太不划算了。增加了設計的複雜度,還增加了成本,降低了使用效果。


計算機專業的東西聯繫還真是強啊。看來學好低層知識才能以不變應萬變啊!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章