物理地址、设备地址和虚拟地址的区别

2024-04-17

有什么区别设备地址, 实际地址 and 虚拟地址?

其实我正在努力mmap在驱动程序中,我一直坚持这个概念。


The 文档 https://www.kernel.org/doc/Documentation/DMA-API-HOWTO.txt says:

内核通常使用虚拟地址。返回的任何地址 kmalloc()、vmalloc()和类似接口是虚拟地址,可以 存储在“void *”中。

虚拟内存系统(TLB、页表等)将虚拟内存转换为内存 地址到CPU物理地址,存储为“phys_addr_t”或 “资源大小_t”。内核管理设备资源,如寄存器 物理地址。这些是 /proc/iomem 中的地址。物理方面 地址对驾驶员没有直接用处;它必须使用 ioremap() 来映射 空间并产生虚拟地址。

I/O 设备使用第三种地址:“总线地址”或“DMA 地址”。 如果设备在 MMIO 地址处有寄存器,或者如果它执行 DMA 来读取 或者写系统内存,设备使用的地址都是总线地址。 在某些系统中,总线地址与CPU物理地址相同,但是 一般来说,它们不是。 IOMMU 和主桥可以产生任意 物理地址和总线地址之间的映射。

这是一张图片和一些示例:

             CPU                  CPU                  Bus
           Virtual              Physical             Address
           Address              Address               Space
            Space                Space

          +-------+             +------+             +------+
          |       |             |MMIO  |   Offset    |      |
          |       |  Virtual    |Space |   applied   |      |
        C +-------+ --------> B +------+ ----------> +------+ A
          |       |  mapping    |      |   by host   |      |
+-----+   |       |             |      |   bridge    |      |   +--------+
|     |   |       |             +------+             |      |   |        |
| CPU |   |       |             | RAM  |             |      |   | Device |
|     |   |       |             |      |             |      |   |        |
+-----+   +-------+             +------+             +------+   +--------+
          |       |  Virtual    |Buffer|   Mapping   |      |
        X +-------+ --------> Y +------+ <---------- +------+ Z
          |       |  mapping    | RAM  |   by IOMMU
          |       |             |      |
          |       |             |      |
          +-------+             +------+

在枚举过程中,内核了解 I/O 设备并 它们的 MMIO 空间以及将它们连接到系统的主桥。为了 例如,如果 PCI 设备有 BAR,则内核读取总线地址 (A) 从 BAR 并将其转换为 CPU 物理地址 (B)。地址B 存储在结构资源中,通常通过 /proc/iomem 公开。当一个 驱动程序声明一个设备,它通常使用 ioremap() 来映射物理地址 B 位于虚拟地址 (C)。然后它可以使用 ioread32(C) 等来访问 设备在总线地址 A 处注册。

如果设备支持 DMA,驱动程序会使用 kmalloc() 或 类似的接口,返回虚拟地址(X)。虚拟的 内存系统将 X 映射到系统 RAM 中的物理地址 (Y)。司机 可以使用虚拟地址X来访问缓冲区,但是设备本身 不能,因为 DMA 不经过 CPU 虚拟内存系统。

在一些简单的系统中,设备可以直接对物理地址进行DMA Y. 但在许多其他方面,有 IOMMU 硬件来转​​换总线 地址到物理地址,例如,它将 Z 转换为 Y。这是一部分 DMA API 的原因:驱动程序可以给一个虚拟地址 X 类似 dma_map_single() 的接口,用于设置任何所需的 IOMMU 映射并返回总线地址 Z。然后驱动程序告诉设备 对Z进行DMA,IOMMU将其映射到系统中地址Y处的缓冲区 内存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

