I/O端口编址方式和I/O内存

1、

I/O接口实现系统总线与I/O设备连接。

 I/O接口主要功能:

(一):  地址选择。

(二): CPU向I/O接口发出控制命令,I/O接口传送控制命令操作外设。

(三):状态查询,查询外设的工作状态。

(四):读写数据

(五):电平转换、工作频率匹配等。


简单的I/O接口逻辑图:



I/O端口:I/O接口电路上可由CPU查询读写控制的各类寄存器。


     

(一)地址的概念

1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存、BIOS等)。在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。

        物理地址空间,一部分给物理RAM(内存)用,一部分给总线用,这是由硬件设计来决定的,因此在32 bits地址线的x86处理器中,物理地址空间是2的32次方,即4GB,但物理RAM一般不能上到4GB,因为还有一部分要给总线用(总线上还挂着别的许多设备)。在PC机中,一般是把低端物理地址给RAM用,高端物理地址给总线用。

2)总线地址:总线的地址线或在地址周期上产生的信号。外设使用的是总线地址,CPU使用的是物理地址。

        物理地址与总线地址之间的关系由系统的设计决定的。在x86平台上,物理地址就是总线地址,这是因为它们共享相同的地址空间——这句话有点难理解,详见下面的“独立编址”。在其他平台上,可能需要转换/映射。比如:CPU需要访问物理地址是0xfa000的单元,那么在x86平台上,会产生一个PCI总线上对0xfa000地址的访问。因为物理地址和总线地址相同,所以凭眼睛看是不能确定这个地址是用在哪儿的,它或者在内存中,或者是某个卡上的存储单元,甚至可能这个地址上没有对应的存储器。

3)虚拟地址:现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要MMU(Memory Management Unit)的支持。MMU通常是CPU的一部分,如果处理器没有MMU,或者有MMU但没有启用,CPU执行单元发出的内存地址将直接传到芯片引脚上,被内存芯片(物理内存)接收,这称为物理地址(Physical Address),如果处理器启用了MMU,CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address),而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射成物理地址。

        Linux中,进程的4GB(虚拟)内存分为用户空间、内核空间。用户空间分布为0~3GB(即PAGE_OFFSET,在0X86中它等于0xC0000000)

,剩下的1G为内核空间。程序员只能使用虚拟地址。系统中每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。

        CPU发出取指令请求时的地址是当前上下文的虚拟地址,MMU再从页表中找到这个虚拟地址的物理地址,完成取指。同样读取数据的也是虚拟地址,比如mov ax, var. 编译时var就是一个虚拟地址,也是通过MMU从也表中来找到物理地址,再产生总线时序,完成取数据的。

(二)编址方式

1)外设都是通过读写设备上的寄存器来进行的,外设寄存器也称为“I/O端口”,而IO端口有两种编址方式:独立编址和统一编制

        统一编址:外设接口中的IO寄存器(即IO端口)与主存单元一样看待,每个端口占用一个存储单元的地址,将主存的一部分划出来用作IO地址空间,如,在PDP-11中,把最高的4K主存作为IO设备寄存器地址。端口占用了存储器的地址空间,使存储量容量减小。

       统一编址也称为“I/O内存”方式,外设寄存器位于“内存空间”(很多外设有自己的内存、缓冲区,外设的寄存器和内存统称“I/O空间”)。

        如,Samsung的S3C2440,是32位ARM处理器,它的4GB地址空间被外设、RAM等瓜分

0x8000 1000     LED 8*8点阵的地址

0x4800 0000 ~ 0x6000 0000   SFR(特殊暂存器)地址空间

0x3800 1002    键盘地址

0x3000 0000 ~ 0x3400 0000   SDRAM空间

0x2000 0020 ~ 0x2000 002e   IDE

