您的位置 首页 IOT

ARM体系结构下面内存和i/o映射差异

(1)关于IO与内存空间:在X86处理器中存在着I/O空间的概念,I/O空间是相对于内存空间而言的,它通过特定的指令in、out来访问。端口号标…

(1)关于IO与内存空间:

在X86处理器中存在着I/O空间的概念,I/O空间是相对于内存空间而言的,它经过特定的指令in、out来拜访。端口号标识了外设的寄存器地址。Intel语法的in、out指令格局为:
IN 累加器, {端口号│DX}
OUT {端口号│DX},累加器
现在,大多数嵌入式微控制器ARM、PowerPC等中并不供给I/O空间,而仅存在内存空间。内存空间能够直接经过地址、指针来拜访,程序和程序运转中运用的变量和其他数据都存在于内存空间中。
即便是在X86处理器中,虽然供给了I/O空间,假如由咱们自己规划电路板,外设依然能够只挂接在内存空间。此刻,CPU能够像拜访一个内存单元那样拜访外设I/O端口,而不需求建立专门的I/O指令。因而,内存空间是有必要的,而I/O空间是可选的。

(2)inb和outb:

在Linux设备驱动中,宜运用Linux内核供给的函数来拜访定坐落I/O空间的端口,这些函数包含:
· 读写字节端口(8位宽)
unsigned inb(unsigned port);
void outb(unsigned char byte, unsigned port);
· 读写字端口(16位宽)
unsigned inw(unsigned port);
void outw(unsigned short word, unsigned port);
· 读写长字端口(32位宽)
unsigned inl(unsigned port);
void outl(unsigned longword, unsigned port);
· 读写一串字节
void insb(unsigned port, void *addr, unsigned long count);
void outsb(unsigned port, void *addr, unsigned long count);
· insb()从端口port开端读count个字节端口,并将读取成果写入addr指向的内存;outsb()将addr指向的内存的count个字节接连地写入port开端的端口。
· 读写一串字
void insw(unsigned port, void *addr, unsigned long count);
void outsw(unsigned port, void *addr, unsigned long count);
· 读写一串长字
void insl(unsigned port, void *addr, unsigned long count);
void outsl(unsigned port, void *addr, unsigned long count);
上述各函数中I/O端口号port的类型高度依赖于详细的硬件渠道,因而,只是写出了unsigned。

(3)readb和writeb:
在设备的物理地址被映射到虚拟地址之后,虽然能够直接经过指针拜访这些地址,可是工程师宜运用Linux内核的如下一组函数来完结设备内存映射的虚拟地址的读写,这些函数包含:
· 读I/O内存
unsigned int ioread8(void *addr);
unsigned int ioread16(void *addr);
unsigned int ioread32(void *addr);
与上述函数对应的较早版别的函数为(这些函数在Linux 2.6中依然被支撑):
unsigned readb(address);
unsigned readw(address);
unsigned readl(address);
· 写I/O内存
void iowrite8(u8 value, void *addr);
void iowrite16(u16 value, void *addr);
void iowrite32(u32 value, void *addr);
与上述函数对应的较早版别的函数为(这些函数在Linux 2.6中依然被支撑):
void writeb(unsigned value, address);
void writew(unsigned value, address);
void writel(unsigned value, address);

(4)把I/O端口映射到“内存空间”:
void *ioport_map(unsigned long port, unsigned int count);
经过这个函数,能够把port开端的count个接连的I/O端口重映射为一段“内存空间”。然后就能够在其回来的地址上像拜访I/O内存相同拜访这些I/O端口。当不再需求这种映射时,需求调用下面的函数来吊销:
void ioport_unmap(void *addr);
实际上,剖析ioport_map()的源代码可发现,所谓的映射到内存空间行为实际上是给开发人员包围的一个“假象”,并没有映射到内核虚拟地址,只是是为了让工程师可运用一致的I/O内存拜访接口拜访I/O端口。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部