簡體   English   中英

使用端口映射I / O時是否使用虛擬內存?

[英]Is virtual memory used when using Port-mapped I/O?

如果我有一個內存映射的I / O設備,並且我想寫入位於地址0x16D34該設備的寄存器,則0x16D34地址實際上是一個虛擬地址,並且CPU將首先將其轉換為物理地址,並且然后將數據寫入物理地址。

但是端口映射的I / O設備(例如:串行端口)怎么樣,所以如果我想寫一個位於地址0x3F8的串口的寄存器,那么0x3F8地址是物理地址還是虛擬地址?


編輯:我在x86架構上。

x86 / x86-64上的端口映射I / O(大多數其他現代架構甚至不支持它)發生在完全獨立的地址空間中。 此地址空間不受內存映射的限制,因此沒有虛擬端口地址,只有物理地址。 必須使用特殊的inout指令來執行端口I / O,簡單的存儲器訪問(例如,使用mov )不能訪問這個單獨的地址空間。 可以基於權限級別進行訪問保護; 大多數現代操作系統默認情況下會阻止用戶空間進程訪問I / O端口。

有關詳細信息,您可以查看英特爾“英特爾®64和IA-32架構開發人員手冊:第1卷”的“輸入/輸出” 一章(撰寫本文時的第18章)

請注意,在x86的早期,端口地址在每個設備中都是硬連線的,包括ISA附加卡。 如果幸運的話,該卡有一組跳線,用於為設備選擇一組有限的可能端口范圍,以避免設備之間的范圍沖突。 之后,引入了即插即用以在系統引導期間動態進行選擇。 PCI進一步完善了這一點,因此I / O BAR幾乎可以通過操作系統和/或固件映射到0x0000-0xffff地址空間內的任何位置。 由於其許多固有限制,在設計新硬件時,現在強烈建議不要使用端口映射I / O.

看來你的問題是內存映射I / O和端口映射IO之間的區別。 處理器通常有兩種連接外部設備的方法,即內存映射或端口映射I / O.

內存映射I / O.

內存映射I / O使用相同的地址空間來尋址內存和I / O設備。 因此,當CPU訪問地址時,它可能指的是物理RAM的一部分,但它也可以指I / O設備的內存 (基於Wiki上的內存映射I / O )。

第一個示例中的值0x16D34將是虛擬內存,並將映射到物理內存。 I / O設備也會引用相同的物理內存以允許從CPU進行訪問。

端口映射I / O.

端口映射I / O使用單獨的專用地址空間,並通過一組專用的微處理器指令進行訪問。 對於第二個示例中的0x3F8 ,它是特定於內存和I / O設備的自身地址的地址。 它不是我們之前在內存映射I / O中提到的內存和I / O設備之間共享的地址。 您可能會在內存映射IO與端口映射IO中獲得更詳細的信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM