在 ARMv7 的上下文中,当 mmu 必须进行页表转换时,Linux 内核一对一映射内存的优势是什么

2024-03-04

Linux内核虚拟地址是一对一映射。所以通过减去一个PAGE_OFFSET到虚拟地址我们将得到物理地址。就是那样virt_to_phys http://lxr.free-electrons.com/source/arch/arm/include/asm/memory.h#L261 and 物理到虚拟 http://lxr.free-electrons.com/source/arch/arm/include/asm/memory.h#L267实施于memory.h http://lxr.free-electrons.com/source/arch/arm/include/asm/memory.h#L256.

我的问题是,当发生 TLB 未命中时 mmu 必须执行页表转换时,armv7 mmu 上的这些一对一映射有什么优势?

一对一映射的唯一优点是S/W只需减去相应的虚拟地址即可直接获得物理地址PAGE_OFFSET或者ARMV7 MMU页面转换还有其他一些优势?

如果 1:1 映射内存相对于 mmu 页表转换没有优势,那么为什么我们需要 1:1 映射内存的页表。我的意思是 mmu 可以以类似的方式执行操作virt_to_phys而不是遍历所有页表。


我的问题是这些一对一映射的优点是什么 armv7 mmu,当mmu必须做页表转换时 有TLB未命中吗?

你的答案部分包含在问题中。 1:1 映射是通过 1MB 部分实现的,因此 TLB 条目较小。即,一个 4k 页需要一个 1 级和 2 级 TLB 条目,并且它只包含 4k 内存。 ARM 内核必须始终保持映射,因为它有中断、页面错误和其他可能随时调用的关键代码。

对于用户空间代码,每个 4k 代码块都由一个inode并且在内存压力期间可能会被从内存中清除。用户空间代码通常只有几个热进程/例程,因此它们的 TLB 条目并不那么重要。 TLB 通常次于 L1/L2 缓存。

同样,设备驱动程序通常需要知道physical地址,因为它们位于 CPU 外部并且不知道虚拟地址。减法的简单性PAGE_OFFSET有助于编写高效的代码。

一对一映射的唯一优点是 S/W 可以通过减去 PAGE_OFFSET 直接获取相应虚拟地址的物理地址,还是 ARMV7 MMU 页面转换也有其他优点?

1:1 映射允许一次性映射更大的范围。典型的 SDRAM/核心内存以 1MB 为增量。它也非常高效。还有其他可能性,但这些可能是这个选择的胜利。

唯一的好处就是一对一映射,这样S/W就可以直接 获取相应虚拟地址的物理地址 减去 PAGE_OFFSET 或者 ARMV7 MMU 上还有其他一些优势 也有页面翻译吗?

MMU必须打开才能使用数据缓存并在用户空间进程之间进行内存保护;彼此以及用户/内核分离。单独检查内核对 1:1 映射的使用并不是全部。内核的其他部分需要MMU。如果没有 MMU,1:1 映射将是身份。 IE。PAGE_OFFSET==0。具有固定偏移量的唯一原因是允许将任何物理地址处的内存映射到公共虚拟地址。并非所有平台都有相同的PAGE_OFFSET value.

的另一个好处是virt_to_phys关系;内核被编写为在固定的虚拟地址上执行。这意味着内核代码不需要与 PC 相关,但可以在具有不同核心内存物理地址的平台上运行。小心在arm/boot汇编代码与 PC 相关,因为引导加载程序在 MMU 关闭的情况下进行手动控制。这arm/boot代码设置初始映射。

也可以看看:查找向量表的物理地址 https://stackoverflow.com/questions/19275718/find-the-physical-address-of-exception-vector-table-from-kernel-module,一个例外virt_to_phys映射。
内核数据可交换吗? https://stackoverflow.com/questions/29738696/in-linux-physical-memory-pages-belong-to-the-kernel-data-segment-are-swappable
内核如何管理小于1GB的内存? https://stackoverflow.com/questions/4528568/how-does-the-linux-kernel-manage-less-than-1gb-physical-memory
有关 ARM Linux 启动的一些详细信息? https://stackoverflow.com/questions/27607496/some-details-on-arm-linux-boot
Linux内核中的页表 https://stackoverflow.com/questions/16688540/page-table-in-linux-kernel-space- 早期启动和MMU。

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

在 ARMv7 的上下文中,当 mmu 必须进行页表转换时,Linux 内核一对一映射内存的优势是什么 的相关文章

