驱动开发系列-如何与硬件通信

目录

一:概述

二:I/O端口和I/O内存的概念

三:硬件寄存器(I/O寄存器)和内存

四:使用I/O端口        


一:概述

       驱动程序是软件与硬件之间的抽象层;因此,它需要与这两者对话,本文将向你展示驱动程序如何与硬件对话。并介绍I/O端口和I/O内存的概念。

二:I/O端口和I/O内存的概念

       CPU通过写入和读取硬件寄存器的方式来控制硬件设备。在大多数情况下,一个硬件设备有多个寄存器,可以通过连续的地址访问它们,我们将这些可被CPU读写的硬件寄存器称为I/O端口。在硬件层面,访问I/O端口是通过地址总线和控制总线发送读写控制信号,以及通过数据总线读取或写入数据来访问的。

       一些CPU制造商在其芯片内部采用统一的地址空间,认为访问设备寄存器和访问内存的方式相同,使用同一地址空间即可。而另一些则认为硬件设备不同于内存,因此应该有单独的地址空间,比如像最著名的x86系列就为I/O地址设置了独立的读写电气线路,并为访问改地址设置了特殊的CPU指令。出于上述原因,Linux在其运行的所有平台上都实现了I/O端口的概念,即使在使用统一地址空间的平台上也是如此。

        然而上面说的I/O端口并不是设备访问的唯一方式,目前大多数PCI设备都将硬件寄存器映射到内存地址区域,我们将这样的内存区域称为I/O内存,即可以像访问普通内存一样来访问设备,因此它不需要使用特殊的处理器指令,CPU访问内存的效率更高,而且编译器在访问内存时,在寄存器分配和寻址方式选择方面有

相关推荐

  1. 驱动开发系列-如何硬件通信

    2024-07-09 19:24:06       25 阅读
  2. 驱动开发系列07 - 驱动程序如何分配内存

    2024-07-09 19:24:06       17 阅读
  3. WDF驱动开发-硬件资源(一)

    2024-07-09 19:24:06       26 阅读
  4. 自动窗帘系统代码如何硬件设备相连

    2024-07-09 19:24:06       33 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 19:24:06       53 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 19:24:06       55 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 19:24:06       46 阅读
  4. Python语言-面向对象

    2024-07-09 19:24:06       56 阅读

热门阅读

  1. 计算机网络笔记分享(第六章 应用层)

    2024-07-09 19:24:06       31 阅读
  2. QT配置opencv

    2024-07-09 19:24:06       27 阅读
  3. 如何高效学习(二)

    2024-07-09 19:24:06       30 阅读
  4. lvs集群(一)

    2024-07-09 19:24:06       28 阅读
  5. 使用Zookeeper实现分布式锁的最佳实践

    2024-07-09 19:24:06       25 阅读
  6. 每天一个数据分析题(四百十一)- 主成分

    2024-07-09 19:24:06       25 阅读
  7. python教程---网络爬虫

    2024-07-09 19:24:06       27 阅读
  8. Emacs 的优点及与 DE 的比较

    2024-07-09 19:24:06       21 阅读