端口映射I/O(I/O端口与主存独立编址)和内存映射I/O(I/O端口与主存统一编址)

本文深入探讨了设备控制器作为CPU与设备间接口的作用,详细解释了I/O端口独立编址下x86处理器的IN与OUT指令特性,以及DMA(直接内存访问)的工作原理。在不使用DMA时,CPU通过IN指令读取设备控制器数据,再通过MOV指令将数据存储至内存。采用DMA后,CPU仅需通过OUT指令向DMA控制器发送读数据命令及内存地址,随后DMA控制器自主完成数据传输,并通过中断告知CPU。

关于这方面的内容请参看下面两个链接:
https://blog.youkuaiyun.com/renlonggg/article/details/80511088
https://www.cnblogs.com/idorax/p/7691334.html
关于内存访问指令、CPU指令执行过程、当I/O端口独立编址时I/O端口访问指令的特性,请参看王爽所著的《汇编语言》第三版,第14章,端口。
关于RISC、CISC等CPU对I/O的处理方式,请参看上述两个链接和《LINUX设备驱动程序》第三版,第九章,与硬件通信。
设备控制器负责与设置直接交互,设备控制器是CPU与设备之间的接口。设备控制器也称I/O接口或适配器,如网卡、显卡、声卡等。设备控制器接收从CPU发来的命令,然后控制设备操作,实现CPU与设备,或内存与设备(DMA)之间的数据传输。设备控制器是可编址的。设备控制器内部包含有各种寄存器和缓冲区。设备驱动程序由CPU所执行。当I/O端口独立编址时,x86处理器执行的IN或OUT指令是针对设备控制器而不是具体设备,具体设备速度很低,设备控制器属于电子部件,而具体设备可以是机械部件。DMA控制器会接收来自CPU的I/O请求指令,但是DMA控制器有专门的设备与内存之间的数据传输指令,当数据传输完成后,DMA通过中断方式通知CPU。可以想象CPU在向DMA控制器发起I/O请求时,需要将读写缓存的内存地址告诉DMA控制器。
①若不使用DMA,则x86 CPU从外设读数据的流程可能是:CPU执行IN指令从设备控制器中读数据道CPU的通用寄存器(如EAX),然后CPU执行MOV指令将通用寄存器中的数据发往内存。
②采用DMA方式后,x86 CPU读数据的流程可能为:CPU通过一系列OUT指令将读数据控制命令和接收缓存的内存地址发往DMA控制器内部的寄存器中,然后CPU可以转去执行其它事务,DMA将设备数据发送到从CPU收到的接收缓存的内存地址所指定的内存中,然后DMA控制器向CPU发出中断信号,报告I/O完成,所以,CPU执行的那一套OUT指令,其实就是设备驱动程序,而接收到DMA的中断后,CPU要去执行I/O中断服务程序,从而可以认为I/O中断服务程序属于设备驱动程序的一部分。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值