问题标签 [mmu]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
35816 浏览

linux - 理解 pmap 输出

我试图使用pmap -x命令查看 Linux x86-64 上进程的内存映射。我对 pmap 的输出感到困惑。特别是对于映射动态库的条目。它们有多个条目(实际上大多数都是 4 个条目,有些有 3 个条目)。下面是一个例子

每个库的第二行的大小始终为 2MB,但没有页面权限。在所有图书馆中,它的 RSS 似乎总是为零。最后两行也具有相同的大小(这是基本页面大小)和相同的权限(少数库没有 rw 映射)。

有人对此有什么解释吗?我有一种感觉,可能具有只读保护的映射是由加载器完成的,以读取库的元数据,而具有可执行权限的部分实际上是库的代码。不过我可能是错的。

但我对中间那一排一无所知。没有权限也没有用途?有人在这里有一些智慧的话吗?

我还看到有几页报告在匿名内存上,并且没有设置任何模式位。这些代表什么?

0 投票
1 回答
1209 浏览

io - IOMMU 仿真并使用 QEMU 安装

现在,我需要使用一些包来模拟 IOMMU(它类似于 MMU),并且我得到了一些关于它的源,但我不知道如何使用它们。

http://www.spinics.net/lists/kvm/msg38514.html这是一个模拟IOMMU的源链接

http://repo.or.cz/w/qemu-kvm/amd-iommu.git这是此仿真下载文件的链接

我的问题是如何使用qemu来做到这一点,下载列表中有很多文件,我不知道如何使用它们......

感谢您的帮助,非常感谢!!!如果你知道一些细节,请告诉我

0 投票
7 回答
11791 浏览

multithreading - 多核 CPU 是否共享 MMU 和页表?

在单核计算机上,一次执行一个线程。在每次上下文切换时,调度程序都会检查要调度的新线程是否与前一个线程在同一进程中。如果是这样,则无需对 MMU(页表)进行任何操作。在另一种情况下,需要使用新的进程页表来更新页表。

我想知道在多核计算机上是如何发生的。我猜每个核心上都有一个专用的MMU,如果同一进程的两个线程同时在2个核心上运行,那么这个核心的每个MMU都只是引用同一个页表。这是真的 ?你能指出我关于这个主题的好的参考吗?

0 投票
1 回答
1725 浏览

linux - 各种操作模式下的 ARM MMU 操作

在我提出问题之前,我将提出与该主题相关的理解,

  1. Linux 内核模式对应于ARM 管理员模式
  2. Linux 用户模式对应于ARM 用户模式
  3. 内核模式(启用 MMU)中,Linux 使用相对地址而不是物理地址。即,物理地址 = 相对地址 - PAGE_OFFSET + PHYS_OFFSET
  4. 用户模式(启用 MMU)中,Linux 使用虚拟地址而不是物理地址。即,物理地址 = 使用 pte 、 pmd 、 pgd 的 MMU 转换(虚拟地址)

问题:

  1. 是否在主管模式下启用了 MMU(用于内核地址)。

  2. 如果启用,那么这是否意味着相同的 MMU 在翻译主管模式和用户模式时以不同的方式运行。

  3. 如果 MMU 在不同的模式下以不同的方式发挥作用,请给我指点一下 mmu 的功能是如何在各种模式下发挥作用的。

提前致谢。

0 投票
3 回答
2831 浏览

linux - 在 Linux 中启用 MMU

  1. 在 ARM Linux 中,正是在哪一点启用了 mmu。即,在哪个文件中(arch/arm/kernel/setup.c 中的程序集文件或 paging_init())

  2. ARM linux 是否支持在不分页的情况下运行。

提前致谢。

0 投票
1 回答
571 浏览

memory - 虚拟地址是如何翻译的?

我了解(对于英特尔)虚拟地址转换过程是:

1.传入的虚拟地址分为页表号、页号、偏移量。

2. CPU 中的进程描述符基址寄存器(PDBR)告诉目录从哪里开始。

