📜  从页表到主内存的OS映射(1)

📅  最后修改于: 2023-12-03 14:49:29.394000             🧑  作者: Mango

从页表到主内存的OS映射

什么是页表?

在操作系统中,物理内存被划分成一个个固定大小的块,称为页面(Page)。而虚拟内存也被划分成相同大小的块,称为虚拟页面(Virtual Page)。页表(Page Table)中保存了虚拟页面与实际物理页面的对应关系,它是操作系统实现虚拟内存管理的核心数据结构。

页表的作用

页表用于记录虚拟内存与物理内存之间的映射关系,当CPU访问虚拟内存时,操作系统需要通过页表将虚拟地址转换成物理地址,再通过物理地址访问实际的内存单元。

页表的结构

每个进程都有自己的独立页表,在Linux中,页表是由一个二维数组来实现的,具体结构如下:

struct task_struct {
    struct mm_struct *mm;
};

struct mm_struct {
    pgd_t *pgd;
};

typedef unsigned long pgd_t;

struct pgd {
    pgdval_t pgd;
};

typedef unsigned long pgdval_t;

struct pte {
    pteval_t pte;
};

typedef unsigned long pteval_t;

其中,pgd_t代表页全局目录项,pgd代表页全局目录。每个进程都有唯一的一个页全局目录项,并且该项保存了指向页目录表的指针。页目录表保存了指向页表的指针,而页表则保存了指向物理页面的指针。

页表的操作
  • 地址转换

当CPU需要访问某个虚拟地址时,操作系统需要先获取该进程的页全局目录项,然后通过页全局目录项找到页目录,再通过页目录找到页表,最后通过页表找到相应的物理内存页面。这个过程称为地址转换,其过程如下:

页表地址转换

  • 页面置换

当物理内存不够用时,操作系统需要将某些页面置换到磁盘上以释放空间。通常情况下,操作系统会选择置换最近最少使用的页面,以达到最小化置换的目的。

问题及解决方法
  • 页表的访问速度比较慢,如何提高访问速度?

答:可以使用快速查找算法,例如TLB(Translation Lookaside Buffer)缓存,它是一种高速缓存,用于存放最近访问的页表信息,从而提高访问速度。

  • 如何保护页表不被恶意程序修改?

答:可以使用硬件支持的页表保护机制,例如Intel x86架构中的多级页表(Multilevel Page Table)和写保护(Write Protect)位。多级页表可以保护整个页表及其子页面,而写保护位则可以保护单个页面。