Articles of 分页

页表项中的可执行位在哪里?

这是英特尔架构手册中的一个数字。 在x86 32位页表项中,哪里是指示页面是否可执行的位? 如果不在这里,操作系统如何为exec设置内存权限? 有像mmap函数?

在内核空间中,如何获得与ext4格式磁盘上的文件对应的物理地址

第一次在linux内核这里。 无论如何,我的问题是,如果你在这里: https://github.com/torvalds/linux/blob/master/fs/ext4/file.c#L360 您可以访问ext4_file_mmap函数中的这两个结构: struct file *file, struct vm_area_struct *vma 我正在改变dax模式的这个函数的实现,以便在你调用mmap的时候,页面表被完全填充(看看没有任何pagefaults给了我们多less好的性能)。 到目前为止,我已经完成了以下工作(假设我可以访问ext4_file_mmap可以访问的两个结构): // vm_area_struct defined in /include/linux/mm_types.h : 284 // file defined in /include/linux/fs.h : 848 loff_t file_size = file_inode(file)->i_size; unsigned long start_va = vma->vm_start; 现在,困难在这里。 如何获得与此文件关联的物理地址(块?不知道dax使用块)? 我花了几天的时间盯着linux的源代码,试图理解一些东西,而男孩我是成功的。 任何帮助,暗示,或build议非常感谢! 谢谢! 一些更新:当您在dax模式下dax文件时,您不会将任何内容提取到内存中。 该设备,在这种情况下PMEM,是字节地址,并给DDR的延迟,所以它直接访问(之间没有记忆)。 某些pte导致访问这个PMEM设备,而不是内存。

什么是PML4的简称?

在Xen代码./xen/include/asm-x86/config.h中,我看到的内存布局代码是: /* 137 * Meng: Xen-definitive guide: P81 138 * Memory layout: 139 * 0x0000000000000000 – 0x00007fffffffffff [128TB, 2^47 bytes, PML4:0-255] 140 * Guest-defined use (see below for compatibility mode guests). 141 * 0x0000800000000000 – 0xffff7fffffffffff [16EB] 142 * Inaccessible: current arch only supports 48-bit sign-extended VAs. 143 * 0xffff800000000000 – 0xffff803fffffffff [256GB, 2^38 bytes, […]

虚拟页面和页面框架的区别?

据我所知,页面来自覆盖,这是由虚拟内存生成的内存空间的集群。 但我不明白是什么框架或如何相关。 任何人都可以解释什么页面和框架是如何工作的?

Linux内核中的页面交换

我知道Linux内核具有页面caching来保存最近使用的页面和块。 我知道这有助于节省时间,因为Linux不需要从较低的内存中获取这些块。 当caching中有一些数据块丢失时,Linux会从较低级别的存储器(通过使用submit_bio函数)请求它,并获取块对应的页面。 我想在Linux内核(3.10)中find它在页面caching中检查块是否存在的地方,如果它找不到这个页面,它将从块I / O层带来块。 我在代码中search这样的东西: if( block's page exists in the cache ) return this page else bring the page of the searched block and return it 任何人都可以发布一个链接到内核中做出这个决定的地方吗?

手动标记内存页面为“脏”

在顺序修改Linux上一个巨大的(〜65GB)内存映射文件时,我注意到了以下行为: 如果我修改了文件中的几乎所有内容(我猜每个内存页面至less有一个字节),读/写吞吐量约为40MB / s 如果我只修改了一些页面而不改变其他的页面,那么读/写吞吐量就会大大降低 ,达到大约7MB / s 所以减less事物的数量实际上减less了通过量。 该过程是大量的I / O限制(5%的CPU时间是user ,95%的CPU时间是iowait ),所以实际的处理发生不能解决吞吐量的差异。 我的猜测是,内核分页系统在第一种情况下使用顺序写入,随机写入在后者中写入。 由此产生的频繁寻求会考虑到性能差异。 如果我强制修改每个页面上的数据(例如通过交换一些最低有效位),性能会提高到40MB / s的水平,但这种方法会破坏数据。 有效的NOOP(例如,使用固定模式对页面上的数据进行两次XOR操作对性能没有影响(我使用objdump来validation代码没有被编译器清除)。 我的猜测是,双XOR完全在CPUcaching内处理,而第二个XOR恢复原始数据,所以没有任何变化到达实际的RAM,从而保持底层内存页面的清洁。 那么有没有办法在第二种情况下提高吞吐量? 具体来说,有没有办法使内核回写甚至select干净的页面,或强有力的手动标记页面为脏编程?

页面表总是在内存中? 页表会被换出吗?

我认为页表是由Linux内核维护的,所以页表的内存需求不应该换掉,因为内核没有页面错误的事情。 但是,如果pgd,pmd,pte表全部在主内存中并且从不换出,多级分页的含义不能保存任何内存。 所以我对如何pipe理页表本身感到困惑。

在MIPS(Linux)上获取指向当前转换表的指针

长话短说:我想在MIPS上获取当前进程的第一级转换表的指针。 在x86上,我从CR3得到它。 在ARM上,我使用TTBR来达到这个目的。 如何在MIPS上执行此操作(无需访问当前的task_struct->mm->pgd )? 这里是为什么我需要它的一些阐述。 在QEMU系统模拟器中运行的Linux中,我必须得到一些关于当前进程的信息。 我的代码作为QEMU的一部分运行在主机上。 让我们假设我知道来宾内核结构中的所有相关偏移量。 当guest虚拟机处于内核模式时(如果它不是内核线程),可以通过位于内核堆栈上的thread_info直接获取当前task_struct 。 但是,当访客处于用户模式时,我必须遍历task_struct列表,将每个task->mm->pgd (实际上是相应的物理地址)与当前转换表指针进行比较。 后者是我正在寻找的。

文件的哪些字节保持映射?

一个文件与系统调用映射: mmap(65536, 32768, READ, FLAGS, fd, 0) 页面为8 KB,因此文件的4页文件被映射(32768 / 8k = 4页)。 然后进行下面的调用: munmap(65536, 8192) 这将删除内存映射的指定部分。 文件的哪些字节保持映射? 答案的关键在于页面2和页面3保留,所以只剩下字节16384到32767; 不过,我不确定这是对的。 由于munmap命令的len参数(第二个参数)是8192个字节,因此不仅要删除page 0,还要保留字节8192到32767?

在Linux内核中的PTE结构

我一直试图在linux源代码中查找与PAE禁用的x86系统上的PTE相对应的结构/联合。 到目前为止,我只在arch / x86 / include / asm / page_32.h中find以下内容 typedef union { pteval_t pte; pteval_t pte_low; } pte_t; 我现在有点困惑了,因为我已经在我面前打开了英特尔参考手册卷3A,并且该手册中介绍的PEN中的十几个奇数字段没有对应。 这可能是一个微不足道的问题,但对我来说,它已经变得更像是理解Linux内核中的内存pipe理过程中的一个绊脚石。 编辑:我有我的2.6.29来源