ioremap和memremap

ioremap和memremap原文 https lwn net Articles 下面翻译自 google 像用户空间一样 内核通过页表访问内存 因此 当内核代码需要访问内存映射的 I O 设备时 必须首先设置适当的内核页面表映射 长期以来 用于该工作的内核工具是 ioremap 它具有许多变体 事实证明 其中一些变体并非总是适合此工作的工具 从而导致内核中存在一定数量的变通方法 但是 这种情况

原文:ioremap() and memremap() [LWN.net]

下面翻译自google:

像用户空间一样,内核通过页表访问内存。因此,当内核代码需要访问内存映射的I / O设备时,必须首先设置适当的内核页面表映射。长期以来,用于该工作的内核工具是ioremap(),它具有许多变体。事实证明,其中一些变体并非总是适合此工作的工具,从而导致内核中存在一定数量的变通方法。但是,这种情况可能会发生变化,这是针对有问题的情况而从ioremap()移开的一部分 。

成功调用ioremap()会返回与请求的物理地址范围的开始相对应的内核虚拟地址。但是,出于多种(通常是特定于体系结构的)原因,通常不打算直接取消引用此地址。相反,应使用诸如readb()或iowrite32()之类的访问器函数 。为了强制执行此规则,使用__iomem标记注释了 ioremap()的返回地址。这将导致稀疏检查器抱怨没有使用适当功能的访问。

缓存也无关紧要。CPU通常从内存中缓存数据,但是当出于多种原因而涉及I / O时,这是一个坏主意。尝试从I / O存储器读取完整的缓存行不会带来意料之外的副作用,并且延迟对I / O存储器的写操作可能会更改设备的运行方式。I / O存储器通常应作为设备的直接控制通道;为此,ioremap() 至少在x86体系结构上禁用了对设备内存的缓存

实际上,从ioremap()获得的内存范围的缓存状态 尚未完全定义。通常,未缓存是默认设置,但是仍然存在一个ioremap_nocache(),可以通过代码来调用该代码,该代码需要绝对确保在它与其设备内存之间没有缓存

但是,在某些情况下,I / O内存只是内存。图形适配器使用的视频内存就是一个典型的例子。使用这种内存,可以预期直接指针引用可以工作,并且可以在CPU中进行缓存;实际上,可能需要获得合理的性能。对于这种情况,如果可能,有一个ioremap_cache()创建缓存的映射。大多数体系结构还具有几个变体,它们允许缓存读取,但限制写入缓存。特别地,ioremap_wc()允许组合写操作,而ioremap_wt()导致写操作直接进入设备内存。通过这些变体,驱动程序编写者可以获得特定的设备内存所需的映射类型。

不过,丹·威廉姆斯(Dan Williams)最近在使用这一系列功能时遇到了一些问题。一种是它们都返回带有__iomem批注的指针 。几乎可以肯定的是,在启用了缓存的情况下映射I / O内存的驱动程序将把结果地址范围视为普通内存,包括直接将指针解引用到该范围。为此,他们必须放弃__iomem 批注或直接忽略它。在前一种情况下,代码比其他情况要嘈杂;在后一种情况下,任何在代码上运行稀疏的人 都将忽略所产生的警告。

除此之外,许多体系结构不支持所有各种缓存模式,因此特定于体系结构的头文件充满了以下行:

 #define ioremap_wt ioremap_nocache 

结果是像ioremap_wt()之类的函数的调用者可能无声地无法获得他们所要求的直写式缓存。

Dan对这两个问题的答案都是一个补丁集,该补丁集添加了一个新功能来映射设备内存,其行为类似于内存:

void *memremap(resource_size_t offset, size_t size, unsigned long flags);

此函数将iomem_resource 重新映射为可缓存内存,(成功)返回一个地址,该地址映射到在给定物理偏移量和给定 大小(以字节为单位)上找到的设备内存。该标志参数可以是 MEMREMAP_WB全回写缓存或MEMREMAP_WT为写式高速缓存。返回的地址没有 __iomem批注。如果无法提供请求的缓存行为,则memremap()将返回NULL而不是退回到其他类型的缓存。

补丁集将大多数内核代码转换为新接口。

在撰写本文时,这项工作是在其第三修订版中,并且已经解决了所提出的(很少)评论意见。它阐明了驱动程序API,清楚地将两个不同的用例分隔开来映射设备内存,并且它应导致较少的稀疏警告噪声。在这一点上,没有太多不喜欢的东西,因此将其排除在4.3合并窗口之外应该没有太多。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214138.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午4:54
下一篇 2026年3月18日 下午4:54


相关推荐

  • Dynamics Crm 2011 Or 2013 IFD 部署一段时间后,CA验证问题[通俗易懂]

    Dynamics Crm 2011 Or 2013 IFD 部署一段时间后,CA验证问题[通俗易懂]以下错误描述摘自博客:http://blog.csdn.net/qzw4549689/article/details/14451257IFD部署一段时间后,大概一年,突然出现从IFD登录页面登录后,再次弹出要求登录的框,多次输入用户名密码仍然无效,查看日志:><TraceRecordxmlns=”http://schemas.micros…

    2025年7月24日
    5
  • 什么叫侧面指纹识别_又见侧面指纹,四大指纹识别技术,你会如何选择?「建议收藏」

    什么叫侧面指纹识别_又见侧面指纹,四大指纹识别技术,你会如何选择?「建议收藏」原标题:又见侧面指纹,四大指纹识别技术,你会如何选择?1.正面实体指纹系统关于最早搭载正面指纹识别技术的手机,估计大家都会说是苹果公司在2013年9月发布的iPhone5s。其实最早的应该是摩托罗拉公司。只是苹果公司的影响比较大,在iPhone5s之后,将这项技术推向了颠峰,引领了潮流。之后各大手机厂商也纷纷加入了这个行列,越来越多的指纹识别手机面世。得益于苹果手机传统的HOME键,刚好可…

    2022年6月29日
    34
  • oleDbCommand访问Excel

    oleDbCommand访问ExceloleDbCommand访问Excel:_oleCmdSelect=newOleDbCommand(“SELECT*FROM[Sheet1$A2:A5]”,_oleConn);objValue=_oleCmdSelect.ExecuteScalar();usingSystem;usingSystem.Collections.Generic;usingS…

    2022年5月12日
    46
  • C 结构体指针初始化

    C 结构体指针初始化原文 C 结构体指针初始化 CSDN 同步发布 转载请注明出处 谢谢 在使用指针之前 务必要将其初始化 这个是我们最早学习 C 语言的时候 书上经常说的一个问题 在工作中 我们反而会经常忘记这条金科玉律 本篇文章的所有代码都经 gcc 7 编译器编译过 关于在 macOS 中如何安装和使用 gcc 可以参考 GCC Homebrew 安装 GCC 和 Binutils 这篇文章 结构体成

    2026年3月20日
    1
  • amoeba mysql binary_amoeba安装与实现amoeba for mysql读写分离

    amoeba mysql binary_amoeba安装与实现amoeba for mysql读写分离运行环境 lCentOS6 3lJdk1 6 0 30lamoeba mysql binary 2 2 0lamoeba 192 168 88 17lmaster1 192 168 88 10lslave1 192 168 88 11 一 安装 jdk1 5 以上版本 1 1 卸载 centos 服务器自带版本 jdk1 1 1 查看服务器自带 jdk 版本号 roo

    2026年3月17日
    1
  • Java Integer 与 int 深刻理解

    Java Integer 与 int 深刻理解Java Integer 与 int 深刻理解

    2022年4月24日
    54

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号