c – 使用端口映射I/O时是否使用虚拟内存?

前端之家收集整理的这篇文章主要介绍了c – 使用端口映射I/O时是否使用虚拟内存?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

如果我有一个内存映射的I / O设备,并且我想写入位于地址0x16D34的该设备的寄存器,则0x16D34地址实际上是一个虚拟地址,并且cpu将首先将其转换为物理地址,并且然后将数据写入物理地址.

但是端口映射的I / O设备(例如:串行端口)怎么样,所以如果我想写一个位于地址0x3F8的串口的寄存器,那么0x3F8地址是物理地址还是虚拟地址?

编辑:我在x86架构上.

最佳答案
x86 / x86-64上的端口映射I / O(大多数其他现代架构甚至不支持它)发生在完全独立的地址空间中.此地址空间不受内存映射的限制,因此没有虚拟端口地址,只有物理地址.必须使用特殊的输入和输出指令来执行端口I / O,简单的存储器访问(例如使用mov)不能访问这个单独的地址空间.可以基于权限级别进行访问保护;大多数现代操作系统默认情况下会阻止用户空间进程访问I / O端口.

有关详细信息,您可以查看英特尔“英特尔®64和IA-32架构开发人员手册:第1卷”(chapter 18 as of this writing)中的“输入/输出”一章.

请注意,在x86的早期,端口地址在每个设备中都是硬连线的,包括ISA附加卡.如果幸运的话,该卡有一套jumpers,用于为设备选择一组有限的可能端口范围,以避免设备之间的范围冲突.后来,引入了Plug & Play以在系统引导期间动态进行选择. PCI进一步完善了这一点,因此I / O BAR几乎可以通过操作系统和/或固件映射到0x0000-0xffff地址空间内的任何位置.由于其许多固有限制,在设计新硬件时,现在强烈建议不要使用端口映射I / O.

猜你在找的C&C++相关文章