问题标签 [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 - Linux页表
在 Linux 中,有 pgd_offset、pmd_offset 和 pte_offset 等函数用于对 pgd、pmd 和 pte 进行索引。谁调用这些函数?MMU 是否使用这些函数来遍历页表?
我的理解是linux内核为每个进程创建一个页表,并将页表的基地址传递给页表基址寄存器,这样MMU就可以访问它。之后MMU如何读取页表?如果 MMU 是读取页表的那个,谁会使用那些 pgd_offset 等函数?
operating-system - 我对虚拟地址和物理地址之间关系的理解是否正确?
我一直在研究(在 SO 和其他地方)虚拟地址和物理地址之间的关系。如果有人能确认我对这个概念的理解是否正确,我将不胜感激。
页表被归类为“虚拟空间”,并包含每个页面的虚拟地址。然后它映射到“物理空间”,其中包含每个页面的物理地址。
让我的解释更清楚的维基百科图表:
我对这个概念的理解正确吗?
谢谢你。
linux - 为什么 kmalloc() 比 vmalloc() 更高效?
我认为kmalloc()
在内核中分配连续的物理页面是因为虚拟内存空间直接映射到物理内存空间,只需添加一个偏移量。
但是,我仍然不明白为什么它比vmalloc()
. 它仍然需要通过页表(内核页表),对吧?因为当进程切换到内核时,MMU 没有被禁用。那么为什么Linux直接将内核虚拟空间映射到物理内存呢?有什么好处?
中include/asm-x86/page_32.h
,有:
为什么内核需要计算物理地址?无论如何,它必须使用虚拟地址来访问内存,对吧?我无法弄清楚为什么需要物理地址。
memory - 地址的大小与条目的数量、总条目的大小或两者都有关系吗?
如果虚拟内存有 32 位地址,是否有 2^32 个条目,或者总条目的大小是 2^32 字节?或两者?
我问的原因是因为我认为它只意味着 2^32 个整数。
完成以下问题后,我不确定:
- 假设一台机器有 48 位虚拟地址和 32 位物理地址。如果页面是 4KiB,如果它只有一个级别,那么页表中有多少条目?
解决方案:2^48/2^32 = 2^16 页。
但是,条目数/页面大小!= 页数。
总条目大小/页面大小=页数。
所以,我想知道 32 位地址是否意味着有 2^32 个条目,或者总条目是否等于 2^32 个字节或两者兼而有之。
linux - 属于已打开文件的内存页是否作为 vm_area_struct 进行管理?
由于我只有第一版:Understanding the Linux Kernel,所以看了一些Linux 2.2.14的源码,很老了。
从源代码来看,我认为属于进程通过 open() 系统调用打开的文件的内存页面不受进程的 vm_area_struct 列表管理。此外,内核似乎只在必要时交换所选进程的 vm_area_struct 列表中的页面。
我知道交换意味着内核将一些页面放入交换区域,并且文件页面无法交换。但是,内核仍然可以写回任何脏数据并取消链接文件页面以获取一些空闲页面。所以我的问题是,为什么内核也不尝试释放一些属于打开文件的页面?
或者我的理解,例如文件页面不是由进程的 vm_area_struct 列表管理的,是完全错误的吗?
page-tables - Effective Access Time
I am given the following question:
Now assume the system has no page faults, we are considering adding a TLB that will take 1 nano-second to lookup an address translation. What hit rate (to the nearest 5%) in the TLB is required to reduce the effective access time to memory by a factor of 2.5?
I am told an average memory access takes 100ns. Since there are 4 memory accesses for a 3 level PT (3 for the page table 1 for physical memory) I deduced that it takes 400ns.
I am then asked to reduce that by a factor of 2.5. So (2/5) *400 = 160ns.
my goal EAT is 160ns. I started setting up the problem and I can't figure out where to go from here.
I am given the following solution but I am just unable to follow it:
Access time = 100 X + (1-x) 400 – 100 ns for hit (read memory), 400ns for miss 160 = 100 x + 400 – 400x -> x = .8 -> 80% TLB hit rate
Can someone explain to me how they got to this step? I thought EAT was p(time it takes for a hit) + 1-p(time it takes for a miss) where p is the hit rate. isn't the time it takes for a hit 300ns? and then time it takes for a miss is 400ns?
from my logic I tried: p(300) + ((1-p) (400)) but when I went to compute it, I did not get the correct setup as the solution. Can someone explain where my logic is going wrong? Am I wrong about how many memory accesses a hit takes?
virtual-memory - 一个进程可以有超过 1 个页表吗?
我在测验中被问到一个问题“进程大小为 2^6+^2^12+2^23 字节,系统总内存大小为 4GB 页大小为 4k,有多少页表有多少页目录和页?假设最初所有内存都是空闲的?如何解决这个问题?
windows - 进程的页表是否映射到内核地址空间?
我正在做 Windows 系统编程,想知道我是否可以在源代码级别访问进程的页表。
这是我对与虚拟内存相关的页表的了解。
假设用户只是在 Windows 操作系统(32 位)上运行一个名为“A”进程的进程。
首先,操作系统为A进程创建并维护4GB的虚拟地址空间。
(其中 2GB 是内核地址空间,另外 2GB 是用户地址空间。
用户地址空间中的任何代码都不能直接访问内核地址空间。)
然后,操作系统在物理内存中为A进程创建并维护一个页表,将虚拟内存地址映射到物理内存地址。
这是我的问题。
OS为A进程创建页表后,该页表是否映射到A的内核地址空间,以便用户可以从源代码间接访问页表?
或者页表没有映射到 A 的任何虚拟地址空间,而只是驻留在物理内存中,因此用户无法访问页表?
x86 - x86-64 页表全局位
此设置中的每个 PTE(页表条目)都有一个 G 位(G = Global),它控制此条目映射的物理页的范围。
如果设置了 G 位,则该条目对所有进程都是全局的,并且它们都可以访问它映射的物理页面,但受其他访问权限的限制。如果 G 位为零,则该条目不是全局的,而是进程私有的。[内核为其页面设置 G 位,但通过禁用其页面上的 U 位(U = 用户模式)来防止用户模式访问。]
如果在用户模式 PTE 上设置 G 位 - 设置了 U 位的那个 - 这不是安全漏洞,因为系统上的每个进程现在都可以访问 PTE 映射的页面吗?
我错过了什么吗?有没有办法在用户模式 PTE 上设置 G 位,但仅在一组受信任进程而不是系统上的所有进程中使其成为全局?我们可以在 PTE 中同时设置 G 和 U 位吗?
memory-management - 计算分页和偏移量以及页表大小的内存地址大小。
这个问题主要是为了澄清我的理解。
假设我有一台 32 位计算机,虚拟内存空间为2^32 字节。
使用内存分页,每页为2^8 字节。
所以内存地址大小是24 位。由于(2^32/2^8 = 2^24 字节)。
偏移量是8 位?这个我不太明白。因为我知道总地址是32,并且 24 已经被页面占用,所以余数是8的偏移量。
最后是页面大小。如果每个物理内存地址以32 位(4 字节)存储,则表大小将为2^26 (2^24 * 2^2)。这个对吗?