IO端口和IO内存访问

本文详细介绍了CPU如何通过总线访问外设,包括IO端口和IO内存的概念。在x86架构中,IO端口有独立的地址空间,而ARM或PowerPC则没有。Linux内核提供了对IO端口和内存的访问函数,驱动程序需申请和释放资源。通过映射,设备的IO内存可以被内核和用户空间直接访问。此外,还探讨了设备驱动中IO端口的映射和用户空间的映射过程,以及mmap在设备访问中的作用。
摘要由CSDN通过智能技术生成

回顾:总线(Bus)是各个功能部件传送信息的公共干线,是导线束。在常见PC主机体系结构中,CPU和NB(北桥如P31MCH)相连,再将NB和内存,PCI图形设备相连。这都属于I-BUS(内总线),相应的还有片内的C-BUS(片总线),
如图(from 百度百科):
connections

由于可以传递三种信息(数据、地址、控制信息),所以一组导线所组成的总线按照逻辑功能分为数据总线(Data Bus)、地址总线(Address Bus)、控制总线(Control Bus)。32位X86架构是指个人电脑的地址总线是32位的,而这32bit所能表示的地址不但要分给内存使用,还需要分配给设备寄存器等。(有的数据和地址总线有复用,如51单片机。)
更多相关:[CPU,内存那些事]

在通过物理的总线连接CPU和外设后,具体如何访问外设呢?

外设连接到总线后,可以从内存空间访问外设,对于x86架构处理器也可以通过IO空间访问外设,IO空间有属于自己的IO地址集,不占用32bit能寻址的范围(i386 64K IO寻址,单个PCI不超过256),通过inout函数访问。
外部设备常常会提供一组寄存器:控制寄存器、数据寄存器、状态寄存器。(通常会连续编址)当寄存器物理地址位于x86的IO空间时,这个空间称为IO端口(IO Port);位于内存空间时,对应内存称为IO内存(IO Memory)。

如一个视频采集卡设备,有自己的寄存器,被挂到IO Port上,设备自己的memory被挂到IO Memory。
虽然设备有自己的Memory但是CPU不能像访问内存一样直接访问设备Memory。需要通过remap做映射。同样也可以将IO Port映射后当作一个内存空间来访问达到访问寄存器的目的。

如果CPU是ARM或者PowerPC架构
没有单独的IO空间,IO Port和IO Memory共用地址寻址空间。虽然也可以用看似和i386相同的IO Port的in out方式访问,但是内核已经做了处理。Linux提供对二者的支持。
RISC指令系统CPU通常只有一个物理空间CPU可以像访问一个Memory地址一样访问一个原本IO Port对应的寄存器,不需要用专门的IO指令。

外设的IO内存资源的物理地址是已知的,硬件设计决定。但是OS不会与定义访问他们的虚拟地址映射,所以需要驱动程序来自己做好映射再做进一步访问。

1 Kernel对IO Port和IO Mem的操作

对IO端口操作
Kernel提供函数访问IO空间的端口port。函数的端口号高度依赖硬件平台。有inb(),outb()等。

对IO内存操作

  1. 映射物理地址
    Kernel访问IO内存前先将设备的物理地址做一个映射。
    ioremap()(io.h),建立新的页表,返回一个特殊虚拟地址,用来存取特定的物理地址范围。相应的通过iounmap()释放。

  2. 得到映射后通过地址直接读写过通过函数读写
    读:ioread8(),ioread16(),ioread8_rep()。写:iowrite8()iowrite16(),iowrite8_rep()。复制IO内存&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值