问题标签 [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.
c - copy_to_user 使用 linux 内核页表失败
我正在Linux内核中编写一个系统调用,它给出了一个虚拟地址和一个无符号长指针,找到相应的页表条目,然后将其内容复制到无符号长指针中。这是系统调用:
这是调用系统调用的测试程序:
目前对 copy_to_user 的调用失败,返回值为 8,这意味着它没有将 kernel_pte 复制到 pte。我用 access_ok 检查了 pte 的 VERIFY_WRITE,它返回 1。但是,用 VERIFY_READ 在 kernel_pte 上调用的 acces_ok 返回 0。我不确定这是否是导致 copy_to_user 失败的原因,但查看 copy_to_user 的源代码看起来它只再次检查用户指针。所以我有点茫然为什么通话失败了。
linux - linux分页,使用很多页表目录
我读了 Mel Gorman 关于 Linux 虚拟内存的书。我读过,Linux 支持 3 级页表:PGD、PMD 和 PTE。如果我在较新版本的内核中没有记错的话,有四个页表级别:PUD,但这没关系。我有一个合理的问题。为什么 Linux 开发人员选择 3(或 4)级页表而不是使用一个?仅使用一个全局页表(我的意思是每个进程的全局页表)将减少内存引用量。
请原谅我的英语。
linux - Where is the src code point where Linux kernel establish mapping virtual-physical address?
As I know, when program try to access virtual address that the corresponding PTE is NO present , kernel will trigger page fault and page fault handler will handle it.
In handler, if fault is caused by no physical mapping to the PTE, kernel should allocate free physical page and write physical address to PTE.
I found many functions like __handle_mm_fault
or handle_pte_fault
, but I cannot find the location where kernel actually allocate physical page. Could anyone give some suggestion?
Thanks.
memory-management - 三级页表中的页条目
我发现了这个问题,但我不知道如何解决它。
您正在为新处理器设计内存管理单元 (MMU)。处理器的字长为 64 位,指针也为 64 位。设计的以下部分已经确定:
• MMU 将支持 32kB 的页面大小。
• 它将使用 3 级分层页表执行地址转换。
• 与x86 机器一样,页表任何级别的每个单独的表都占用一个物理内存页。第 3 级是根表,包含保存第 2 级表的物理地址的条目。2 级表条目同样指向 1 级表,1 级表条目指向物理页或帧。
• 所有页表条目的大小均为 64 位。
• 物理地址空间的大小限制为 52 位(4096 TB),目前应该足够了。
这个问题的其余部分是关于这些设计决策的后果。
问题:每个单独的页表页面中有多少条目?展示你的工作。
经过一番阅读,我发现给定页面大小P=2^p
和虚拟地址大小n
,我们有一个虚拟页面偏移(VPO)p
位和虚拟页面(n-p)
位数。这样一来,1 级页表中的 PTE 数量为:
在一个k
级别的页表中,我需要将 VPN 拆分为k
不同的 VPN,据我了解,它们的长度都是相同的(n-p)/k
。这意味着每个单独页表中的 PTE 数量为2^((n-p)/k)
.
现在,就我而言,我有P = 32kB = 2^15
. 这给了我一个 15 位的 VPO。我缺少的是虚拟地址大小n
。
我知道字和指针大小是 64 位。
我是否正确假设虚拟地址是 64 位宽?在这种情况下,我会得到49/3
-bit VPN,但49
不能被3
.
c - 当 2 个程序映射同一个文件时 mmap 是如何工作的
我试图mmap
在查看man mmap时了解其工作原理。
据我了解,它向页表添加了一个映射,该映射在文件和虚拟地址之间进行映射(这是给定的地址void *addr
)
那么,当两个程序映射同一个文件时会发生什么?页表中是否有 2 个条目,每个程序一个?
linux-kernel - ARM Linux:PTE 不可写但脏
我知道 ARM 架构通过在页面错误处理程序中设置它们来模拟 Linux 的年轻和脏标志,如此处所述。但最近对于一个小型二进制文件,我观察到其中一个匿名段中的 Linux PTE 被设置为不可写和脏。观察到以下 Linux PTE 状态:
我找不到这种 PTE 标志组合的解释。内核是否为特殊的匿名 VMA 段设置了这种组合?这种组合意味着什么?任何指针都会有所帮助。提前致谢。
memory - 三级页表的大小
我们有疑问:
计算页面大小为 4kB 的 32 位机器的单个 3 级页表的最大和最小大小。在这个 3 级 pge 表中表示虚拟页面的 20 位的分区是:(7、7,无论剩余的位)。
我知道最小尺寸应该是 4k+4k+4k=12k 因为一个进程需要至少为自己分配一个帧。但是我对如何计算最大值感到困惑。它适用于 2 级页表,因为我们可以将 20 位分成 10 和 10,这很好地适用于 1024 个条目 * 每个 4 字节,这是 4k 的一个很好的因子。但是对于 2^7 整数,我们得到一个奇怪的数字,有什么解决方法的想法吗?谢谢。
memory-management - 扩展页表/嵌套分页:防止访客 PTE 更新中的陷阱
所以我研究了英特尔虚拟化扩展中的 EPT。我知道,对于影子页表,VMM 必须对硬件可访问的影子 PT 进行写保护,这样每当来宾尝试写入 PT 时,它就会陷入 VMM。这种基于软件的页表管理是一个巨大的开销,应该通过 EPT/嵌套分页来解决。
但是嵌套分页是如何解决这个问题的呢?在这种情况下,我们有 2 个单独的翻译:Guest VA 到 Guest PA(即主机 VA),以及 Host VA 到主机(机器)PA。据称,访客管理的页表的访客更新不需要陷阱。这是不连贯的:如果来宾更改了 GVA->GPA 映射,那么新的 GPA 映射不应该也反映在 HVA 中吗?换句话说,guest 管理的页表中的每个更改不应该也反映在 VMM 管理的页表中吗?我们似乎有同样的问题。EPT的引入解决了什么问题?
谢谢。
memory - 计算表条目大小
我有一个这样的问题,需要计算表格条目的大小。
Microsoft Windows 98 使用 32 位内存地址空间,而默认页面大小为 4KB。如果它的物理内存为 256MB
i) 页表中条目的大小是多少?
这是否等于页面偏移量?
x86-64 - x86_64 是否与 aarch64 at 指令等效?
ARM 的 aarch64 有一条 AT(地址转换)指令,该指令通过地址转换阶段运行虚拟地址,返回 PAR_EL1 中的物理地址,以及指示转换是否存在的状态。请参阅 ARMv8 ARM,第 C5.5 节。
问题是:x86_64 是否有等价物?Intel 的系统编程指南(第 3 卷,第 5 章)谈到了指针验证,但这些方法似乎适用于段级保护,并且似乎没有任何页级保护指针验证指令。
有人知道 x86_64 的类似 ARMv8-AT 的指令吗?