`
isiqi
  • 浏览: 16538019 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

ioremap

 
阅读更多
void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)
入口: phys_addr:要映射的起始的IO地址;
   size:要映射的空间的大小;
   flags:要映射的IO空间的和权限有关的标志;
void *ioremap(unsigned long phys_addr, unsigned long size)
   phys_addr:是要映射的物理地址,
   size:是要映射的长度,
功能:将一个IO地址空间映射到内核的虚拟地址空间上去,便于访问;
实现:对要映射的IO地址空间进行判断,低PCI/ISA地址不需要重新映射,也不允许用户将IO地址空间映射到正在使用的RAM中,最后申请一个 vm_area_struct结构,调用remap_area_pages填写页表,若填写过程不成功则释放申请的vm_area_struct空间;
  ioremap 依靠 __ioremap实现,它只是在__ioremap中以第三个参数为0调用来实现.
  ioremap是内核提供的用来映射外设寄存器到主存的函数,我们要映射的地址已经从pci_dev中读了出来(上一步),这样就水到渠成的成功映射了而不会和其他地址有冲突。映射完了有什么效果呢,我举个例子,比如某个网卡有100 个寄存器,他们都是连在一块的,位置是固定的,加入每个寄存器占4个字节,那么一共400个字节的空间被映射到内存成功后,ioaddr就是这段地址的开头(注意ioaddr是虚拟地址,而mmio_start是物理地址,它是BIOS得到的,肯定是物理地址,而保护模式下CPU不认物理地址,只认虚拟地址),ioaddr+0就是第一个寄存器的地址,ioaddr+4就是第二个寄存器地址(每个寄存器占4个字节),以此类推,我们就能够在内存中访问到所有的寄存器进而操控他们了。
分享到:
评论

相关推荐

    ioremap()的原理及意义

    ioremap()的原理及意义 ioremap()函数是 Linux 内核中用于将 I/O 地址空间映射到虚拟地址空间的函数。其原理是将物理 I/O 地址空间映射到虚拟地址空间,以便 CPU 可以访问这些 I/O 设备。ioremap() 函数的实现过程...

    驱动层ioremap创建页表流程

    在编写linux设备驱动程序时经常使用ioremap接口将外设的物理地址转换成虚拟地址,继而通过访问内存的方式来访问外设物理地址空间的内容。下来就详细看下ioremap的具体流程。在ARM上,ioremap相关的操作api如下

    zynq驱动-7和8ioremap和gpio子系统

    利用设备树和ioremap以及gpio子系统进行io的驱动

    ioremap_gpio_demo.c

    ioremap demo对应博客介绍 https://xuesong.blog.csdn.net/article/details/114156170

    ioremap和mmap作为linux内存的关键操作.docx

    ioremap 和 mmap 作为 Linux 内存的关键操作 Linux 操作系统中,对外设的管理是通过 CPU 完成的。为了找到外设,系统需要为每个外设分配一个内存地址。ioremap 和 mmap 是 Linux 内存的关键操作,用于将外设的 I/O ...

    zynq驱动-6设备树和ioremap来操作io

    设备树和ioremap来操作io

    zynq驱动-4ioremap的字符设备驱动

    使用ioremap实现物理地址和内核虚拟地址之间的转换

    ioremap_gpio子系统_中断

    ioremap_gpio子系统_中断 【一】、ioremap void *ioremap(phys_addr_t offset, unsigned long size) 功能:物理地址到虚拟地址映射 参数: @offset 物理地址 @size 映射地址范围 返回值:成功返回映射后的虚拟...

    early_ioremap.rar_网络编程_Unix_Linux_

    "早期I/O映射"(early_ioremap)是Linux内核中的一个关键概念,尤其在系统启动初期进行硬件资源管理时。这个概念与内存管理和设备驱动程序紧密相关。 在描述中提到的"Mappings have to fit in the FIX_BTMAP area...

    ioremap.rar_Linux/Unix编程_Unix_Linux_

    标题“ioremap.rar”提示我们这个文档主要讨论的是Linux中的“Ioremap”函数,它是Linux内核提供的一种机制,用于为I/O端口或设备内存分配连续的虚拟地址。这一过程是必要的,因为硬件设备的I/O地址通常是非连续的,...

    linux对绝对地址的访问[归类].pdf

    Linux 对绝对地址的访问 Linux 操作系统提供了多种方式来访问绝对地址,特别是在嵌入式系统中,对寄存器的...通过本文,我们了解了 ioremap 函数的使用和寄存器的访问机制,并了解了 ioremap 和 __ioremap 的区别。

    linux内核访问外设IO内存方法

    ioremap是Linux内核提供的一种动态映射机制,用于将外设的I/O地址映射到内核虚拟地址空间,使得内核可以通过指针操作来读写设备寄存器。这个函数主要用在设备初始化阶段,根据设备的物理地址(bus address)返回一个...

    S3C2440 linux BUS总线 驱动

    在本文中,我们将深入探讨S3C2440处理器上的Linux BUS总线驱动,以及如何通过ioremap从裸机编程转换为Linux内核驱动。 S3C2440是一款由Samsung公司设计的ARM920T处理器,广泛应用于嵌入式系统,如智能手机、PDA和...

    DDR开发指南.pdf

    DDR(Double Data Rate)内存是计算机系统中重要的存储组件之一,它在数据传输时的工作频率和数据读写速度方面都有着显著的优势。Rockchip平台作为知名的半导体设计公司,其硬件产品广泛应用于多种智能设备中。...

    S3C2440 linux 看门狗 驱动

    本篇文章将详细介绍S3C2440处理器上的Linux看门狗驱动的实现,包括ioremap、驱动结构以及如何从裸机程序转化为Linux驱动。 首先,我们需要理解`ioremap`。在Linux内核中,`ioremap`函数用于映射I/O内存,因为这些...

    与硬件通讯-IO内存.pdf

    在某些情况下,IO内存的访问可能需要通过页表,此时内核需要使用ioremap()函数预先配置物理地址以使其对驱动程序可见。而不需要页表的情况下,IO内存地址可以直接使用,但依然建议使用内核提供的包装函数进行读写,...

    IO端口内存

    在这种情况下,I/O寄存器被称为IO内存,通过`ioremap`将其映射到虚拟地址空间,然后使用read/write接口进行访问。 二、ioremap与ioport_map 在Linux 2.6之前的版本,访问I/O寄存器有两种方式:portio和mmio。port...

    Direct Memory Access in Linux.doc

    - **Module Initialization**: When initializing the module, use `ioremap()` or `remap_pfn_range()` to map the desired physical memory region into the kernel’s virtual address space. Ensure that the ...

    zynq驱动2-mio点led

    在Zynq中,MIO的GPIO控制器寄存器位于固定地址,我们需要使用`ioremap`将这些地址映射到内核空间的一个指针,然后通过这个指针读写寄存器来控制GPIO状态。 驱动程序的基本流程可能如下: 1. 初始化:在驱动加载时...

    Linux内核访问外设IO资源的方式.pdf

    通常来说,Linux内核支持两种映射方式:动态映射(ioremap)与静态映射(map_desc)。 #### 二、动态映射(ioremap) 动态映射是较为常用的一种方法,它的实现相对简单且灵活,适用于大部分场景。这种方式主要是通过内核...

Global site tag (gtag.js) - Google Analytics