您的位置:首页 > 移动开发 > IOS开发

BIOS入门之我见-I/O

2016-09-23 05:04 253 查看
I/O,即输入输出端口,一般设备都会有专有的I/O地址,用来处理自己的输入输出信息,比如串口1一般用的是3F8h-3FFh,在X86架构下,I/O设备种类较多,因此本节主要介绍一下X86架构下的I/O空间,
ISA I/O, 以及Supper I/O, CMOS等IO 设备的访问方式以及实现方法。


1.I/O空间

  外设中的寄存器被称为I/O端口,外设中的内存被称为I/O内存。二者合起来统称为I/O空间。
    


          

    图1 I/O空间


1.1 I/O端口及寻址方式

    备驱动程序要直接访问外设或其接口卡上的物理电路,这部分通常都是以寄存器的形式出现。外设寄存器称为I/O端口,通常包括:控制寄存器、状态寄存器和数据寄存器三大类。

根据访问外设寄存器的不同方式,可以把 CPU分成两大类。
    一类CPU(如M68K,Power PC,ARM,Unicore等)把这些寄存器看作内存的一部分,寄存器参与内存统一编址,访问寄存器就通过访问一般的内存指令进行,所以,这种CPU没有专门用于设备I/O的指令(可以以此判定体系为哪种)。这就是所谓的“I/O内存”方式。即统一编址。
  另一类CPU(如X86)将外设的寄存器看成一个独立的地址空间,所以访问内存的指令不能用来访问这些寄存器,而要为对外设寄存器的读/写设置专用指令,如IN和OUT指令。这就是所谓的“I/O端口”方式 。即独立遍址。CPU是i386架构的情况在i386系列的处理中,内存和外部IO是独立编址,也是独立寻址的。MEM的内存空间是32位可以寻址到4G,IO空间是16位可以寻址到64K。
本文主要聚焦在这类遍址方式上。X86架构下,对应的专用指令 IN, OUT。在C语言中,封装成inp,inpw,inpd, 和outp,outpw,outpd函数。


1.2 I/O内存

  随着计算机技术的发展,单纯的“I/O端口”方式无法满足实际需要了,因为这种方式只能对外设中的几个寄存器进行操作。而实际上,需求在不断发生变化,例如,在PC上可以插上一块显卡,有2MB的存储空间(设备内存),甚至可能还带有ROM,其中装有可执行代码(Option ROM)。自从PCI总线出现后,不管CPU的设计采用I/O端口方式还是I/O内存方式,都必须将外设卡上的存储器映射到内存空间,实际上是采用了虚存空间的手段,这样的映射是通过ioremap()来建立的。
    CPU是i386架构的情况,在Linux内核中,访问外设上的IO Port必须通过IO Port的寻址方式。而访问IO Mem就比较罗嗦,外部MEM不能和主存一样访问,虽然大小上不相上下,可是外部MEM是没有在系统中注册的。访问外部IO MEM必须通过remap映射到内核的MEM空间后才能访问。为了达到接口的同一性,内核提供了IO Port到IO
Mem的映射函数。映射后IO Port就可以看作是IO Mem,按照IO Mem的访问方式即可。
    CPU是ARM 或PPC或Unicore 架构的情况:在这一类的嵌入式处理器中,IO Port的寻址方式是采用内存映射,也就是IO bus就是Mem bus。系统的寻址能力如果是32位,IO Port+Mem(包括IO Mem)可以达到4G。访问这类IO
Port时,我们也可以用IO Port专用寻址方式。至于在对IO Port寻址时,内核是具体如何完成的,这个在内核移植时就已经完成。在这种架构的处理器中,仍然保持对IO Port的支持,完全是i386架构遗留下来的问题,在此不多讨论。而访问IO Mem的方式和i386一致。
  RISC指令系统的CPU(如ARM、PowerPC等)通常只实现一个物理地址空间,外设I/O端口成为内存的一部分。此时,CPU可以象访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。


2. ISA I/O

    ISA设备拥有两个地址空间, ISA I/O 和ISA memory,什么是ISA Device,一种基于早期的ISA总线的设备,需要参考一下ISA 总线架构了,笔者推进有兴趣的看看 ISA Architectrue 一书。本章聚焦ISA I/O访问方式。ISA I/O
访问读写需要分别操作Index Port和 Data Port,即向 Index 端口写偏移地址,然后操作Data端口。

    ISA设备目前基本消失了,但还有些老的系统中在采用,还有因为兼容原因,有些已经集成到系统芯片中了,所以访问方式集成下来了,有必要在这里提一下。目前比较常用到的CMOS和Supper I/O


2.1 CMOS

    在计算机领域,CMOS常指保存计算机基本启动信息(如日期、时间、启动设置等)的芯片。有时人们会把CMOS和BIOS混称,其实CMOS是主板上的一块可读写的并行或串行FLASH芯片,是用来保存BIOS的硬件配置和用户对某些参数的设定。现在的CMOS逻辑功能基本都集成在芯片组中了。而且现在的BIOS中的参数设置大部分都不再放到CMOS中了。
主要还是用来维持日期,时间。

    CMOS用到Index port 70h和Data port 71h对应的128个寄存器,目前的芯片组还扩展了72h,73h IO空间。

读CMOS操作(以读偏移地址0Eh为例)

mov al,0Eh
out 70h,al
jmp $+2
jmp $+2
in  al, 71h


写CMOS操作(以写数据88h到偏移地址50h寄存器为例)

mov al,50h
or al, 80h
out 70h,al
jmp $+2
jmp $+2
mov al,88h
out 71h,al


2.2 Supper I/O

     Supper I/O 主要是用来扩展PS2,串口,并口,HW Monitor等传统功能,通过LPC总线与芯片组(南桥)连接。一般用(2Eh,2Fh)或(4Eh,4Fh)等地址,另外一般Supper I/O 访问寄存器时,都需要输入解密Key。

比如Winbond的需要向2Eh写两次87h。

以读取地址07的寄存器内容为例,假设Supper I/O地址为(2e,2f)。

int data = 0;
outp(0x2e, 0x87); //解密输入Key
outp(0x2e, 0x87);
 
outp(0x2e, 0x07); //选择07寄存器
data = inp(0x2f); //读取寄存器中数据


2.3 其它

    除了上述两种ISA I/O设备之外,HW Monitor的访问也是用 ISA I/O的访问方式。对于传统的ISA设备,有些采集卡和网卡是采用这种ISA总线的。


参考文献

“I/O空间介绍”  来源: <http://blog.csdn.net/southcamel/article/details/12031705>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bios 技术 x86 cmos io