打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ioremap和ioremap

ioremap - 将一个IO地址空间映射到内核的虚拟地址空间上去

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.h

ioremap 依靠 __ioremap实现,它只是在__ioremap中以第三个参数为0调用来实现.

ioremap是内核提供的用来映射外设寄存器到主存的函数:举个例子,比如某个驱动设备有100 个寄存器,他们都是连在一块的,位置是固定的,假如每个寄存器占4个字节,那么一共400个字节的空间被映射到内存成功后,ioaddr就是这段地址的开头(注意ioaddr是虚拟地址,而mmio_start是物理地址,它是BIOS得到的,肯定是物理地址,而保护模式下CPU不认物理地址,只认虚拟地址),ioaddr+0就是第一个寄存器的地址,ioaddr+4就是第二个寄存器地址(每个寄存器占4个字节),以此类推。

ioremap_nocache - 把内存映射到CPU空间

void __iomem * ioremap_nocache (unsigned long phys_addr, unsigned longsize);  

phys_addr:要映射的物理地址 

size:要映射资源的大小 

ioremap_nocache进行一系列平台相关的操作使得CPU可以通过readb/readw/readl/writeb/writew/writel等IO函数进行访问。
注:返回的地址不保证可以作为虚拟地址直接访问。

调用ioremap_nocache()函数之后,返回一个线性地址,此时CPU 可以访问设备的内存(已经将其映射到了线性地址空间中了),此时CPU可以使用访问内存的指令访问设备的内存空间(host bridge 判断访问物理内存还是设备中的内存),此时我们就可以像访问内存一样来访问设备的内存(寄存器)。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Linux内核开发之内存与I/O访问(二)
《Linux设备驱动程序》(十五)硬件通信IO设备读写寄存器的过程
IO端口和IO内存的区别及分别使用的函数接口
与硬件通讯---IO内存
树莓派高级开发——“IO口驱动代码的编写“ 包含总线地址、物理_虚拟地址、BCM2835芯片手册知识...
Linux内核访问外设I/O资源的方式(z)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服