0x1900 0300    CS8900

        独立编址(单独编址):IO地址与存储地址分开独立编址,I/0端口地址不占用存储空间的地址范围,这样,在系统中就存在了另一种与存储地址无关的IO地址,CPU也必须具有专用与输入输出操作的IO指令(IN、OUT等)和控制逻辑。独立编址下,地址总线上过来一个地址,设备不知道是给IO端口的、还是给存储器的,于是处理器通过MEMR/MEMW和IOR/IOW两组控制信号来实现对I/O端口和存储器的不同寻址。如,intel 80x86就采用单独编址,CPU内存和I/O是一起编址的,就是说内存一部分的地址和I/O地址是重叠的。

        独立编址也称为“I/O端口”方式,外设寄存器位于“I/O(地址)空间”。

        对于x86架构来说,通过IN/OUT指令访问。PC架构一共有65536个8bit的I/O端口,组成64K个I/O地址空间,编号从0~0xFFFF,有16位,80x86用低16位地址线A0-A15来寻址。连续两个8bit的端口可以组成一个16bit的端口,连续4个组成一个32bit的端口。I/O地址空间和CPU的物理地址空间是两个不同的概念,例如I/O地址空间为64K,一个32bit的CPU物理地址空间是4G。如,在Intel 8086+Redhat9.0 下用“more /proc/ioports”可看到:

0000-001f : dma1

0020-003f : pic1

0040-005f : timer

0060-006f : keyboard

0070-007f : rtc

0080-008f : dma page reg

00a0-00bf : pic2

00c0-00df : dma2

00f0-00ff : fpu

0170-0177 : ide1

……

        不过Intel x86平台普通使用了名为内存映射(MMIO)的技术,该技术是PCI规范的一部分,IO设备端口被映射到内存空间,映射后,CPU访问IO端口就如同访问内存一样。看Intel TA 719文档给出的x86/x64系统典型内存地址分配表:

系统资源   占用

------------------------------------------------------------------------

BIOS   1M

本地APIC   4K

芯片组保留 2M

IO APIC   4K

PCI设备   256M

PCI Express设备 256M

PCI设备(可选) 256M

显示帧缓存 16M

TSEG   1M

        对于某一既定的系统,它要么是独立编址、要么是统一编址,具体采用哪一种则取决于CPU的体系结构。 如,PowerPC、m68k等采用统一编址,而X86等则采用独立编址,存在IO空间的概念。目前,大多数嵌入式微控制器如ARM、PowerPC等并不提供I/O空间,仅有内存空间,可直接用地址、指针访问。但对于Linux内核而言,它可能用于不同的CPU,所以它必须都要考虑这两种方式,于是它采用一种新的方法,将基于I/O映射方式的或内存映射方式的I/O端口通称为“I/O区域”(I/O region),不论你采用哪种方式,都要先申请IO区域:request_resource(),结束时释放它:release_resource()。

2)对外设的访问

1、访问I/O内存的流程是:request_mem_region() -> ioremap() -> ioread8()/iowrite8() -> iounmap() -> release_mem_region() 。

        前面说过,IO内存是统一编址下的概念,对于统一编址,IO地址空间是物理主存的一部分,对于编程而言,我们只能操作虚拟内存,所以,访问的第一步就是要把设备所处的物理地址映射到虚拟地址,Linux2.6下用ioremap():

        void *ioremap(unsigned long offset, unsigned long size);

然后,我们可以直接通过指针来访问这些地址,但是也可以用Linux内核的一组函数来读写:

ioread8(), iowrite16(), ioread8_rep(), iowrite8_rep()......

2、访问I/O端口

        访问IO端口有2种途径:I/O映射方式(I/O-mapped)、内存映射方式(Memory-mapped)。前一种途径不映射到内存空间,直接使用intb()/outb()之类的函数来读写IO端口;后一种MMIO是先把IO端口映射到IO内存(“内存空间”),再使用访问IO内存的函数来访问IO端口。

        void ioport_map(unsigned long port, unsigned int count);

通过这个函数,可以把port开始的count个连续的IO端口映射为一段“内存空间”,然后就可以在其返回的地址是像访问IO内存一样访问这些IO端口。

