gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:54:30 26 4
gpt4 key购买 nike

如果我有一个内存映射 I/O 设备,并且我想写入位于地址 0x16D34 的该设备的寄存器,则 0x16D34 地址实际上是一个虚拟地址,CPU会先将其翻译成物理地址,然后将数据写入物理地址。

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


编辑:我在 x86 架构上。

最佳答案

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

有关详细信息,例如您可以查看 Intel 的“Intel® 64 and IA-32 Architectures Developer's Manual: Vol. 1”的“INPUT/OUTPUT”一章 (chapter 18 as of this writing) .

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

关于c - 使用端口映射 I/O 时是否使用虚拟内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44342543/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com