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()函数是 Linux 内核中用于将 I/O 地址空间映射到虚拟地址空间的函数。其原理是将物理 I/O 地址空间映射到虚拟地址空间,以便 CPU 可以访问这些 I/O 设备。ioremap() 函数的实现过程...
在编写linux设备驱动程序时经常使用ioremap接口将外设的物理地址转换成虚拟地址,继而通过访问内存的方式来访问外设物理地址空间的内容。下来就详细看下ioremap的具体流程。在ARM上,ioremap相关的操作api如下
利用设备树和ioremap以及gpio子系统进行io的驱动
ioremap demo对应博客介绍 https://xuesong.blog.csdn.net/article/details/114156170
ioremap 和 mmap 作为 Linux 内存的关键操作 Linux 操作系统中,对外设的管理是通过 CPU 完成的。为了找到外设,系统需要为每个外设分配一个内存地址。ioremap 和 mmap 是 Linux 内存的关键操作,用于将外设的 I/O ...
设备树和ioremap来操作io
使用ioremap实现物理地址和内核虚拟地址之间的转换
ioremap_gpio子系统_中断 【一】、ioremap void *ioremap(phys_addr_t offset, unsigned long size) 功能:物理地址到虚拟地址映射 参数: @offset 物理地址 @size 映射地址范围 返回值:成功返回映射后的虚拟...
"早期I/O映射"(early_ioremap)是Linux内核中的一个关键概念,尤其在系统启动初期进行硬件资源管理时。这个概念与内存管理和设备驱动程序紧密相关。 在描述中提到的"Mappings have to fit in the FIX_BTMAP area...
标题“ioremap.rar”提示我们这个文档主要讨论的是Linux中的“Ioremap”函数,它是Linux内核提供的一种机制,用于为I/O端口或设备内存分配连续的虚拟地址。这一过程是必要的,因为硬件设备的I/O地址通常是非连续的,...
Linux 对绝对地址的访问 Linux 操作系统提供了多种方式来访问绝对地址,特别是在嵌入式系统中,对寄存器的...通过本文,我们了解了 ioremap 函数的使用和寄存器的访问机制,并了解了 ioremap 和 __ioremap 的区别。
ioremap是Linux内核提供的一种动态映射机制,用于将外设的I/O地址映射到内核虚拟地址空间,使得内核可以通过指针操作来读写设备寄存器。这个函数主要用在设备初始化阶段,根据设备的物理地址(bus address)返回一个...
在本文中,我们将深入探讨S3C2440处理器上的Linux BUS总线驱动,以及如何通过ioremap从裸机编程转换为Linux内核驱动。 S3C2440是一款由Samsung公司设计的ARM920T处理器,广泛应用于嵌入式系统,如智能手机、PDA和...
DDR(Double Data Rate)内存是计算机系统中重要的存储组件之一,它在数据传输时的工作频率和数据读写速度方面都有着显著的优势。Rockchip平台作为知名的半导体设计公司,其硬件产品广泛应用于多种智能设备中。...
本篇文章将详细介绍S3C2440处理器上的Linux看门狗驱动的实现,包括ioremap、驱动结构以及如何从裸机程序转化为Linux驱动。 首先,我们需要理解`ioremap`。在Linux内核中,`ioremap`函数用于映射I/O内存,因为这些...
在某些情况下,IO内存的访问可能需要通过页表,此时内核需要使用ioremap()函数预先配置物理地址以使其对驱动程序可见。而不需要页表的情况下,IO内存地址可以直接使用,但依然建议使用内核提供的包装函数进行读写,...
在这种情况下,I/O寄存器被称为IO内存,通过`ioremap`将其映射到虚拟地址空间,然后使用read/write接口进行访问。 二、ioremap与ioport_map 在Linux 2.6之前的版本,访问I/O寄存器有两种方式:portio和mmio。port...
- **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中,MIO的GPIO控制器寄存器位于固定地址,我们需要使用`ioremap`将这些地址映射到内核空间的一个指针,然后通过这个指针读写寄存器来控制GPIO状态。 驱动程序的基本流程可能如下: 1. 初始化:在驱动加载时...
通常来说,Linux内核支持两种映射方式:动态映射(ioremap)与静态映射(map_desc)。 #### 二、动态映射(ioremap) 动态映射是较为常用的一种方法,它的实现相对简单且灵活,适用于大部分场景。这种方式主要是通过内核...