zoukankan      html  css  js  c++  java
  • outb,inb等I/Oport操作函数

    功能
    如 i386 。在差别 I/O 空间和内存空间的进程的 I/O 空间写入数据。


    • outb()   I/O 上写入 8 位数据 ( 1 字节 )。
    • outw() I/O 上写入 16 位数据 ( 2 字节 );
    • outl () I/O 上写入 32 位数据 ( 4 字节)。

    原型
    引用
    #include <asm/io.h>

    void outb (unsigned char data, unsigned short port);
    void outw (unsigned short data, unsigned short port);
    void outl (unsigned long data, unsigned short port);
    变量
    • port  I/O 地址。此处为虚拟地址
    • data 数据

    在linux的驱动程序中,都会使用大量的outb、outw、inb、inw等等宏来訪问硬件或寄存器。

    这些宏的定义都在对应处理器体系下的include/asm文件夹下的io.h中定义。追究下去。这些宏终于就是一个volatile变量的的赋值:
          #define __arch_putb(v,a)      (*(volatile unsigned char *)(a) = (v))
          #define __raw_writeb(v,a)     __arch_putb(v,a)
          #define outb(v,p)                 __raw_writeb(v,__io(p))

          在(*(volatile unsigned char *)(a) = (v))中,a是一个物理地址(实地址,多数是特殊功能寄存器地址)。

    (volatile unsigned char *)对a进行类型转换,成为一个指向该地址指针,最后*(volatile unsigned char *)(a)引用该指针对该地址赋值v。这样就能够达到訪问底层硬件的目的了。


    当读入数据时使用in(x),类似inb、inw、inl,參数与out(x)函数一致。

    in、out都是对I/Oport进行操作。ioreadb、iowriteb等是对I/O内存操作。

    (详见博客http://blog.csdn.net/haozhao_blog/article/details/24005323)


  • 相关阅读:
    套接字描述符在多进程和多线程下的共享
    广播和多播
    原始套接字和数据链路层访问
    Libevent:11使用Libevent的DNS上层和底层功能
    Lib1vent:10链接监听器接受TCP链接
    Libevent:9Evbuffers缓存IO的实用功能
    Libevent:7Bufferevents基本概念
    python生成url测试用例
    OMD开源监控软件
    iptable防范ddos攻击
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6844575.html
Copyright © 2011-2022 走看看