爱问知识人 爱问教育 医院库

O资源的方式有哪些呢?

首页

O资源的方式有哪些呢?

Linux内核访问外设I/O资源的方式有哪些呢?

提交回答

全部答案

    2017-07-25 19:20:56
  •   Linux内核访问外设I/O内存资源的方式有两种:动态映射(ioremap)和静态映射(map_desc)。
    一、动态映射(ioremap)方式
    动态映射方式是大家使用了比较多的,也比较简单。即直接通过内核提供的ioremap函数动态创建一段外设I/O内存资源到内核虚拟地址的映射表,从而可以在内核空间中访问这段I/O资源。
       Ioremap宏定义在asm/io。h内: #define ioremap(cookie,size) __ioremap(cookie,size,0) __ioremap函数原型为(arm/mm/ioremap。c): void __iomem * __ioremap(unsigned long phys_addr, size_t size, unsigned long flags); phys_addr:要映射的起始的IO地址 size:要映射的空间的大小 flags:要映射的IO空间和权限有关的标志 该函数返回映射后的内核虚拟地址(3G-4G)。
       接着便可以通过读写该返回的内核虚拟地址去访问之这段I/O内存资源。 举一个简单的例子: (取自s3c2410的iis音频驱动) 比如我们要访问s3c2410平台上的I2S寄存器, 查看datasheet 知道IIS物理地址为0x55000000, 我们把它定义为宏S3C2410_PA_IIS,如下: #define S3C2410_PA_IIS (0x55000000) 若要在内核空间(iis驱动)中访问这段I/O寄存器(IIS)资源需要先建立到内核地址空间的映射: our_card->regs = ioremap(S3C2410_PA_IIS, 0x100); if (our_card->regs == NULL) { err = -ENXIO; goto exit_err; } 创建好了之后,我们就可以通过readl(our_card->regs )或writel(value, our_card->regs)等IO接口函数去访问它。
       二、静态映射(map_desc)方式 下面重点介绍静态映射方式即通过map_desc结构体静态创建I/O资源映射表。 内核提供了在系统启动时通过map_desc结构体静态创建I/O资源到内核地址空间的线性映射表(即page table)的方式,这种映射表是一种一一映射的关系。
      程序员可以自己定义该I/O内存资源映射后的虚拟地址。创建好了静态映射表,在内核或驱动中访问该 I/O资源时则无需再进行ioreamp动态映射,可以直接通过映射后的I/O虚拟地址去访问它。

    沈***

    2017-07-25 19:20:56

类似问题

换一换

相关推荐

正在加载...
最新问答 推荐信息 热门专题 热点推荐
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200

热点检索

  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
返回
顶部
帮助 意见
反馈

确定举报此问题

举报原因(必选):