memory-management - 当在页表中找不到时,内核如何转换虚拟地址?

标签 memory-management operating-system kernel tlb page-tables

当在页表中找不到虚拟地址时,内核如何转换虚拟地址?该页面位于磁盘上,但内核究竟如何知道位置呢? (磁盘中的具体地址)

谢谢

最佳答案

每当程序遇到一个地址但它不在页表中时,CPU 异常 14(页面错误)就会中断内核。
控制权转移到调用页面错误处理程序的内核 IDT 处理程序。
Page Fault 检查CR2寄存器,判断是否需要

  1. 将 PF 发送到程序(段错误)
  2. 分配内存
  3. 将页从磁盘交换到内存

Send PF to Program (Segmentation Fault):处理程序仅在程序非法访问内存地址时选择此选项。

分配内存:这通常发生在程序访问已分配给它的内存区域(由 sbrk)但操作系统没有分配任何页面框架时。

Swap page from disk to memory:如果 OS 发现,这个页面已经被分配并且它已经被交换到磁盘(这可以通过一个位标志来跟踪)。它迅速要求页面文件管理器(在磁盘上)检索内容。当它被检索时,操作系统将其复制到新的页面框架并在页表中创建适当的条目。

注意:答案专门针对 x86/x86_64 处理器。

关于memory-management - 当在页表中找不到时,内核如何转换虚拟地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37965451/

相关文章:

linux - 如何找到 virtio_net 发送队列的地址?

c - 如何指向预分配内存上的 2D/3D 空间

c - 操作系统设计竞争条件

java - 如何获取系统数据并使我的应用程序针对操作系统独一无二

linux - 内核的 panic() 函数是否会完全卡住所有其他进程?

linux - linux 中缺少 slab.h 包括 - Ubuntu 16 VM

memory-management - 当进程访问刚用 brk/sbrk 分配的地址时,内核会发生什么?

iphone - NSArray 内存泄漏!无法获取为什么?

c - 瓦尔格林德 C : How to input string from stdio

operating-system - 如何从 FreeBSD VFS vnode 读取实际文件数据?