您的位置 首页 新品

一文读懂Linux下怎么拜访I/O端口和I/O内存

一、I/O端口端口(port)是接口电路中能被CPU直接访问的寄存器的地址。几乎每一种外设都是通过读写设备上的寄存器来进行的。CPU通过这些地址即端口向接口电路中的寄存器发送命令,读取状态和传

  一、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空间”)。

  2、独立编址

  而别的一些体系结构的CPU(典型地如X86)则为外设专门完成了一个单独地地址空间,称为“I/O地址空间”或许“I/O端口空间”。这是一个与CPU地RAM物理地址空间不同的地址空间,一切外设的I/O端口均在这一空间中进行编址。CPU经过建立专门的I/O指令(如X86的IN和OUT指令)来拜访这一空间中的地址单元(也即I/O端口)。与RAM物理地址空间比较,I/O地址空间一般都比较小,如x86 CPU的I/O空间就只有64KB(0-0xffff)。这是“I/O映射办法”的一个首要缺陷。

  独立编址也称为“I/O端口”办法,外设寄存器坐落“I/O(地址)空间”。

  3、优缺陷

  独立编址首要长处是:

  1)I/O端口地址不占用存储器空间;运用专门的I/O指令对端口进行操作,I/O指令短,履行速度快。

  2)并且由于专门I/O指令与存储器拜访指令有显着的差异,使程序中I/O操作和存储器操作层次明晰,程序的可读性强。

  3)一起,由于运用专门的I/O指令拜访端口,并且I/O端口地址和存储器地址是分隔的,故I/O端口地址和存储器地址能够堆叠,而不会彼此混杂。

  4)译码电路比较简单(由于I/0端口的地址空间一般较小,所用地址线也就较少)。

  其缺陷是:只能用专门的I/0指令,拜访端口的办法不如拜访存储器的办法多。

  一致编址长处:

  1)由于对I/O设备的拜访是运用拜访存储器的指令,所以指令类型多,功用完全,这不只使拜访I/O端口可完成输入/输出操作,并且还可对端口内容进行算术逻辑运算,移位等等;

  2)别的,能给端口有较大的编址空间,这对大型操控体系和数据通信体系是很有含义的。

  这种办法的缺陷是端口占用了存储器的地址空间,使存储器容量减小,别的指令长度比专门I/O指令要长,因而履行速度较慢。

  终究选用哪一种取决于体系的总体设计。在一个体系中也能够一起运用两种办法,条件是首先要支撑I/O独立编址。Intel的x86微处理器都支撑I/O 独立编址,由于它们的指令体系中都有I/O指令,并设置了能够差异I/O拜访和存储器拜访的操控信号引脚。而一些微处理器或单片机,为了削减引脚,然后减 少芯片占用面积,不支撑I/O独立编址,只能选用存储器一致编址。

  五、Linux下拜访IO端口

  关于某一既定的体系,它要么是独立编址、要么是一致编址,详细选用哪一种则取决于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()。

  IO region是一种IO资源,因而它能够用resource结构类型来描绘。

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

  1、I/O映射办法

  直接运用IO端口操作函数:在设备翻开或驱动模块被加载时请求IO端口区域,之后运用inb(),outb()等进行端口拜访,最终在设备封闭或驱动被卸载时开释IO端口规模。

  in、out、ins和outs汇编语言指令都能够拜访I/O端口。内核中包含了以下辅佐函数来简化这种拜访:

  inb( )、inw( )、inl( )

  别离从I/O端口读取1、2或4个接连字节。后缀“b”、“w”、“l”别离代表一个字节(8位)、一个字(16位)以及一个长整型(32位)。

  inb_p( )、inw_p( )、inl_p( )

  别离从I/O端口读取1、2或4个接连字节,然后履行一条“哑元(dummy,即空指令)”指令使CPU暂停。

  outb( )、outw( )、outl( )

  别离向一个I/O端口写入1、2或4个接连字节。

  outb_p( )、outw_p( )、outl_p( )

  别离向一个I/O端口写入1、2或4个接连字节,然后履行一条“哑元”指令使CPU暂停。

  insb( )、insw( )、insl( )

  别离从I/O端口读入以1、2或4个字节为一组的接连字节序列。字节序列的长度由该函数的参数给出。

  outsb( )、outsw( )、outsl( )

  别离向I/O端口写入以1、2或4个字节为一组的接连字节序列。

  流程如下:

    

 

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/160036.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部