zoukankan      html  css  js  c++  java
  • 6. ioremap() 函数解析

    1、基础概念
    几乎每一种外设都是通过读写设备上的寄存器来进行的,通常包括控制寄存器,状态寄存器和数据寄存器三大类。外设的寄存器通常被连续的编址。根据CPU体系结构的不同,CPU对IO端口的编制方式有两种。

    * I/O映射方式(I/O-mapped)
    

    典型的,如x86处理器为外设专门实现了一个单独的地址空间,称为“I/O地址空间”或者“I/O端口空间”,CPU通过专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元。

    * 内存映射方式(memory-mapped)
    

    RISC指令系统的CPU如ARM通常只实现一个物理地址空间,外设IO端口称为内存的一部分。此时,CPU可以像访问一个内存单元那样访问外设IO端口,而不需要设立专门的外设IO指令。
    但是这两种在硬件实现上的差异对软件来说是完全透明的,驱动程序开发人员可以将外设映射方式的IO端口和外设内存统一看作是“IO内存”资源。
    一般来说,在系统运行时,外设的IO内存资源的物理地址是已知的,有硬件的设计决定。但是CPU通常并没有为这些已知的外设IO内存资源的物理地址定义虚拟地址范围,驱动程序并不能直接通过物理地址访问IO内存资源,而必须将他们通过页表映射到核心虚地址空间内 ,然后才能根据映射所得到的核心虚地址范围,通过访内指令访问这些I/O内存资源。
    linux在io.h头文件中声明了函数ioremap,用来将IO内存资源的物理地址映射到核心虚地址空间(3GB-4GB)中(这里是内核空间)

    1.1、ioremap函数
    ioremap宏定义在asm/io.h内:

    __ioremap函数原型为(arm/mm/ioremap.c):

    该函数返回映射后内核虚拟地址(3G-4G),介质就可以通过读写该返回的内核虚拟地址去访问之这段I/O内存资源。
    1.1、iounmap函数
    iounmap函数用于取消ioremap()所做的映射,原型如下:

    2、 ioremap() 相关函数解析
    在将I/O内存资源的物理地址映射成核心虚地址后,理论上讲我们就可以象读写RAM那样直接读写I/O内存资源了。为了保证驱动程序的跨平台的可移植性,我们应该使用Linux中特定的函数来访问I/O内存资源,而不应该通过指向核心虚地址的指针来访问。
    读写I/O的函数如下所示:
    2.1 writel()
    writel()往内存映射的 I/O 空间上写数据,wirtel() I/O 上写入 32 位数据 (4字节)。

    2.2 readl()
    readl() 从内存映射的 I/O 空间上读数据,readl 从 I/O 读取 32 位数据 ( 4 字节 )。

  • 相关阅读:
    发布说明
    Python批量读取人脸图片与数据互相转换
    Python图片与其矩阵数据互相转换
    在sklearn上读取人脸数据集保存图片到本地
    Python图片转换成矩阵,矩阵数据转换成图片
    lintcode :continuous subarray sum 连续子数组之和
    lintcode 中等题:digits counts 统计数字
    lintcode 中等题:Single number III 落单的数III
    lintcode 中等题:Singleton number II 落单的数 II
    lintcode 中等题:majority number III主元素III
  • 原文地址:https://www.cnblogs.com/Ocean-Star/p/9249923.html
Copyright © 2011-2022 走看看