Memory linux内核如何为用户进程创建、初始化和设置页表?

Memory linux内核如何为用户进程创建、初始化和设置页表?,memory,memory-management,process,kernel,Memory,Memory Management,Process,Kernel,每个进程都有一个页面表。内核在fork或exec中为进程创建页表的时间是什么时候 MMU应该有一个指向页表基址的寄存器。这个基地址是虚拟地址还是物理地址 内核如何为页表分配物理页帧 在fork期间,使用copy_mm()为新任务复制当前任务的mm_结构的精确副本。在早期版本的内核中,无论何时创建子级,都会立即复制完整的地址空间,但最近的版本似乎有COW(写时复制)策略,只有在第一次需要修改数据时才创建副本 通常,MMU将虚拟地址转换为物理地址。然而,MMU中的地址转换功能/单元取决于处理器类型和

每个进程都有一个页面表。内核在
fork
exec
中为进程创建页表的时间是什么时候

  • MMU应该有一个指向页表基址的寄存器。这个基地址是虚拟地址还是物理地址

  • 内核如何为页表分配物理页帧


  • 在fork期间,使用copy_mm()为新任务复制当前任务的mm_结构的精确副本。在早期版本的内核中,无论何时创建子级,都会立即复制完整的地址空间,但最近的版本似乎有COW(写时复制)策略,只有在第一次需要修改数据时才创建副本

    通常,MMU将虚拟地址转换为物理地址。然而,MMU中的地址转换功能/单元取决于处理器类型和操作系统的集成/支持类型。 MMU寄存器指向正在执行的当前进程的页表/段。逻辑内存被认为是在称为页的块中,物理内存被认为是在称为帧的块中。逻辑地址是页码和页偏移量的组合。页表用于按操作系统将逻辑地址映射到物理地址,其中它确定表中相应页码的对应帧号。此帧编号与页偏移量一起成为物理地址

    对于x86,MMU转换可以分两个阶段进行,第一步是将逻辑地址(由寄存器指向)转换为线性地址,然后在第二步中转换为物理地址。通过配置CR0寄存器的MSB设置分页模式。最多可以有1024个页表,其信息(页表基址和其他信息)保存在页目录(CR3)中。线性地址位A22-A31指向页目录中1024个可能的页表基址之一

    页表和页描述符位于内存中。因此,它们应通过TLB(翻译查找缓冲区)进行处理,TLB是一个4路集关联缓存,最多可容纳32个页表条目(最近访问的条目),以避免每次内存访问都从内存中提取

    在引导过程中,内核从BIOS中了解各种物理内存范围、相应的内存类型映射,并创建物理地址映射/表。然后,内核将这些信息复制到适当的内核数据结构中,并认为这些页面帧是可用的


    请注意,一旦内核加载到内存中,可能就不会有页面表,因为分页可能不会在CPU中初始化。但是,随后,一旦分页被初始化,内核将分两个阶段初始化自己的页表。在第一阶段,内核创建初始页表,该表应足以使内核处于RAM中。在第二阶段,内核使用所有可用的RAM并创建完整的页面表。

    在复制mm_结构时,正如我所知,内核将通过调用
    pgd_alloc()
    来创建顶级页面全局目录(pgd)。但我不知道内核如何同时为新进程分配第二级
    pmd
    和第三级页表?未命中
    pmd
    pt
    是否会触发页面错误?