ioremap_nocache函数说明

本文详细介绍了ioremap_nocache函数,该函数用于将物理内存映射到CPU空间,并确保内存内容不受CPU缓存影响,这对于控制寄存器区域特别有用。文章还对比了ioremap与mmap的区别。

NAME

ioremap_nocache - 把内存映射到CPU空间  

SYNOPSIS

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

ARGUMENTS

phys_addr
要映射的物理地址 
size
要映射资源的大小  

DESCRIPTION

ioremap_nocache进行一系列平台相关的操作使得CPU可以通过readb/readw/readl/writeb/writew/writel等IO函数进行访问。
返回的地址不保证可以作为虚拟地址直接访问
[译者按:在译者的使用过程种并没有出现不能作为虚拟地址直接访问的情况,可能是某些平台下的不可以吧。译者的使用平台是x86和ixp425]

这个版本的ioremap确保这些内存在CPU是不可缓冲的,如同PCI总线上现存的缓冲规则一样。注:此时在很多总线上仍有其他的缓冲和缓存。在某些特殊的驱动中,作者应当在PCI写的时候进行读取。
这对于一些控制寄存器在这种不希望复合写或者缓冲读的区域内时是非常有用的
返回的映射地址必须使用iounmap来释放。

一直被这个CPU的高速缓冲困扰,好不容易找到这个函数,总算是解决问题了.
用于确保每次数据都写到内存中了





ioremap_nocache函数

注解ioremap_nocache

ioremap_nocache 把内存映射到CPU空间

void __iomem * ioremap_nocache (unsigned longphys_addr, unsigned longsize);

phys_addr
要映射的物理地址
size
要映射资源的大小

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

ioremap是为一段高端的物理内存建立映射(即增加相关的页表内容),驱动常用
mmap是为可能不连续的一系列逻辑上相关的(如整体是一个文件)物理内存段建立映射,
并呈现一个连续的虚拟地址空间,应用程序常用
mmap是系统调用,只能应用程序用。
ioremap是kernel提供的函数,只能在kernel里用









在Linux内核5.1.0及以后的版本中,`ioremap_nocache`函数被替换为`ioremap`函数的变种`ioremap_wc`(write-combining)或`ioremap_np`(non-posted)。这些新函数提供了更细粒度的内存映射控制。 ### `ioremap_nocache` 的替换 `ioremap_nocache` 曾经用于将物理地址映射到虚拟地址,并且不进行缓存。然而,在新版本的内核中,推荐使用以下函数来替代: 1. **`ioremap`**: 这是最基本的映射函数,映射的内存区域默认是缓存的。 2. **`ioremap_wc`**: 用于映射写组合(write-combining)内存区域。写组合内存区域不进行缓存,但会进行写组合,以提高性能。 3. **`ioremap_np`**: 用于映射非posted(non-posted)内存区域。非发帖内存区域不进行缓存,也不会进行写合并。 ### 示例代码 以下是使用函数进行内存映射的示例代码: ```c #include <linux/io.h> void *map_memory(phys_addr_t phys_addr, size_t size) { // 使用ioremap_wc进行写组合映射 void *virt_addr = ioremap_wc(phys_addr, size); if (!virt_addr) { pr_err("ioremap_wc failed\n"); return NULL; } return virt_addr; } void unmap_memory(void *virt_addr) { iounmap(virt_addr); } ``` ### 为什么选择 `ioremap_wc` 或 `ioremap_np` - **`ioremap_wc`**: 适用于需要高性能写入操作的设备,如显卡帧缓冲区。 - **`ioremap_np`**: 适用于需要严格内存顺序的设备,如某些网络设备。 ### 总结 在Linux内核5.1.0及以后的版本中,`ioremap_nocache`被替换为`ioremap_wc`和`ioremap_np`,以提供更细粒度的内存映射控制。选择合适的函数取决于具体的硬件需求和应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值