I/0独立编址的优点是:不占用内存空间;使用I/O指令,程序清晰,很容易看出是I/O操作还是存储器操作;译码电路比较简单(因为I/0端口的地址空间一般较小,所用地址线也就较少)。其缺点是:只能用专门的I/0指令,访问端口的方法不如访问存储器的方法多。 
究竟采用哪一种取决于系统的总体设计。在一个系统中也可以同时使用两种方式,前提是首先要支持I/O独立编址。:Intel的x86微处理器都支持I/O独立编址,因为它们的指令系统中都有I/O指令,并设置了可以区分I/O访问和存储器访问的控制信号引脚。而一些微处理器或单片机,为了减少引脚,从而减少芯片占用面积,不支持I/O独立编址,只能采用存储器统一编址。



下面为读后思考汇总:

1、CPU通过地址总线、数据总线和控制总线传输数据,而各种外设接口都挂接在地址总线上,因此选择哪个外设寻址变成了问题。

2、所有对外设的访问都是通过对外设中的内存和寄存器操作的。因此,所谓的对外设进行编址也就变成了对外设中的寄存器和内存(端口)的编址。

3、此时产生了两种编址模式:统一编址,独立编址。统一编址是IO端口与内存单元采用同一地址空间,区分是内存还是外设或者什么外设的方法就是看地址范围。

4、在实模式下,CPU发出的指令就是物理地址,因此可以直接到编址到该地址范围的外设和存储器访问;而保护模式下则不然,CPU发出的指令为虚拟地址,而此时,MMU通过对该指令进行拦截,通过寄存器,通过查找GDT变成逻辑地址;而逻辑地址通过对分页机制,变成实际的物理地址,而获得的物理地址,直接发往CPU的引脚。


当对独立编址的IO空间的访问时

1、自从PCI总线出现后,不管CPU的设计采用I/O端口方式还是I/O内存方式,都必须将外设卡上的存储器映射到内存空间,实际上是采用了虚存空间的手段,这样的映射是通过ioremap()来建立的。

访问I/O内存(I/O内存必须映射到内存空间)的流程是:

  request_mem_region() -> ioremap() -> ioread8()/iowrite8() -> iounmap() -> release_mem_region() 。

  前面说过,IO内存是统一编址下的概念,对于统一编址,IO地址空间是物理主存的一部分,对于编程而言,我们只能操作虚拟内存,所以,访问的第一步就是要把设备所处的物理地址映射到虚拟地址,Linux2.6下用ioremap(): void *ioremap(unsigned long offset, unsigned long size); ioremap()用来将IO资源的物理地址映射到内核虚地址空间(3GB - 4GB)中,参数addr是指向内核虚地址的指针。然后,我们可以直接通过指针来访问这些地址,但是也可以用Linux内核的一组函数来读写: ioread8(), iowrite16(), ioread8_rep(), iowrite8_rep()...... 

2、对IO端口的访问,即有两种方式:

1)io映射方式(io-mapped):不映射到内存空间,直接使用诸如intb和outb来操作

