外設IO地址空間中的地址怎麼轉換到核心態的虛擬位址空間(一個ioremap函數真的解釋清楚了麼)

來源:互聯網
上載者:User

LZ發問:

在看到i/o memory i/o region,以及ioremap,mmap時,被這些概念弄糊塗了,看到zhanrk的《Linux對IO連接埠資源的管理》後,對memory-mapped的i/o還是有些疑問,

 

我們都知道,採用I/O映射方式的X86處理器為外設實現了一個單獨的地址空間,也即“I/O空間”(I/O Space)或稱為“I/O連接埠空間”,其大小是64KB(0x0000-0xffff)。Linux在其所支援的所有平台上都實現了“I/O連接埠空間”這一概念。
由於I/O空間非常小,因此即使外設匯流排有一個單獨的I/O連接埠空間,卻也不是所有的外設都將其I/O連接埠(指寄存器)映射到“I/O連接埠空間”中。比如,大多數PCI卡都通過記憶體映射方式來將其I/O連接埠或外設記憶體映射到CPU的RAM物理地址空間中。而老式的ISA卡通常將其I/O連接埠映射到I/O連接埠空間中。

Linux是基於“I/O Region”這一概念來實現對I/O連接埠資源(I/O-mapped 或 Memory-mapped)的管理的。 文中提到通過記憶體映射(memory-mapped)的i/o連接埠(寄存器),這裡的記憶體映射是用ioremap實現的嗎? 這裡的映射是指直接用ioremap將i/o 連接埠(register)映射到核心虛地址空間(3GB-4GB)中嗎?

 

那這句話 “比如,大多數PCI卡都通過記憶體映射方式來將其I/O連接埠或外設記憶體映射到CPU的RAM物理地址空間中” 裡面提到的將i/o映射到cpu的RAM物理地址空間又是什麼意思? 搞不明白記憶體映射(memory-mapped)的i/o 連接埠到底和系統的RAM是個什麼關係? 對memory-mapped的i/o連接埠操作過程中,和系統的RAM 是個什麼關係呢,還是根本就沒關係?

 
  Re: 弱弱的問個i/o memory的問題,高手幫個忙 
 
分成兩步你就理解了:

第一步:

硬體級:cpu怎樣訪問外設儲存空間?
一種方式,cpu用單獨的指令訪問,這個單獨的指令需要一個要操作的外設儲存空間的地址,這就是I/O連接埠(I/O port)。
另一種方式,cpu不用單獨的指令訪問外設儲存空間,用通常的訪問儲存空間的方式訪問外設儲存空間,這就是I/O儲存空間(memory-mapped)。
memory比port好在它不是固定大小的,只受系統配置的常規儲存空間大小和系統地址空間大小的限制。port的空間是固定的,現在有些外設的儲存空間要求很大,port的局限性就顯現出來了,因此,現在的觀點是用memory-mapped的外設儲存空間。
外設儲存空間不能固定,否則,如果某台機器有兩個外設都使用相同儲存空間(port和memory一樣,這裡不區分了),那麼cpu發出的訪問外設儲存空間是那個外設的呢?就衝突了。
因此,這裡存在一個映射關係,在“遠古”的時候,通過調整外設上的跳線來調整(映射),確保在一台機器上的外設儲存空間不發生衝突。在“現代”(例如:pci匯流排規範中),在機器啟動時,在bios中有個程式來分配資源(這裡用資源因為還包括中斷號的映射),完成外設儲存空間的映射。

第二步:
虛擬儲存空間到實體儲存體空間的映射,這個映射就不多說了吧。

  Re: 弱弱的問個i/o memory的問題,高手幫個忙 
 
先謝謝你的回覆,我還想問一下,你所說的通過bios來完成外設存貯空間的映射,是說將外設i/o存貯器映射到系統的或者cpu的RAM上來嗎?還是說外設的存貯空間和系統的RAM是屬於同一個層級,cpu同等對待的?

  
  Re: 弱弱的問個i/o memory的問題,高手幫個忙 
 