物理地址、设备地址和虚拟地址的区别 的相关文章

  • Mono for Android,读取和写入 XLSX

    我正在使用 Mono for Android 开发一个应用程序 我需要读取和创建 XLSX Excel 文件的功能 我尝试过EPPlus和NPOI 并快速浏览了一下微软的Open XML SDK 发现了以下问题 EPPlus 需要 Wind
  • 方法调用 mActionBar=getActionBar() 给出错误[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用支持库android support v7 app actionbar因为我想要操作栏API 级别 8以上 但是下面的句子给了我
  • 如何使用 SyncAdapter 处理远程服务器的 RESTful 更新

    我观看了 Google I O REST 演讲并阅读了幻灯片 http www google com events io 2010 sessions developing RESTful android apps html http www
  • Android P Beta - AlarmManager 通知不起作用

    我正在 Android P beta 版本 4 上测试我的应用程序 我的应用程序目标SdkVersion是27 据观察 警报管理器通知未按预期工作 我使用下面的代码来设置通知 if android os Build VERSION SDK
  • Android NumberPicker 带字符串

    I have customised the NumberPicker to show text The output is this 当我按 确定 时 我想将 e x 鼠标添加到我的列表 文章 中 我得到的是索引值 int 它由 array
  • 指标元素之间的空间

    如何增加 减少指标元素之间的空间ViewPagerIndicator 我用过CirclePageIndicator 我能够通过以下步骤在两个指标之间留出更多空间 打开源代码CirclePageIndicator并找到变量mRadius 在第
  • Android TableRow 垂直拉伸以填充屏幕

    我正在尝试创建一个电话拨号器视图 使用 TableLayout 在 3x4 网格中创建 12 个按钮 我希望行垂直拉伸以平等地使用所有可用空间 但似乎 fill parent 在 TableRows 上不起作用 我不想使用 setMinim
  • 如何处理应用程序对 3d party 的依赖

    我当前正在开发的应用程序依赖于第三方应用程序 OIFileManager 我的问题是处理这些依赖关系的一般方法是什么 告诉用户解决它 嵌入 3d party apk 如果其许可证允许 自动解决 也许Android市场有相应的系统 没有自动的
  • 如何创建 Google Play 音乐的直接链接?

    据我所知 应用程序的直接链接是 gt market apps collection
  • firestore快照监听器生命周期和定价之间有什么关系?

    在我的活动中 我有一个字符串列表 这些字符串表示我想要附加快照侦听器的 Firestore 文档 我使用 Acivity ModelView 存储库结构 在活动的 onCreate 中 我向 ViewModelProvider 询问适当的
  • 颤动附近的连接

    当我尝试在设备上做广告或发现时 我收到此错误 但是前一天在环路上效果很好 PlatformException Failure 17 API Nearby CONNECTIONS API is not available on this de
  • CheckedTextView 的中心文本和复选标记

    我实现的布局如下图所示 我使用的代码是
  • android:widgetLayout 和 android:layout 之间的区别?

    我得到一些奇怪的配置 其中 widgetLayout 配置列表项的内部空间 而布局配置整个项目列表和屏幕背景 有人能真正解释一下什么是 widgetLayout 吗 android layout 整个首选项的布局 包括标题 摘要和小部件 a
  • 使用 Asp.Net 的 GCM 推送通知

    正如您可能已经看到的 Google 正在迁移其推送通知系统 http developer android com guide google gcm c2dm html http developer android com guide goo
  • Android - 测试另一个活动是否已开始

    我正在尝试测试以下场景 在自动完成文本视图中输入一个字母 向下滚动并选择其中一个选项 然后单击一个按钮 单击按钮将启动一个新活动 我想检查新活动是否已经开始 这是测试方法 public void testSpinnerUI mActivit
  • 如何在高速缓存中存储图像

    我对此完全空白 我想从 URL 下载图像 并且必须将其存储在内部 以便下次我不需要连接到网络 而是从缓存中检索它 但我不知道该怎么做 谁能帮我提供一个代码片段 import java io BufferedInputStream impor
  • DeadSystemException启动服务Android 7

    在过去的几周里 我在我的事故报告中看到 Fatal Exception java lang RuntimeException Unable to start service com MyService ef705d8 with Intent
  • Kotlin 中是否有类似于 #region #endregion 的语法?

    我知道我可以使用 region endregion 包围 C 中的代码片段 Kotlin 中是否有类似的语法 谢谢 region MyRegion protected void Page Load object sender EventAr
  • Android 中的字符串加密

    我正在使用代码进行加密和加密 它没有给出字符串结果 字节数组未转换为字符串 我几乎尝试了所有方法将字节数组转换为字符 但没有给出结果 public class EncryptionTest extends Activity EditText
  • 防止 Firebase 中的待处理写入事务不起作用

    我的目标是在单击按钮时将名称插入 Cloud Firestore 中 但如果用户未连接到互联网 我不希望保存处于挂起状态 我不喜欢 Firebase 保存待处理写入的行为 即使互联网连接已恢复 我研究发现Firebase 开发人员建议使用事

随机推荐