1.3 反向映射的发展 Linux2.4没有反向映射 在linux2.4内核中没有反向映射的这个概念,当时为了找到一个物理页面对应的页表项就需要遍历系统中所有的mm组成的链表,然后再遍历每一个mm的每一个vma看这个vma是否映射了这页,这个过程相当低效,最坏情况不得不遍历完所有的mm然后才能找映射到这个页的所有pte。 Linux2.5的...
第一个场景是内存回收,内存不足时内核会从不活跃的lru链表尾部回收一些页面,而对于映射到进程地址空间的物理页面,我们需要在回收之前对他做解除映射处理。 对于匿名页,由于里面的数据是进程运行过程中产生的有用数据,不能随意丢弃,需要交换到交换分区,然后通过反向映射查找映射这个物理页的每个页表项,然后将页表项修改...
反向映射跟父子进程的写时拷贝有关系,所以先从父子进程创建时对AV,AVC,VMA的创建开始讲。 1.父进程创建匿名页面 当触发pagefault的时候走到handle_pte_fault中,anon_vma_prepare中负责创建AVC和AV并建立彼此的关系;真正将创建的page与av关联在__page_set_anon_map中完成。这样的话父进程新建的page在自己的反向映...
正向映射:用户访问的虚拟地址,经过多级页表转化,最终映射到物理页面; 反向映射:根据物理页面,找到所有映射到这个页面的虚拟地址的过程; 2.ramp出现的背景 当物理内存短缺时: 虚拟内存常大于物理内存; 把暂时不用的物理内存swap到交换分区; 3. 反向映射的应用场景 ...
第一个场景是内存回收,内存不足时内核会从不活跃的lru链表尾部回收一些页面,而对于映射到进程地址空间的物理页面,我们需要在回收之前对他做解除映射处理。 对于匿名页,由于里面的数据是进程运行过程中产生的有用数据,不能随意丢弃,需要交换到交换分区,然后通过反向映射查找映射这个物理页的每个页表项,然后将页表项修改...
1.3 进程创建时反向映射相关结构体间的关系 由于linux进程具有写时复制技术,子进程在创建时共享其父进程的匿名页;只有当子进程对匿名页进行写操作时,子进程才会新分配一个物理页,并将原先匿名页的数据copy到新创建的物理页中,最后子进程通过虚拟地址向新创建的物理页进行写操作。
反向映射的目的是为了找到所有映射到某一个页面的页表项,从而可以对目标页做一些操作,比如切断映射。 反向映射一直是一个非常神奇的存在,今天我们就好好探索一下这个知识点。 创建 在反向匿名映射中除了page struct,一共有三个相关的数据结构: vm_area_struct anon_vma
我们知道LINUX的内存管理系统中有”反向映射“这一说,目的是为了快速去查找出一个特定的物理页在哪些进程中被映射到了什么地址,这样如果我们想把这一页换出(SWAP),或是迁移(Migrate)的时候,就能相应该更改所有相关进程的页表来达到这个目的。 回到顶部
反向映射示例代码: 假设我们有一个简单的 Java 类User,其编译后的类文件为User.class。我们使用 JD-GUI 反向映射该文件,生成如下代码: // User.java - 反向映射生成的代码publicclassUser{privateStringname;// 用户姓名privateintage;// 用户年龄// 构造函数publicUser(Stringname,intage){this.name=name;// 初...