Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly ARM MMU禁用4KB_Assembly_Arm_Mmu - Fatal编程技术网

Assembly ARM MMU禁用4KB

Assembly ARM MMU禁用4KB,assembly,arm,mmu,Assembly,Arm,Mmu,我希望在ARMv7体系结构的引导程序(裸机)期间禁用MMU。 我读了这篇文章,无意中发现了这一点 “当MMU被禁用时,如果满足以下条件之一,则可以提取指令: •该指令与正在运行的指令位于相同的4KB内存块中(与4KB对齐) 程序的简单顺序执行所需,或在4KB内存块中 紧接着这样一个街区 •该指令位于同一个4KB内存块中(与4KB对齐),该内存块中有一条指令 之前,在禁用MMU的情况下,程序的简单顺序执行需要, 或者在紧接该块之后的4KB块中。” 有谁愿意解密并向我解释如何确保指令彼此相邻在4KB

我希望在ARMv7体系结构的引导程序(裸机)期间禁用MMU。 我读了这篇文章,无意中发现了这一点

“当MMU被禁用时,如果满足以下条件之一,则可以提取指令:

•该指令与正在运行的指令位于相同的4KB内存块中(与4KB对齐) 程序的简单顺序执行所需,或在4KB内存块中 紧接着这样一个街区

•该指令位于同一个4KB内存块中(与4KB对齐),该内存块中有一条指令 之前,在禁用MMU的情况下,程序的简单顺序执行需要, 或者在紧接该块之后的4KB块中。”

有谁愿意解密并向我解释如何确保指令彼此相邻在4KB/8KB范围内?(这就是我对这些语句的理解。)

我认为这意味着你不能向前跳转超过(8千磅减去当前页面偏移量),也不能向后跳转到上一个4千磅的页面。基本上:线性程序流是可以的,向前跳跃大约4kib;向后跳转(和循环)只有在保证不会跨页时才可以

如果您使用C,您可能会教您的C编译器使用短跳转模型;如果您直接使用汇编,这是相当容易做到的。还可以使用链接器脚本或直接转换为二进制输出格式,以确保加载的内存地址与开发过程中加载的内存地址相匹配

许多汇编器支持对跳转进行偏移计算。您还可以生成所有符号的链接图,然后分析您的跳转是否过大


当然,看看BSD和Linux是如何做到这一点的可能会很有用。我想他们只是快速地启用MMU,并在那之前使用很少的手工编写的代码。

如果您添加了上下文的其余部分,那么您就会看到这一点

不管怎样,这些访问都可能是由推测性指令获取引起的 是否为提交预取指令 执行

注 为了确保体系结构遵从性,软件必须确保 以下各项适用:

禁用MMU时将执行的指令如下: 位于仅包含内存的4KB地址空间块中 这是对投机访问的容忍

紧接其后的每个4KB地址空间块 一种4KB的块,用于保存MMU启动时将执行的指令 disabled还只包含允许推测的内存 访问

他们所说的只是分支预测器可能在哪里拉指令,不管是否使用。因此,如果您关闭了MMU,并且正在接近ram末端执行,并且内存控制器将不允许读取(获取)超过ram末端。那你可能会有问题。要么不要运行关闭的代码,要么将内存控制器更改为更宽容,要么打开mmu并容忍其细微差别,不管它们是什么。(在mmu打开的情况下,您可以更容易地将下一个块映射到其他ram,因为您知道您实际上不会在那里执行,而只是作为分支预测器的一个pad)


你们如何投保?简单地告诉你的链接器不要把代码放在那里,如果.text太近,它会发出警告和/或失败。

我真的不明白:-(.我的迷你系统由64KB的ROM组成(我的程序运行的地方)只有16KB的sram。分支预测关闭。是否可以关闭预处理?这是一个有点难读的文本…你需要关闭预处理吗,也就是说?如果你的ROM和sram允许推测性访问,你不需要做任何事情。我想现在的问题是CPU可以(尝试)读取由I/O空间支持或完全不由内存支持的地址,并且当MMU被禁用时,不使用正常的页面错误机制,因此这可能会使系统进入异常状态。可能会提前启用MMU(在ROM的前4K或8K内)可能吗?只要阅读手册,问题与正在运行的代码附近的推测性读取有关,如果您的内存系统无法容忍这些读取,那么您的系统将失败。理想情况下,这是一个芯片设计问题而不是软件问题,但这取决于硅工程师。您当然可以测试它或者让代码远离不愉快的内存空间。通常情况下,堆栈位于ram的顶端,数据可能位于rom的顶端,因此通常不会出现问题。我将继续,因为“应该没有问题”,但请不要回答这个问题。谢谢你的有用评论!arm文档会回答你的问题,我不理解这个问题。我一理解我试图解决的问题,就会研究短跳跃模型等。仅从文本很难理解限制。@dwelch dwelch可能走对了路啊,是的,他从一个完全不同的角度来看:CPU通过预取等方式对内存(控制器)施加约束,因此系统设计者必须使他们的系统能够支持CPU的这种操作模式。这是有道理的。这与我所做的解读不同,但由于上下文的关系,这听起来确实有道理。