问题标签 [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 投票
1 回答
569 浏览

operating-system - 谁决定页表和页面大小?操作系统还是 MMU?

随着物理内存容量的变化页表的大小也在变化,随着进程数的变化页表大小的变化。究竟是谁决定的?操作系统还是 MMU?如果是操作系统,LINUX 和 Windows 之间有什么区别吗?

0 投票
3 回答
1546 浏览

paging - 什么虚拟TLB?

有谁知道虚拟 TLB 是什么意思,这个 VTLB 和普通 TLB 有什么区别。我在谷歌上找不到明确的答案?

0 投票
1 回答
1398 浏览

arm - linkscript - 不同的链接地址和加载地址

我正在为我的树莓派开发一个玩具操作系统并尝试设置 MMU。我想在 3G:1G 之间分割虚拟内存,所以我认为我的代码应该链接在 0xC0008000,而在执行时加载到 0x8000。(0x8000 是当前引导加载程序期望找到内核的地址——因为它们是为 linux 构建的)。

我认为通过使用 objdump 来设置一切都很好,但它不起作用。在使用 qemu 进行一些调试后,我认为引导加载程序根本找不到我的代码。

我相信问题出在我的链接脚本上,因为如果我将起始代码移动到它自己的部分,该部分既链接又加载在 0x8000 处,内核就可以正常启动。

我已经提取了脚本和最少的代码。如下,

-

(“b loop$”不起作用,因为它是作为“b·c0008000”而不是使用相对分支生成的。但不要介意那部分,问题是它永远不会到达入口)。

这些是仅有的三个源文件。Makefile 中应该没有什么有趣的东西,但是 make 的输出是,

和 objdump,

我开始相信我忽略了一些明显但珍贵的细节。

==== 更新 ====

正如我在下面的回答中所指出的,混淆是由 qemu 中的调试引起的。断点由虚拟地址设置。“b entry”不起作用,因为 gdb 正在考虑虚拟地址,而 MMU 尚未启用并且我们正在通过物理地址运行。

所以在启用 MMU 之前,我们必须使用“b *0x8000”。这会设置一个正确命中的断点。不过 GDB 似乎仍然很困惑,因为它没有显示任何调试信息(没有源代码,如0x00008004 in ?? ())。这不是一个大问题,因为我有“objdump -D”生成的列表。

在启用 MMU 并且我们分支到 main 之后,gdb 可以正常工作。关键是使用绝对分支跳转到虚拟地址。b/bl会发出相对跳跃。所以我用ldr pc =main. bx也可以。

0 投票
1 回答
332 浏览

linux - pkmap_page_table 如何在 kmap 上使用?


pkmap_page_table 有一个内核启动时kmap 的页表指针。
例如,PKMAP_BASE 为 0xFFE00000,FIXADDR_START 为 0xFFF00000,如果内核尝试使用高端内存,则 TTB0 的 PTE 应设置为 0xFFE00000 ~ 0xFFF00000 作为虚拟地址。
那么pkmap_page_table的PTE是如何用来制作地图的呢?
以及如何修改TTB0的PTE与pkmap_page_table的PTE相同?

谢谢你。

0 投票
1 回答
1134 浏览

c - 如何理解虚拟内存?

如何理解句子

我们可以概括并允许每个数据对象具有多个独立的地址,每个地址都从不同的地址空间中选择。这就是虚拟内存的基本思想(《CSAPP》)

为什么数据对象没有唯一地址?

0 投票
1 回答
5404 浏览

arm - 更新 MMU 转换表的正确方法是什么

我在我的 s3c2440 板上启用了 MMU(3G - 4G 内存 :: 故障属性),当我没有读/写 3G - 4G 内存时一切都很好。所以为了测试页面错误向量,我写了一个 0xFF 到3G地址,正如我所料,我从FSR得到了正确的值,所以我在_do_page_fault()中做了这个,步骤是这样的:

然后ISR_dataabort返回,我读取3G地址得到我之前写的0xFF。不幸的是,我再次中止了数据。(我确定我设置的转换表值没问题)

那么更新MMU转换表的正确方法是什么。感谢您的帮助!谢谢

这是我使用的主要代码(仅用于一些测试), (我对 ARM ARCH 有点陌生,所以这段代码可能很紧急)

0 投票
1 回答
7838 浏览

kernel - 内核如何知道虚拟地址空间中的哪些页面对应于一个换出的物理页框?

考虑以下情况:内核已耗尽物理 RAM,需要换出一个页面。它选择最近最少使用的页面框架,并希望将其内容交换到磁盘并将该框架分配给另一个进程。

困扰我的是,这个页面框架通常已经映射到多个进程的几个(相同)页面。内核必须以某种方式找到所有这些进程并将页面标记为已换出。它是如何实现的?

谢谢你。

编辑:问题的插图:

在交换进程 1 和 2 之前有一个共享的 Page 1,它驻留在物理内存帧 1 中:

在此处输入图像描述

现在,系统中的内存已经耗尽,内核通过从第 1 帧换出第 1 页并用第 2 页替换它来为进程 3 分配内存。为了做到这一点,它必须

1)找到所有的进程,参考第1页(在我们的例子中是进程1和进程2)

