- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据一些教程,我们会在 bootlaoder 开始时禁用 MMU 和 I/D-Caches。如果我理解正确,它的目的是在程序中直接使用物理地址,所以如果我错了,请纠正我。谢谢!
其次,我们这样做是为了禁用 MMU 和缓存:
mrc P15, 0, R0, C1, C0, 0
bic R0, R0, #0x00002300 @ clear bits 13, 9:8
bic R0, R0, #0x00000087 @ clear bits 7, 2:0
orr R0, R0, #0x00000002 @ set bit 2 (A) Align
orr R0, R0, #0x00001000 @ set bit 12 (I) I-Cache
mcr P15, 0, R0, C1, C0, 0
最佳答案
最后一个问题是为什么 D-cache 被禁用而 I-caches 可以?加快仪器进程?
MMU 具有确定哪些内存区域可缓存或不可缓存的设置。如果您没有打开 mmu 但您打开了数据缓存(如果可能),那么您将无法安全地与外围设备通信。例如,如果您读取 uart 状态寄存器,它就像任何其他数据操作一样通过缓存,那么无论该状态是什么,都将保留在缓存中以供后续读取,直到该缓存线被逐出并且您再获得一次实际登记。例如,假设您有一些代码轮询 uart 状态寄存器以等待 rx 缓冲区中的字符。如果第一次读取显示没有字符,则该状态进入缓存,您将永远留在循环中,因为您将永远无法再次与状态寄存器交谈,您只会获得寄存器的缓存副本。如果那里有一个字符,那么该状态也会被缓存,你读取 rx 寄存器,也许做一些事情,如果当你再次回来时,如果状态没有从数据缓存中被驱逐,那么你会得到陈旧的状态,它显示有一个字符,您读取的 rx 缓冲区可能会也可能不会被缓存,因此您可能会在缓存中获得过时的值,您可能会获得过时的值或读取时外围设备所做的任何事情并且没有新值,或者您可能获得一个新值,但在这些情况下你得不到的是对外围设备的正确访问。当 mmu 打开时,您使用 mmu 将该外设使用的地址空间标记为不可(数据)缓存,并且您没有这个问题。关闭 mmu 后,您需要关闭 arm 系统的数据缓存。
保持 I-cache 处于打开状态是可以的,因为指令只获取读取指令......对于裸机应用程序来说是可以的,例如,如果您使用具有读取干扰潜力的闪存(spi 或 i2c 闪存),它会有所帮助.问题是这个应用程序是一个引导加载程序,所以你必须格外小心。例如,您的引导加载程序在地址 0x8000 处有一些代码,它至少运行一次,然后您选择将其用作引导加载程序,引导加载程序可能位于地址 0x10000000 允许您在 0x8000 加载新程序,此加载使用数据访问,因此它不会通过指令缓存。因此,指令缓存有可能包含您上次在 0x8000 区域时的部分或全部代码,当您跳转到 0x8000 处的引导加载代码时,您将从缓存中获取旧程序或令人讨厌的混合缓存和未缓存部分的旧程序和新程序。因此,如果您的引导加载程序允许启用 i-cache,则您需要在跳转到引导加载代码之前使缓存无效。
最后,如果您或任何使用此引导加载程序的人想要使用 jtag,那么您会遇到同样的问题,但更糟糕的是,当您告诉 jtag 调试器时,不通过 i-cache 的数据周期将用于将新程序写入 ram然后运行新程序,您将获得 1) 只有新程序,2) 缓存中的新程序和旧程序片段的混合 3) 缓存中的旧程序。
因此,没有 mmu 的 d-cache 很糟糕,因为它不在 ram、外围设备等中。 i-cache 是一种使用风险自负的东西,除了 jtag 用于调试的时间外,您可以减轻这种风险.
如果您有顾虑或已确认(外部)闪存中存在读取干扰,那么我建议打开 i-cache,使用紧密循环将您的应用程序复制到 ram,分支到 ram 副本并在那里运行,关闭i-cache(或自担风险使用)并且不要再次接触闪存,当然不是对小区域的大量读取访问。像命令行解析器那样的紧密 uart 轮询循环,是遇到读取干扰的好地方。
关于ARM 引导加载程序 : Disable MMU and Caches,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21262014/
简短的问题:页表存放在哪里?它是在 MMU(完全硬件实现)还是在 RAM(涉及操作系统)中? 我试图弄清楚 RAM 访问是否涉及将线性地址映射到物理地址以防 TLB 未命中。我想答案是否定的,实现完全
内存管理单元(MMU)如何检测指针的双重释放? 我知道在释放指针后立即将指针设置为 NULL 是一个好习惯,但假设程序员不这样做。有没有什么MMU机制可以检测到? 最佳答案 MMU 与它无关。如果你两
我有一个关于 linux 内核和 MMU 之间关系的问题。我现在明白了 linux 内核管理虚拟内存地址和物理内存地址之间的页表。同时x86架构中有MMU管理虚拟内存地址和物理内存地址之间的页表。如果
我正在学习Windows下的X64汇编语言和MASM64,就是看最新版的《64位汇编语言的艺术》一书。 我有一个关于书中引用的问题: You do have to worry about MMU pa
我试图了解当我们想为特定的虚拟内存地址分配一些值时操作系统是如何工作的。 我的第一个问题涉及 MMU 是否处理 CPU 和 RAM 之间的所有内容。这是真的?从人们可以从维基百科中读到的内容,我会这样
我在我的 s3c2440 板上启用了 MMU(3G - 4G 内存::故障属性),当我没有读/写 3G - 4G 内存时一切都很好。所以为了测试页面错误向量,我写信给一个 0xFF 到 3G 地址,正
这个问题在这里已经有了答案: what is the right way to update MMU translation table (1 个回答) 关闭 6 年前。 更新翻译表中条目的步骤是什
我正在探索 Linux 操作系统中的内存管理。 据我所知,MMU是集成在现代CPU中处理地址转换的硬件。如果虚拟地址不在 TLB 中,则MMU会先通过页表基址寄存器(PTBR)获取进程的页表地址,然后
正在阅读Linux内核,对MMU相关的部分比较感兴趣。在ARM64 cpu中,有如下代码: __create_page_tables: pgtbl x25, x26, x28
我想知道在没有 MMU 支持的情况下如何保护内存。我试图用谷歌搜索它,但没有看到任何有值(value)的论文或研究。那些处理它的人只处理错误,例如未初始化的指针,而不是由于软错误导致的内存损坏,也就是
通常,列表要么被实现为链表,它的遍历速度很慢,要么是数组列表,它在插入元素时很慢。 我想知道是否可以通过在插入或删除元素时重新映射而不是复制内存来使用处理器的 MMU 更有效地实现列表。这意味着索引和
这是我系统讲座的 PowerPoint 中的一句话,但我不明白为什么上下文切换会使 MMU 失效。我知道它会使缓存无效,因为缓存包含另一个进程的信息。但是,对于 MMU,它只是将虚拟内存映射到物理内存
根据一些教程,我们会在 bootlaoder 开始时禁用 MMU 和 I/D-Caches。如果我理解正确,它的目的是在程序中直接使用物理地址,所以如果我错了,请纠正我。谢谢! 其次,我们这样做是为了
内存 Controller 的作用是什么?它们与处理器内的 MMU 有何不同? MMU 的工作是将虚拟地址转换为物理地址(除其他外)并将该物理地址发送到内存 Controller ,内存 Contro
如果我们可以在不使用 mmu 的情况下访问一些 block 内存,而使用 mmu 访问其他内存,则可以获得良好的性能提升。我已经阅读了 intelx86_64 手册,却发现这个任务似乎是不可能的...
所以,对于内核驱动程序,我是一个新手,并且对 ioremap 函数有疑问。 我正在编写一个驱动程序,用于访问在具有 ARM Cortex-M3 和 FPGA 结构的 SoC 上的自定义 VHDL 模块
在 ARM Linux 中,正是在哪个点启用了 mmu。即,在哪个文件中(汇编文件或arch/arm/kernel/setup.c中的paging_init()) ARM linux是否支持不分页运行
我发现 kvm 将 tdp_mmu 更改为默认启用 https://lore.kernel.org/lkml/20210726163106.1433600-1-pbonzini@redhat.com/
这是引用自 ARM ARM® Cortex™-A 系列,版本:4.0,程序员指南,第 9-1 页。 “MMU 使任务或应用程序能够以一种不需要知道系统的物理内存映射或可能同时运行的其他程序的方式编写。
简而言之,我想关闭 Linux 上下文(从内核内部)中的所有 MMU(和缓存)操作,用于调试目的,只是为了运行一些测试。明确地说,我不希望我的系统在那之后仍然可以正常工作。 关于我的设置:我目前正在摆
我是一名优秀的程序员,十分优秀!