随机推荐

  • Google Drive 将元数据添加到文件

    我想使用 googledrive api 来搜索文件 我想向其中添加元数据 Example File computers1 pdf Brand brand1 File computers2 pdf Brand brand2 File com
  • 在 ER 图中定义实体、属性和关系的基本规则是什么?

    构建 E R 图时 以下哪项必须具有关键and属性 entity 实体类型 关系类型 关系 具有关系类型的元组 在原始的实体 关系方法中 我们识别实体类型和关系 关联类型及其相关属性 在绘制 ER 图时 我们选择一组或多组可以将类型实例标识
  • 在 Windows 7 家庭普通版上找不到 IIS

    我刚刚购买了一台全新的联想 idealpad 笔记本电脑 运行 Windows 7 Home Basic 库存中没有操作系统 DVD 但笔记本电脑确实有操作系统恢复软件 如果您想将它们刻录到 DVD 上的话 我想今天大多数硬件都是这样销售的
  • Go 中如何处理 i18n?

    我在网上搜索但没有找到任何与 i18n 和 Go 相关的内容 我希望使用 Go 来开发网站 应对国际化的最佳方式是什么 go i18n http nicksnyder github io go i18n 有一些不错的功能 实施CLDR 复数
  • 如何查询 SQL Server TEXT 列中包含 XML(不是 xml 列类型)的值

    我有表文档 DOCUMENTS DOCUMENTID int USERID int CONTENT text 我在 SQL Server 数据库中将以下 XML 存储在名为 CONTENT 的 TEXT 列中
  • 如何使用 spring DSL 在camel 中记录标头值

    这看起来应该很简单 请原谅双关语 我正在尝试在 Spring DSL 路由中的 Camel 中记录标头 我已经看到了答案Java DSL https stackoverflow com questions 15111044 how to a
  • ASP.NET:显式本地化与隐式本地化?

    在我看来 隐式本地化相对于显式本地化的优势在于 如果您有多个属性要针对给定控件进行本地化 那么这是一种更经济的语法 如果您只需要本地化一些文本 我会使用 asp Localize 控件 该控件仅具有呈现到 UI 的单个属性 文本 有理由使用
  • 如何平滑圆角矩形的角,Swing?

    当我尝试制作圆角矩形时 我的角变得非常像素化 有什么办法可以平滑它们吗 这是一张图片 注意角落 以下是我子类化并重写绘制方法的按钮的代码 带有像素化角的按钮 public class ControlButton extends JButto
  • .NET 类型的私有成员的命名约定 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将参数从服务器端 PHP 传递到客户端 JavaScript 的最安全方法是什么[重复]

    这个问题在这里已经有答案了 在我的应用程序中 我严重依赖 JavaScript 来增强用户界面 但所有数据都来自数据库并由 PHP 处理 默认情况下 我使用 echo 语句来 及时 替换所需的值 如下所示 var myVariable 然而
  • 根据州名缩写在美国地图上绘制数值

    我有一个包含所有状态的数据 如下所示 在这里提供一个样本 state name value x AL 250 AK 900 MT 1000 NJ 10000 WY 500 现在我需要根据州缩写在美国地图上绘制这些数字 value x 我尝试
  • 外键未填充主键值

    我已经寻找答案但没有找到 我有 2 张桌子 两者都有自动生成的 PK 表 2 中的 PK 是表 1 中的 FK 由于它们都是自动生成的 因此我假设表 1 中的 FK 将使用表 2 自动生成的值填充 但它不起作用 表1中的FK最终为空 这是我
  • Angular Material 通过 $http 调用自动完成

    我想做的是角度材质自动完成 md 自动完成 https material angularjs org latest api directive mdAutocomplete 其中的数据是从对我的 REST API 的 AJAX 调用中动态检
  • 不使用左手递归解析布尔表达式

    我正在尝试匹配这个 f some thing something else f 某物 是一个函数调用 它是一个表达式 是一个布尔运算符 别的东西 是一个字符串 也是一个表达式 所以布尔表达式应该是 expression operator e
  • 部署新版本后,即使清除缓存后,浏览器也会看到旧版本的 Angular 应用程序

    我有一个 Angular 11 应用程序 正在使用以下命令构建用于在生产中部署 npm install npm run build prod outputHashing all 我遇到的问题是 部署后 当我使用浏览器访问应用程序的 URL
  • 如何动态添加更多组件 React Native

    我想在单击按钮后添加更多组件 您可以分享代码或想法以便我可以实施吗 如图所示 每次用户单击添加按钮时 都会添加一行 组件 这是哪里state https facebook github io react native docs state
  • 引用 Oracle 中视图的外键

    我尝试使用外键引用视图 但收到此错误 错误 ORA 02270 此列列表没有匹配的唯一键或主键 不过 我已在此视图上创建了一个主键 并在 TOAD 的 约束 选项卡中对其进行了验证 这是我试图创建的表 CREATE TABLE QUESTI
  • Cronjob:找不到命令

    我有一个如下的 cronjob 10 root cd some directory python3 FILE py gt gt Output txt 2 gt 1 如果我从常规命令行运行该命令 它工作正常 但是当从 cronjob 运行时
  • 函数内的 ggplot:它什么时候不识别参数,什么时候识别参数? [复制]

    这个问题在这里已经有答案了 考虑以下两个函数 library ggplot2 testdata lt as data frame cbind rep c 1 4 each 50 rbinom 100 50 5 names testdata
  • 在 ARMv7 的上下文中,当 mmu 必须进行页表转换时,Linux 内核一对一映射内存的优势是什么

    Linux内核虚拟地址是一对一映射 所以通过减去一个PAGE OFFSET到虚拟地址我们将得到物理地址 就是那样virt to phys http lxr free electrons com source arch arm include