2) 修改它们的页表条目,将“Present”位设置为 0,并在 Swap 中设置 Page 1 位置

在此处输入图像描述

所以,我不明白第 1 步是如何进行的。内核不能只是迭代地查看每个进程的页表以找到指向第 1 帧的页表条目。应该有某种从页框到页表条目的反向映射。

答案是:

“页表管理最重要和最重要的变化是引入了反向映射 (rmap)。将其称为“rmap”是故意的,因为它是“首字母缩写词”的常见用法,不应与 -rmap 混淆由 Rik van Riel 开发的树,它对股票 VM 进行了更多的更改,而不仅仅是反向映射。

在一个句子中,rmap 授予了定位所有 PTE 的能力,这些 PTE 映射了一个特定的页面,只给定了结构页面。在 2.4 中,找到映射共享页面的所有 PTE(例如内存映射共享库)的唯一方法是线性搜索属于所有进程的所有页表。这太昂贵了,Linux 试图通过使用交换缓存来避免这个问题(参见第 11.4 节)。这意味着对于许多共享页面,Linux 可能不得不换出整个进程,而不管页面年龄和使用模式如何。相反,2.6 有一个与每个结构页面相关联的 PTE 链,可以遍历它以从所有引用它的页表中删除一个页面。通过这种方式,LRU 中的页面可以以智能的方式被换出,而无需求助于交换整个进程。”

来自《了解 Linux 内存管理》,《Linux2.6 的新特性》

0 投票
1 回答
7061 浏览

linux - ARM Linux内核页表

参考。Linux 内核 ARM 转换表库(TTB0 和 TTB1)

我对上一个链接中讨论的主题有疑问/疑问:

  1. 0 到 0xbfffffff 是内存的较低部分(用于用户进程),由 TTB0 中的页表管理,它包含当前进程的页表

    参考。arm/include/asm/pgtable-2level.h : PTRS_PER_PGD =2048, PTRS_PER_PMD =1, PTRS_PER_PTE =512

  2. 0xc0000000 到 0xffffffff 是由 TTBR1 中的页表管理/转换的地址空间的上部(操作系统和内存映射 I/O)。TTB1 表的大小和对齐方式是固定的(到 16k)。每个 1 级条目的大小为 32 位,代表 1MB 页面/段。这是swapper_pg_dir(参考System.map)在实际文本地址下方放置 16K 的页表
  1. swapper_pg_dir = 0 这是(0x0 到 0xbfffffff 用于用户进程)中的第一个 768 条目和从 768 到 1024(0xc0000000 到 0xffffffff 用于操作系统和内存映射 I/O)的有效条目吗?

  2. 有人喜欢在内核空间(内核模块)中分享一些示例代码来浏览这个swapper_pg_dirPGD 吗?

0 投票
2 回答
9123 浏览

linux-kernel - 引导期间 Linux 内核空间中的页表

我对 Linux 内核的页表管理感到困惑?

在 Linux 内核空间中,在页表打开之前。内核将运行在具有 1-1 映射机制的虚拟内存中。打开页表后,内核会查询页表以将虚拟地址转换为物理内存地址。问题是:

  1. 这时候打开页表后内核空间还是1GB(从0xC0000000-0xFFFFFFFF)?

  2. 并且在内核进程的页表中,只映射了 0xC0000000 - 0xFFFFFFFF 范围内的页表条目(PTE)?超出此范围的 PTE 将不会被映射,因为内核代码永远不会跳转到那里?

  3. 打开页表前后的映射地址是一样的吗?

    例如。开启页表前,虚拟地址0xC00000FF映射到物理地址0x000000FF,开启页表后,上述映射不变。虚拟地址 0xC00000FF 仍然映射到物理地址 0x000000FF。不同的是,打开页表后,CPU 已经查阅页表,将虚拟地址转换为物理地址,而之前不需要这样做。

  4. 内核空间中的页表是全局的,将在系统中的所有进程(包括用户进程)之间共享?

  5. 这种机制在 x86 32bit 和 ARM 中是否相同?

0 投票
2 回答
747 浏览

linux-kernel - 内核空间和用户空间的管理页表条目 (PTE) 有何不同?

在 Linux 操作系统中,启用页表后,内核只会将属于内核空间的 PTE 映射一次,而不再重新映射它们?此操作与用户空间中的 PTE 相反,每次进程切换发生时都需要重新映射?

所以,我想知道内核和用户空间中 PTE 管理的区别。

这个问题是问题的扩展部分: 引导期间 Linux 内核空间中的页表