Linux系统对IO端口和IO内存的管理

一、I/O端口

端口(port)是接口电路中能被CPU直接访问的寄存器的地址。几乎每一种外设都是通过读写设备上的寄存器来进行的。CPU通过这些地址即端口向接口电路中的寄存器发送命令,读取状态和传送数据。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。

二、IO内存

例如,在PC上可以插上一块图形卡,有2MB的存储空间,甚至可能还带有ROM,其中装有可执行代码。

三、IO端口和IO内存的区分及联系

这两者如何区分就涉及到硬件知识,X86体系中,具有两个地址空间:IO空间和内存空间,而RISC指令系统的CPU(如ARM、PowerPC等)通常只实现一个物理地址空间,即内存空间。

内存空间:内存地址寻址范围,32位操作系统内存空间为2的32次幂,即4G。

IO空间:X86特有的一个空间,与内存空间彼此独立的地址空间,32位X86有64K的IO空间。

IO端口:当寄存器或内存位于IO空间时,称为IO端口。一般寄存器也俗称I/O端口,或者说I/O ports,这个I/O端口可以被映射在Memory Space,也可以被映射在I/O Space。

IO内存:当寄存器或内存位于内存空间时,称为IO内存。

四、外设IO端口物理地址的编址方式

CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped),另一种是内存映射方式(Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构。

1、统一编址

RISC指令系统的CPU(如,PowerPC、m68k、ARM等)通常只实现一个物理地址空间(RAM)。在这种情况下,外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分。此时,CPU可以象访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。

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

时间: 2024-10-01 23:18:26

Linux系统对IO端口和IO内存的管理的相关文章

IO端口和IO内存的区别及分别使用的函数接口

每个外设都是通过读写其寄存器来控制的.外设寄存器也称为I/O端口,通常包括:控制寄存器.状态寄存器和数据寄存器三大类.根据访问外设寄存器的不同方式,可以把CPU分成两大类.一类CPU(如M68K,Power PC等)把这些寄存器看作内存的一部分,寄存器参与内存统一编址,访问寄存器就通过访问一般的内存指令进行,所以,这种CPU没有专门用于设备I/O的指令.这就是所谓的"I/O内存"方式.另一类CPU(典型的如X86),将外设的寄存器看成一个独立的地址空间,所以访问内存的指令不能用来访问这

io端口 io内存-IO端口和IO内存的区别

问题描述 IO端口和IO内存的区别 外设IO寄存器地址独立编址的CPU,这时应该称外设IO寄存器为IO端口,访问IO寄存器可通过ioport_map将其映射 到虚拟地址空间,但实际上这是给开发人员制造的一个"假象",并没有映射到内核虚拟地址,仅仅是为了可以使用和IO内存一样的接口访问IO寄存器:也可以 直接使用in/out指令访问IO寄存器. 例如:Intel x86平台普通使用了名为内存映射(MMIO)的技术,该技术是PCI规范的一部分,IO设备端口被映射到内存空间,映射后,CPU访

arm驱动linux异步通知与异步IO【转】

  转自:http://blog.csdn.net/chinazhangzhong123/article/details/51638793 <[ arm驱动] linux异步通知与 异步IO>涉及内核驱动函数二个,内核结构体一个,分析了内核驱动函数二个:可参考的相关应用程序模板或内核驱动模板二个,可参考的相关应用程序模板或内核驱动三个 描述:设备文件IO访问:阻塞与非阻塞io访问,poll函数提供较好的解决设备访问的机制,但是如果有了异步通知整套机制就更加完整了 一.阻塞 I/O,非阻塞IO,

Linux 下的五种 IO 模型详细介绍_Linux

概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间.针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空

一个io端口如何控控制电机的三种状态(正向转动,停止,反向转动)

问题描述 一个io端口如何控控制电机的三种状态(正向转动,停止,反向转动) 2C 一个io端口如何控控制电机的三种状态(正向转动,停止,反向转动)? 解决方案 需要加测速装置吧,I/O口输出PWM信号控制电机转动的速度,用PID算法进行实时控制.

zigbee cc2530-ZigBee主端如何控制路由的io端口

问题描述 ZigBee主端如何控制路由的io端口 ZigBee主端如何控制路由的io端口,求例子-945848636@qq.com这是我的邮箱,谢谢 解决方案 ZigBee应该控制不了,应该要SNMP等协议才能处理

NAS特定场景下buffered io比direct io读性能差问题的调查

最近一位NAS用户在微信上报道了NAS的性能测试报告,报告中测试数据显示buffered io读性能比direct io读要差.这显然和直观的认识不符,在内存充足的情况下,buffered io读的数据一般都在page cache中,每次读都是内存操作,其性能应该远远高于direct io,但测试数据却得到了相反的结果,这说明某些地方拖慢了buffered io读性能. 首先回顾一下用户的测试场景:保证内存完全够用的情况下,使用fio工具,基于libaio对比测试buffered io和dire

Java IO:操作系统的IO处理过程以及5种网络IO模型

操作系统如何处理IO Linux 会把所有的外部设备都看成一个文件来操作,对外部设备的操作可以看成是对文件的操作. 我们对一个文件的读写,都会通过内核提供的系统调用,内核会给我们返回一个 File Descriptor,这个描述符是一个数字,指向内核的一个结构体,我们应用程序对文件的读写就是对描述符指向的结构体的读写. 系统调用是如何完成IO操作? Linux 会把内存分为 内核区和用户区.Linux 的内核区会帮我们管理所有的硬件资源,并且会提供系统调用,我们应用程序的读操作,就会通过系统调用

Linux下查看端口占用进程号,程序名的方法_Linux

linux下查看端口占用情况: 1. 查看哪个进程占用了819端口: case9-sghfofo:/usr/local/cnbj/tomcat-bj/bin # lsof -i:859 运行后的结果: COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME java 24907 root 31u IPv4 248905027 TCP *:859 (LISTEN) 由以上我们知道了859端口被进程号为24907的进程占用了, 是个java进程. 2. 查看进程