问题标签 [page-tables]
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.
linux-kernel - 驱动mmap操作页表创建
我试图了解驱动程序中的 mmap 操作。我知道我们为什么要做 mmap。我对以下两种 mmap 实现感到困惑:
和
第一个例子是一个简单的实现,它不修改页表......但第二个例子。
那么第二种方法的基本原理是什么。第一个示例也可以正常工作。
virtual-memory - 为什么有一个大页表不好?
在我的讲师关于虚拟内存的幻灯片中,他写道,拥有大页表是一个问题,为什么会这样?
memory - 如果只使用一半,多级页表是否存储整个页表?
想象一下,我有一个包含 1024 个条目的 2 级页表。考虑到只使用了 3 个 2 级页表,其中一个是半空的,所以我有一个包含三个条目的顶级页表。
现在,我的页表系统在我的 RAM 中占用了多少内存?
我必须存储每页 4 页1024 * 32bits = 4kBytes
,还是只允许存储我使用的内容?(3 + 1024 * 2 + 1024 * (1/2)) * 32
只有位?
memory - 计算 2 级页表的大小
所以我有页大小4kb
、32
位地址 CPU 和一个实现的 2 级页表。
我想存储1081页,所以我需要:
1024
二级页表中的条目57
另一个二级页表中的条目2
包含条目的顶级页表。
现在,我需要在内存中存储这些页表的全部大小还是它们占用的内容?
- 在第一种情况下,我会使用
4bytes * 2 + 4bytes * 1024 + 4bytes * 57
- 否则会是
1 * 4bytes * 1024 + 2 * 4bytes * 1024
有什么提示吗?
virtual-address-space - 计算每个级别的 2 级页表位和页表项
- 一级页表正好占用一页内存
- 32位虚拟地址
- 页面大小 8kb
- PTE 4 字节
每个字段有多少位?
1 级表中有多少条目?
2 级表中有多少条目?
2级页表映射多少页?
我尝试得到 13 的偏移量和 11 的水平 1 和 8 的水平 2。不知道如何解决其余的问题。
operating-system - 如何确定页表中有多少条目
假设我的系统使用 32 位地址空间,每个条目为 32 位,每页为 8 KB。页表将包含多少个不同的条目?
我的逻辑:32 位地址空间意味着 2^32 个总地址,因此 2^37 个总位。每页 8 KB 意味着每页总共 2^16 位。因此,页表中将有 2^37 / 2^16 = 2^21 个条目。
这个对吗?
linux - 在可执行文件上使用 mmap() 时如何工作?
我正在开发 Ubuntu 14.04 LTS。
- 有两个文件:
file1.c
和file2.c
- 它们分别被编译成
exec1
和exec2
。file2.c
使用静态库中的函数。
exec1
使用 .映射exec2
到它的虚拟地址空间mmap
。以下行来自file1.c
:
发生以下一系列事件:
exec1
被执行。exec1
映射exec2
到它的虚拟地址空间(这里到底发生了什么?)exec2
被执行(在这个阶段,exec1
一直在后台运行。现在到底发生了什么?)
PS:我想知道当exec2
它在磁盘上并且它是mmap
由 ed时会发生什么exec1
?虚拟地址空间和对应的页表是如何exec1
变化的?
接下来,当exec2
实际执行时,它被带到主存中。事情如何变化?内存中使用的静态库函数在file2.c
哪里?我对这个过程没有一个清晰的概念。任何人都可以阐明这个话题吗?
operating-system - 确定地址和页表大小
我知道这个问题已经被问过很多次了,但我仍然觉得我很挣扎。
我需要确定物理地址和虚拟地址的外观以及计算页表大小。
我不确定我所拥有的是否正确,但这是我目前所拥有的:
页条目数为2^20/2^10=2^10
如何计算页表大小?我很困惑,因为每个 PTE 都有虚拟地址和物理地址。它会是页面条目数*(物理地址+虚拟地址)吗?如果我设置了当前位,会有什么不同?
operating-system - 操作系统在驱逐受害者页面时如何更新适当的页表?
在使用虚拟内存的操作系统中,每个进程都有一个页表。每个页表将进程的虚拟内存页映射到系统的物理内存页,并指示给定页当前是否有效(加载到内存中)。
假设内存运行不足,操作系统需要选择一个页面从物理内存中逐出。为此有不同的算法。例如,先进先出、LRU。一旦操作系统选择要驱逐的页面,它如何使对该页面的任何现有引用无效?
如果活动进程当前正在使用受害页面,则操作系统必须使当前进程的页表中的映射无效。如果受害者页面当前被另一个进程使用,操作系统必须使其他进程的页表中的映射无效。无论如何,操作系统如何确定要更新哪个页表(如果有),以及它如何知道映射在该页表中的位置而不进行线性搜索?
从本演示文稿的幻灯片 22 开始,详细描述了 x86 页表结构:
http://www.scs.stanford.edu/12au-cs140/notes/l8.pdf
我还发现了一些有用的虚拟内存概述:
http://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/9_VirtualMemory.html http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Memory/virtual.html
没有答案的类似 Stack Overflow 问题:
operating-system - 特定的 MMU 可以使用 32 位和 64 位虚拟地址吗?
当一个新进程启动时,操作系统使用进程的页表初始化 MMU 的寄存器。虚拟地址转换 MMU 获得一个虚拟地址,将其传递给比较器并获得物理地址(如果我弄错了,请纠正我)。因此,如果页表是硬件的一部分,那么单个 MMU 如何与 32 位和 64 位操作系统一起工作。我的意思是,如果它被编程为获得 32 位虚拟地址,那么当它获得 64 位虚拟地址时它是如何工作的。
谢谢。