问题标签 [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.
memory - 确定虚拟内存的页表大小
考虑一个具有 38 位虚拟字节地址、1KB 页面和 512 MB 物理内存的虚拟内存系统。这台机器上每个进程的页表总大小是多少,假设有效位、保护位、脏位和使用位总共占用 4 位,并且所有虚拟页都在使用中?(假设磁盘地址没有存储在页表中。)
virtualization - 硬件虚拟化 - 管理程序查询
每当客户操作系统的客户页表发生更改时,管理程序将如何反映更改。访客页面映射和影子页面映射之间的对应关系如何保持?
一种方法是写保护内存地址。每当将写入来宾页表时,都会有一个适当的处理程序来确保对影子页表的相应更改。我可以在这方面有更多的投入吗?
memory-management - 每个进程都有自己的页表吗?
每个进程都有自己的页表,还是只是将其页条目添加到一个大页表中?
operating-system - 分页:基本、分层、散列和倒置
关于操作系统和页表,分页和页表似乎有 4 种通用方法
Basic - 存储页码和偏移量的单页表
分层 - 将虚拟地址分成多个部分的多层表
散列 - 散列页表,通常可能包含映射到同一条目的多个散列
反转 - 逻辑地址还包括 PID、页码和偏移量。然后使用 PID 查找表中的页面,并将表中的行数添加到偏移量以查找主内存的物理地址。(粗略的,可能很糟糕的定义)
我只是想知道每种方法的优缺点是什么?看起来基本是更简单的方法,但也可能会占用更多内存空间以获得更大的地址空间。还有什么?
windows - Windows 内存工作 - 页表和数据
我试图理解以下内容:
我知道页表是由虚拟内存管理器在某些时候为虚拟内存和物理内存之间的转换而构建的。由于系统上运行着许多进程,即使一次只有进程处于活动状态,我想知道是否在任何时间点将非活动进程的页表移动到页面文件?鉴于较低的 2 GB 区域是为 Windows 保留的,因此 Windows 会为系统上的所有进程保留页表是有道理的。尽管如果切换当前进程,将它们移动到页面文件也有意义吗?
可写(数据)页面也是如此。windows会将所有进程的所有数据页保留在内存中还是在某个时候将它们移动到页面文件中。在我的机器上,任务管理器说正在使用 3 GB 中的 1.5 GB RAM,而 1.5 是性能选项卡中的系统缓存,所以我的理解是所有应用程序的数据都保留在物理内存中。但是有时间它需要移动到页面文件吗?
assembly - x86 cr3 和 linux swqpper_pg_dir
在 Linux 源代码(版本 2.6.18)中:
还有load_cr3(pgdir)
andwrite_cr3(x)
宏:
似乎整个cr3
控制寄存器都存储了Page Directory的地址。但是,当我参考 intel ia-32 Developer's_Manual 时,它讲述了一个不同的故事。以下是英特尔手册的内容:
手册说 20 个最高有效位cr3
存储页面目录的地址而不是整个cr3
寄存器。这也是合理的,因为页面目录正好是 4kb,所以地址的 12 个最低有效位始终为零。
是不是有点奇怪?linux 代码只是将页面目录的地址分配给 .cr3
而不是swapper_pg_dir
. 寄存器存储的究竟是什么cr3
,地址或英特尔手册建议的格式?
以下链接是英特尔手册: http: //www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
virtual-machine - 影子页表(用于 VMM)究竟是做什么的?
我的理解是影子页表消除了在虚拟机内部模拟物理内存的需要。
IE。
代替:
客户操作系统 -> VMM + 虚拟物理内存 -> 主机操作系统 -> 主机硬件
只是:
客户操作系统 -> VMM -> 主机操作系统 -> 主机硬件
影子页表只允许进程正确访问主机硬件的内存。我也不明白页面错误是如何工作的(或者因为所有物理内存都由主机处理,所以主机会处理页面错误、交换等)。
c - 查找哪些页面不再与写时复制共享
假设我在 Linux 中有一个进程,从中我有fork()
另一个相同的进程。在fork
ing 之后,由于原始进程将开始写入内存,Linux的写时复制机制将赋予该进程唯一的物理内存页,该物理内存页与分叉进程使用的内存页不同。
在执行的某个时刻,我如何知道原始进程的哪些页面已被写入时复制?
我不想使用 SIGSEGV 信号处理程序并在一开始就授予对所有页面的只读访问权限,因为这会导致我不想要的开销。
32-bit - 一台机器有一个 32 位地址和一个 8KB 机器
一台机器有一个 32 位的地址空间和一个 8KB 的页面大小。页表完全在硬件中,每个条目有一个 32 位字。当一个进程被调度时,它的页表会以一个字/100 ns 的速率从内存中复制到硬件中。如果每个进程运行 100 毫秒(包括加载页表的时间),那么用于加载页表的 CPU 时间是多少?
是的; 这是一个家庭作业问题。我调查了一下,到目前为止我发现
页表大小(字节)=条目数*条目大小。因此 x= 32*8192(位) = 262144
我知道这是错误的答案,它是 52;4288ms 我将在后一个方程中使用
加载页表的时间/总时间 = CPU 使用率
在这里发布了一个我不太明白的解决方案。
linux-kernel - 引导期间 Linux 内核空间中的页表
我对 Linux 内核的页表管理感到困惑?
在 Linux 内核空间中,在页表打开之前。内核将运行在具有 1-1 映射机制的虚拟内存中。打开页表后,内核会查询页表以将虚拟地址转换为物理内存地址。问题是:
这时候打开页表后内核空间还是1GB(从0xC0000000-0xFFFFFFFF)?
并且在内核进程的页表中,只映射了 0xC0000000 - 0xFFFFFFFF 范围内的页表条目(PTE)?超出此范围的 PTE 将不会被映射,因为内核代码永远不会跳转到那里?
打开页表前后的映射地址是一样的吗?
例如。开启页表前,虚拟地址0xC00000FF映射到物理地址0x000000FF,开启页表后,上述映射不变。虚拟地址 0xC00000FF 仍然映射到物理地址 0x000000FF。不同的是,打开页表后,CPU 已经查阅页表,将虚拟地址转换为物理地址,而之前不需要这样做。内核空间中的页表是全局的,将在系统中的所有进程(包括用户进程)之间共享?
这种机制在 x86 32bit 和 ARM 中是否相同?