3.页表号乘以4作为到目录的偏移量,并查找目录条目。

4.目录条目包含页表的地址,以及有效性和保护信息。如果此信息表明内存中不存在页表或保护不正确,则转换停止并引发异常。

5.页号乘以四作为页表的偏移量,并查找页表条目。

6.页表项包含页的地址、有效性和保护信息。如果此信息表明该页面不存在于内存中或保护不正确,则翻译停止并引发异常。

7.偏移量用作页面的索引。

8.数据在最后到达的地址。

直到第 6 步,我才感到困惑,因为表条目格式只为物理页框地址指定20 位,这意味着它最多只能访问1 兆字节,或者它是左移 12 位(乘以 4096 : 页面大小) 能够访问4 GB

0 投票
1 回答
3096 浏览

linux-kernel - Linux(x86-64)中的多个大页面大小?

x86-64 上的 Linux 是否支持多个大页面大小(例如,超过 4KB 基本页面大小的 2MB 和 1GB 页面大小)?如果是,有没有办法为给定的分配指定使用哪个大页面大小?换句话说,我的问题是在执行此操作时是否使用“MAP_HUGETLB”标志mmap()将它们映射到默认大小的大页面。无论如何请求分配映射到非默认的大页面大小?

0 投票
0 回答
797 浏览

gcc - str 和 ldr 指令不使用相同的地址

我有一个奇怪的问题,MMU 将内存转换为 str 而不是 ldr 指令。我正在为 arm7TDMI 使用 gcc(无优化)进行编译。

程序输入一个函数并在堆栈中存储 4 个参数(r0 到 r3)我有这些寄存器:

MMU 处于活动状态,并且 0x0 和 0x00FFFFFF 之间的所有内容在物理上位于 0xC0000000 和 0xC0FFFFFF 之间

电脑执行这 4 行汇编:

这是内存的范围,执行后数据存储在其中:

而这个内存范围是在FF

我们看到,由于 MMU,数据物理存储在 0xC0000000 区域中。

因为我处于调试模式,所以我可以使用以下值手动更改此区域:

现在 2-3 组装执行后,我有这条组装线:

我执行这一行,我在 r3 中有这个值:

(如果我不更改 0x0012ADC0 和 0x0012ADCC 之间的内存,我通常会得到 0xFFFFFFFF ...)

我真的不明白为什么 r3 不等于 0x1E10C8。这就像MMU在执行str命令时完成了它的工作,但是当执行ldr时,MMU没有翻译地址(0x0012ADCC而不是0xC012ADCC)。这里有一些我无法理解的东西。

以防万一,这里是所涉及的汇编指令的快照:

如果这与我的编译标志有任何关系,它们是:

任何帮助将不胜感激!!

0 投票
3 回答
1057 浏览

c++ - uClinux中的动态分配

我是嵌入式开发的新手,我发现传统 Linux 和 uClinux 之间的最大区别是 uClinux 缺少 MMU。

这篇文章

如果没有 VM,每个进程都必须位于内存中可以运行的位置。在最简单的情况下,这个内存区域必须是连续的。一般来说,它不能扩展,因为它上面和下面可能还有其他进程。这意味着 uClinux 中的进程无法像传统 Linux 进程那样在运行时增加其可用内存的大小。

对我来说,这听起来像是所有数据都必须驻留在堆栈上,而且堆分配是不可能的,这意味着 malloc() 和/或“new”是不可能的……这准确吗?也许有允许管理“静态堆”(即可以请求“动态”分配的基于堆栈的区域)的技术/库?

还是我想多了?还是过度简化?

0 投票
1 回答
211 浏览

c - 设置受边界保护的数组

我想分配一个数组并将其设置为使其前后的页面受到内存管理单元的保护,因此将自动捕获超出数组边界的尝试;然后捕获它以便以受控方式处理错误。

我怀疑会有一个可移植的解决方案,但是分别在 Windows 上使用 Microsoft C 和在 Linux 上使用 GCC 的最佳平台特定方法是什么?