2)内存映射方式(mem-mapped):先把IO端口映射到IO内存(“内存空间”),再使用访问IO内存的函数来访问 IO端口。 void ioport_map(unsigned long port, unsigned int count); 通过这个函数,可以把port开始的count个连续的IO端口映射为一段“内存空间”,然后就可以在其返回的地址是像访问IO内存一样访问这些IO端口

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
三套微机原理与接口技术的试题及答案 得分 评阅人 1.RESET信号到来后8088/86的CS和IP 分别为 _FFFF_H 和_0000_H。 2. 在特殊全嵌套方式下,8259可响应 同级或高级 中断请求。 3. CPU与外设接口通过¬ 数据 总线传送状态信号与命令信号。 4. 8255有3种工作方式, 其中 方式2 只允许A口使用。 5. 有地址重迭现象的译码方式为 部分译码 和 线选法 。 6. 外设端口编址方式有 I/O端口独.立编址 和 I/O端口与存储器统一编址 。 7.INT8253采用BCD码计数时,其最大计数值为__10000__,此时的计数初值为__0000__。 8.8088/8086的AD7-AD0是地址数据复用引脚,在T1时传送__地址信号__。 9.8259A作为主片时其引脚CAS0-CAS2的信息传送方向是_向外_。 10.RS-232C是适用于__数据终端设备DTE__和__数据通信设备DCE__间的接口。 二、 单项选择题(每小题1分,共20分) 得分 评阅人 1. 8086CPU寻址I/O端口最多使用( 4 )条地址线。 (1)8 (2)10 (3)12 (4)16 2. CPU执行IN指令时有效的信号组合是( 1 )。 (1) =0, =1 (2) =0, =0 (3) =0, =1 (4) =0, =0 3.某计算机的字长是16位,它的存储器容量是64KB,若按字编址那么它的最大寻址范围是( 2 )。 (1)64K字 (2)32K字 (3)64KB (4)32KB 4.某一SRAM芯片的容量是512×8位,除电源和接地线外,该芯片的其他引脚最少应为( 4 )根。 (1)25 (2)23 (3)21 (4)19 5.8088/8086的基本总线周期由( 2 )个时钟周期组成。 (1)2 (2)4 (3)5 (4)6 6.在8086系统中中断号为0AH,则存放中断向量的内存起始地址为( 2 )。 (1)0AH (2)28H (3)4AH (4)2AH 7.采用两片8259A可编程中断控制器级联使用,可以使CPU的可屏蔽中断扩大到( 1 )。 (1)15级 (2)16级 (3)32级 (4)64级 8.当IF=0,8088/8086CPU不响应( 2 )中断请求。 (1)INT N (2)INTR (3)NMI (4)INTO 9.8253可编程定时器/计数器中,其二进制的最大计数初值为( 3 )。 (1)65536 (2)7FFFH (3)0000H (4)FFFFH 10.8086/88CPU在响应中断时要执行( 2 )个中断响应周期。 (1)1个 (2)2个 (3)3个 (4)4个 11. 中断向量表是存放( 2 )的存储区域. (1)中断类型号 (2)中断服务程序入口处地址 (3)中断断点地址 (4)程序状态字 12.INT8255中可用置位/复位控制字对( 3 )的各位进行按位操作以实现某些控制功能。 (1)A口 (2)B口 (3)C口 (4)数据总线缓冲器 11.RS-232C标准规定信号“0”和“1”的电平是( 3 )。 (1)0V和+3V~+15V (2)-3V~-15V和0V (3) +3V至+15V和-3V~-15V (4)+3V~+15V和-0V 12.对于开关型设备的控制,适合采用的I/O传送方式是( 1 )。 (1)无条件 (2)查询 (3)中断 (4)DMA 13. 传送数据时,占用CPU时间最长的传送方式是(1 )。 (1)查询 (2)中断 (3)DMA (4)IOP 14. 既然是在数据传输率相同的情况下,那么,又说同步字符传输速度要高于 异步字符传输其原因是( 2 )。 (1)发生错误的概率少 (2)附加位信息总量少 (3)双方通信同步 (4)字符之间无间隔 15.巳知DRAM2118芯片容量为16K×1位, 若组成64KB的系统存储器,则组成的芯片组数和每个芯片组的芯片数为( 4 ). (1)2和8 (2)1和16 (3)4和16 (4)4和8 16.INT 8259中断屏蔽寄存储器的作用是( 2 ). (1)禁止CPU响应外设的中断请求 (2)禁止外设向CPU发中断请求 (3)禁止软中断请求 (4)禁止NMI中断请求 17.在正常EOI方式下, 中断结束命令是清除( 2 )中的某一位. (1)IRR (2)ISR (3)IMR (4)程序状态字 18.软中断INT N的优先级排列原则是( 3 ). (1)N值愈小级别愈高 (2)N值愈大级别愈高 (3)无优先级别 (4)随应用而定 19.串行异步通信传输的主要特点是( 2 ). (1)通信双方不必同步 (2)每个字符的发送是独立的 (3)字符之间的传送时间长度应相同 (4)字符发送速率由波特率决定 20. 8位D/A转换器的分辨率能给出满量程电压的( 4 ). (1)1/8 (2)1/16 (3)1/32 (4)1/256
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值