• IO端口、IO内存、IO空间、内存空间的含义和联系


      1,IO空间:X86一个特有的空间,与内存空间独立的空间,同样利用IO空间可以操作数据,只不过是利用对应的IO端口操作函数,例如inb(), inbw(), inl(); outb(), outw(), outl()等。

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

        3,IO端口:当外部寄存器或内存映射到IO空间时,即只能用IO端口操作函数进行数据读写,称为IO端口。

        4,IO内存:当外部寄存器或内存映射到内存空间时,即使用访问内存的方式对外部寄存器或者内存进行读写操作。

        从上面定义可以看出,外部设备只能通过设备上的寄存器或者内存(SRAM?DRAM?)与CPU进行通讯,外部设备的寄存器可以是IO端口(映射到IO空 间),也可以是IO内存(映射到地址空间)。当映射到IO空间时,必须使用对应的IO操作函数;映射到内存空间时就要注意要使用特定的IO内存操作函数, 最好不要直接使用指针操作,IO内存操作函数有如下:

        IO内存读函数:

        unsigned int ioread8(void *addr);

        unsigned int ioread16(void *addr);

        unsigned int ioread32(void *addr);

        IO内存写函数:

        unsigned int iowrite8(u8 value, void *addr);

        unsigned int iowrite16(u8 value, void *addr);

        unsigned int iowrite32(u8 value, void *addr);

        以下这些函数读和写一系列值到给定的I/O内存区域,从给定的buf读或写count个值到addr,参数count表示要读写的数据个数,而不是字节数

        void ioread8_rep(void *addr, void *buf, unsigned long count);

        void ioread16_rep(void *addr, void *buf, unsigned long count);

        void ioread32_rep(void *addr, void *buf, unsigned long count);

        void iowrite8_rep(void *addr, const void *buf, unsigned long count);

        void iowrite16_rep(void *addr, const void *buf, unsigned long count);

        void iowrite32_rep(void *addr, const void *buf, unsigned long count);

        需要操作一块IO地址时,使用下列函数(这些函数的行为类似于它们的C库类似函数)

        void memcpy_io(void *addr, u8 value, unsigned int count);

        void memcpy_fromio(void *dest, void *source, unsigned int count);

        void memcpy_fromio(void *dest, void *source, unsigned int count);

        由于边际效应的缘故,不管是否需要 ioremap,都不鼓励直接使用I/O内存指针,而应使用专门的I/O内存操作函数。这些I/O内存操作函数不仅在所有平台上是安全,而且对直接使用指针操作 I/O 内存的情况进行了优化。 --->《LDD》Chapter 9, Page 249

  • 相关阅读:
    Java程序员必知的8大排序
    JQUERY 展开收起显示隐藏效果
    Java程序员必知的8大排序
    辞职申请
    值得收藏的Microsoft SQL Server下的SQL语句
    SQL
    sql language
    insert with special ID
    ExcuteNonQuery
    JS
  • 原文地址:https://www.cnblogs.com/reality-soul/p/6126382.html
Copyright © 2020-2023  润新知