端口映射 I/O 和 I/O 映射 I/O 如何工作

端口映射 I/O 和 I/O 映射 I/O 如何工作

端口映射 I/O 在单独的地址空间中使用单独的端口地址。现在,我想确保自己对地址空间有正确的理解,它是针对某个特定事物(如内存、程序或设备)的一系列地址。如前所述,端口映射 I/O 使用端口地址在单独的地址空间中访问 I/O 设备,因此现在假设 32 位 CPU 创建一个 32 位宽的地址,这些地址的一部分用于内存,其他地址用于 I/O,如果是这样,这种类型的 I/O 和内存映射 I/O 之间有什么区别,为什么这种类型的 I/O 需要 I/O 指令,如果不是,那么单独的地址空间实际上是什么意思,什么是真正的地址空间。

还要解释 I/O 映射 I/O 如何在具有芯片组的不同架构和系统中工作,并且该芯片组通过前端总线连接到 CPU(CPU 与内存或 I/O 设备没有任何连接),例如芯片组如何知道 CPU 正在访问内存或 I/O 设备。

答案1

端口映射 I/O 和 I/O 映射 I/O 如何工作

你的标题毫无意义。”输入/输出 映射输入/输出“是一个无意义的工作组合。
大概您正在尝试比较端口映射与内存映射。

端口映射 I/O 在单独的地址空间中对端口使用单独的地址。

端口映射 I/O 对应于特定 CPU 指令以利用此地址空间。由于访问端口意味着将数据传输到外设,因此此类指令的操作码通常具有 IN 和 OUT 之类的助记符,其中一个操作数是端口地址。

用于传输到/从内存地址的指令操作码通常具有助记符,例如 LOAD 和 STOR(e),或(模棱两可的)MOV(e)。

由于端口地址不同于内存地址,并且端口数量不是很大,因此端口地址空间可能小于内存地址空间。例如,Intel i8086 有 20 位内存地址(用于寻址 1 兆字节内存),但端口地址只有 16 位宽。


[对长句/问题的分析]

...现在假设一个 32 位 CPU 创建一个 32 位宽的地址,这些地址的一部分用于内存,其他用于 I/O

不,一个地址只会引用一个空间。
端口地址可能有自己的总线,也可能与内存共享地址总线(使用状态行来指示地址类型)。这是一个取决于 CPU 的实现细节。

如果是的话,这种类型的 I/O 和内存映射 I/O 有什么区别?

您的问题没有上下文。
实际上,CPU 将在计算机系统内运行。外围设备和设备接口(又称控制器)将连接到 CPU 以形成该系统。系统设计人员已为这些设备的所有寄存器分配了端口地址或“内存”地址。
在编写代码(例如设备驱动程序)时,必须知道每个设备的地址分配类型。软件必须使用正确的端口或内存指令,因为每个设备寄存器仅响应已分配和连接的地址和总线。

CPU 和设备/端口寄存器之间的实际数据传输实际上与端口或内存映射 I/O 指令相同。低级总线信号和时序可能不同,但这两种执行 I/O 的方法(通过使用不同的指令)可以完成相同的任务。

为什么这种类型的 I/O 需要 I/O 指令,

一个 ”输入/输出指令“根据定义,使用端口地址作为传输源或目标的操作数之一。

内存指令使用内存地址作为传输源或目标的操作数之一。当 RAM 映射到该地址时,此类内存引用将访问 RAM,或者当外设映射到该地址时,将访问设备寄存器。

如果不是,那么单独地址空间的实际含义是什么以及什么是实际的地址空间。

这些基本概念可能很容易通过(粗略的)类比来解释。

想象一个城镇只有两条街道,镇上所有的商业建筑都位于一条街道上,所有的住宅都位于另一条街道上。

想象一下另一个只有一条街道的城镇。所有建筑物和房屋都位于这条街道上。

每条街道都使用由简单数字组成的地址。街道地址可以指定企业或住宅。

在只有一条街道的城镇中,如果您只有地址(门牌号),那么您实际上不需要街道名称,因为只有一条街道(假设您在正确的城镇中)。
但是,如果您在第一个有两条街道的城镇中,您需要完整的地址(门牌号和街道名称)才能到达您想去的地方。

地址空间类似于街道(在任一城镇)的一组(建筑物/房屋)号码。
单独的地址空间类似于第一个城镇的两条街道。每条街道都有自己的地址空间,即一组数字。(街道)号码可以在每个集合中重复,也可以是某一集合所独有的。

当然商业建筑对应的是港口,居民住宅对应的是存储单元。


显然,您只熟悉冯·诺依曼计算机架构,其中(主)内存用于存储指令和数据。但还有哈佛计算机架构,其中有一个内存空间用于存储指令,另一个单独的内存空间用于存储数据。

相关内容