Memory不只是RAM,從CPU Core角度來說,它通過Load/Store指令訪問記憶體時,並不知道訪問的是RAM,ROM,Flash還是PCI板載的RAM或寄存器,也不需要知道,CPU Core僅僅是按照協議把地址,資料,讀寫訊號發送出去,等待結果就可以了,具體訪問什麼由地址解碼模組決定。
 
  Re: 弱弱的問個i/o memory的問題,高手幫個忙  
 
我查了以前的文章 看到這些關於pci memory 和pci i/o的文章 括弧裡是一些留言

http://www.lslnet.com/linux/showflat.php?Cat=&Board=linuxK&Number=253505&page=&view=&sb=&o=&fpart=all&vc=1
( 首先,在linux啟動時,要掃描pci裝置,然後為其分配中斷號、連接埠號碼等必須的資源,如果此pci裝置有自己的記憶體,必須將其映射到整個系統的實體記憶體空間中。然後,還要將這些這塊實體記憶體映射到核心虛擬位址(通過函數__ioremap調用)。以後,訪問pci的記憶體只需訪問相應的虛擬位址就可以了。

系統要經過倆次映射:
1.裝置上的ram映射到物理空間
2.在把該物理地址映射到虛擬空間去 )

http://www.lslnet.com/linux/showflat.php?Cat=&Board=linuxK&Number=402001&page=&view=&sb=&o=&vc=1

( the memory on pci device is mapped in memory space by hardware.
pci device has registers(base adress register) point out its on-chip memory's base address in system memory space . these register are set by OS(pci bus driver) at system init time. )

http://www.lslnet.com/linux/showflat.php?Cat=&Board=linuxK&Number=323326&page=&view=&sb=&o=&fpart=all&vc=1


裝置可以根據需要把(裝置上的)RAM和寄存器映射到(系統的)記憶體和I/O區間

PC匯流排上i/o操作和記憶體操作對應著不同的匯流排訊號,所以是裝置本身決定其資源(寄存器和RAM)是一種I/O資源,還是一種記憶體資源。
而智能的裝置,如PCI裝置,都允許系統(HOST CPU)配置裝置上的資源(無論是記憶體還是I/O)在系統整個資源表中的位置,以簡化硬體的管理工作。

歸納裡面提到的是不是就是說
在系統初始化時,通過硬體完成裝置上的RAM和寄存器到系統的實體記憶體空間的映射,這裡提到的系統的實體記憶體空間是不是就是系統或cpu的RAM?簡單的說是不是先通過硬體將裝置的RAM和寄存器映射到系統或cpu的RAM上之後,之後才是到虛擬空間的映射?

 
  Re: 弱弱的問個i/o memory的問題,高手幫個忙 
 
準確地說,是裝置上的RAM和寄存器映射到CPU的實體記憶體空間,所謂系統RAM(即常說的SDRAM或DDR)也要映射到CPU的實體記憶體空間。這些映射通常是軟體做的,例如BIOS或boot,Linux核心也會做一部分。
 
  Re: 弱弱的問個i/o memory的問題,高手幫個忙 

 

把這些概念弄混了 那您的意思是不是說外設的RAM和寄存器是映射到cpu的物理地址空間,而這個過程和系統RAM(即常說的SDRAM或DDR)沒有牽扯? 唉 快被弄暈了

 

  Re: 弱弱的問個i/o memory的問題,高手幫個忙 

 

我也來請教一下
裝置的IO memory映射到虛擬空間的時候,是分頁的
而頁的屬性,比如讀、寫、執行等怎麼設定的?

 

  Re: 弱弱的問個i/o memory的問題,高手幫個忙 
 
頁屬性由MMU控制,如何設定要看MMU的手冊,在linux中則簡單,都給你封裝好了。頁屬性完全是OS的事,不關其它的。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.