2012-12-25 35 views
2

http://www.mjmwired.net/kernel/Documentation/IO-mapping.txt爲什麼我們只能直接訪問PCI物理地址中的640k-1MB區域?

153 - remapping and writing: 
154  /* 
155  * remap framebuffer PCI memory area at 0xFC000000, 
156  * size 1MB, so that we can access it: We can directly 
157  * access only the 640k-1MB area, so anything else 
158  * has to be remapped. 
159  */ 
160  void __iomem *baseptr = ioremap(0xFC000000, 1024*1024); 
161 
162  /* write a 'A' to the offset 10 of the area */ 
163  writeb('A',baseptr+10); 
164 
165  /* unmap when we unload the driver */ 
166  iounmap(baseptr); 
167 

人能解釋爲什麼這個擁有We can directly access only the 640k-1MB area

回答

7

簡答:因爲Linus決定這樣做。

長答案: 實際上,它認爲你應該能夠在沒有驅動程序註冊的情況下訪問該區域是錯誤的。但不要介意。

在過去的一段時間,在1990年代的某個時候,PCI並不存在,而顯卡,網卡等等都使用了ISA總線。它沒有花哨的功能,允許您從卡上請求信息,或者將卡上的東西配置到硬件地址應該在的位置。所有的ISA內存在A0000(640K)和FFFFF(1MB-1)之間。所以,在Linux的早期,這就是圖形和其他東西存在的地方,內核也不知道這些東西在哪裏。無論哪種方式,我們今天都沒有這些硬件,這要歸功於更好的硬件的發展。甩掉包袱!

由於兼容性的原因,這個內存空間仍然在啓動時使用,因爲直到你獲得驅動程序加載和PCI硬件設置,它的行爲是「傳統模式」,所以你仍然可以運行真正舊的DOS和其他舊軟件在機器上沒有它表現怪異。

但是,例如,一旦您的圖形卡被配置,就會將BAR(總線地址範圍)設置爲告訴世界它在總線地址空間(物理地址)中的位置。在本例中,ioremap會將物理地址映射到可以在內核中使用的虛擬地址 - baseptr。 [我可以進一步瞭解ioremap的更多細節,因爲我一直在研究一些來自最近的代碼]。

正如其他答案所述,您需要詢問設備它是BAR(它是PCI配置空間的一部分),然後將其內存映射到虛擬地址。你可以看到東西正在使用lspci -v|grep Memory(當然,只用lspci -v會給你更多的信息,包括哪些設備有什麼內存)。這些地址是物理地址。

1

據我所知,你看的評論是錯誤的,應該是「0x000A0000到0x000BFFFF」(或「640 KiB到768 KiB」)。

這對應於80x86 PC系統上的傳統VGA顯示存儲器區域(您必須通過2個小型64 KiB窗口和存儲區切換中的一個訪問潛在的大量視頻顯示存儲器),它被「線性幀緩衝「技術,允許您直接訪問整個視頻顯示內存。

除了評論錯誤之外,我還假設代碼被誤導了,並且參數0xFC000000(「內存的總線地址」)只是某人編造的隨機數。

基本上我在這裏說的是該示例是使用IO映射的示例;並且不打算用於在任何情況下確定哪個(物理,虛擬或總線)地址在任何特定架構下對於任何設備是有效的。

+0

不僅遺留下來,而且還有不同的體系結構(並非所有的世界都是帶有PCI總線的x86)。請參閱linus對需要的三種地址類型的明確解釋,以及它如何應用於Alpha(愚蠢的Jensen)和PPC。順便說一句,x86在平坦地址模式下啓動,這意味着具有類似DMA的內存訪問的設備在初始化之前應該表現自己。重複他們的地址窗口似乎是一種理智的方式。 – wildplasser

相關問題