jhcdoyle 2014-02-05 18:16
浏览 977

Linux驱动中访问外设端口的outb为什么不是访问内存空间

原文如下面,其中第一个宏的意思不是把值v赋给了内存地址为a的内存空间吗,为什么是访问outb是往外设端口写数据的?

在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。这样就可以达到访问底层硬件的目的了。
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
    • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
    • ¥30 截图中的mathematics程序转换成matlab
    • ¥15 动力学代码报错,维度不匹配
    • ¥15 Power query添加列问题
    • ¥50 Kubernetes&Fission&Eleasticsearch
    • ¥15 報錯:Person is not mapped,如何解決?
    • ¥15 c++头文件不能识别CDialog
    • ¥15 Excel发现不可读取的内容
    • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题