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

7
如果我有一个内存映射的I/O设备,我想要写入位于地址0x16D34的该设备寄存器,那么0x16D34地址实际上是虚拟地址。CPU会首先将其转换为物理地址,然后再将数据写入物理地址。
但是对于端口映射的I/O设备(例如:串口),如果我想要写入位于地址0x3F8的该设备寄存器,那么0x3F8地址是物理地址还是虚拟地址呢?
编辑:我使用的是x86架构。

2
那看起来像是x86而不是基于存储映射的外围设备。这个具体问题不会帮助你理解。你需要全局的认识。一本好的关于PC架构的书将会是很好的阅读材料。那么你在问什么?虚拟内存/存储映射还是设备驱动程序?它们是两种非常不同的方法! - too honest for this site
IO端口不是内存地址,因此您无法询问它们是物理的还是虚拟的。 - harold
1
@harold "IO端口不是内存地址,因此您无法询问它们是物理地址还是虚拟地址。" 但实际上我可以假设IO端口是物理地址,比如如果我将数据写入地址0x3F8,那么数据就会被写入地址0x3F8,而不是某个经过翻译的地址,对吗? - Steve
1
@Cody Gray那么如果0x3F8不是一个地址,它是什么数字?我已经在任何地方都读到了它是串行/COM端口的基础地址 - Steve
2
我一直称它们为“地址”。即使是带有基址寄存器(BARs)的PCI规范也将其称为地址。它们是IO端口地址,但仍然是地址。无论如何,自从1)它不是GP地址空间2)除非设置允许端口的位图,否则它始终是特权的,因此IO地址空间从未被虚拟化。此外,英特尔手册指出,向对齐端口X写入一个字将在单个总线周期中写入端口X和端口X + 1,就像内存写入一样。值得注意的是,设备可以以不同的方式处理对X的字写入。在VGA编程中,写入字是常见的。 - Margaret Bloom
显示剩余8条评论
2个回答

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

有关详细信息,您可以查看英特尔的“Intel® 64和IA-32体系结构开发人员手册:第1卷”(截至本文撰写时的第18章)中的“输入/输出”章节。

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

2
x86 CPU是否仍包括一个针脚来选择内存还是I/O,当地址在总线上时?这是我记得的方式,但对我而言大学已经过去很多年了(来自Memory-Mapped I/O):“IN和OUT的唯一区别,以及从存储器加载和存储的唯一区别是CPU上的单个输出引脚。如果地址总线上的地址是内存地址,此引脚将输出0,如果地址是I/O地址,则输出1”。 - jww
2
@jww 我怀疑这一点,现在的CPU内存控制器已经内置了,因此有很多引脚直接连接到内存模块,不需要进行I/O寻址。它们还具有直接的PCI Express通道。PCIe使用非常少的引脚,在每个方向上只通过一对线(用差分信号传输)传输消息(包括地址和有效数据)。也许对于一些遗留的外围设备来说是这样,但它们可能已经在南桥中了。 - pmdj

0

看起来你的问题是关于内存映射I/O和端口映射I/O之间的区别。处理器连接外部设备通常有两种方法,即内存映射或端口映射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设备共享的地址。您可以在内存映射I/O与端口映射I/O中获得更详细的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接