0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

详解Linux系统文件页表目录和Linux系统页表结构

书生途 来源:书生途 作者:书生途 2022-05-11 09:22 次阅读

两级页表如何实现地址转换:

  • 页表:是一种特殊的数据结构,记录着页面和页框的对应关系。(映射表)
  • 页表的作用:是内存非连续分区分配的基础,实现从逻辑地址转化成物理地址。
pYYBAGJ6ZJ2AG2klAACTtTGxTzw118.jpg
  1. (1) 按照地址结构将逻辑地址拆成三个部分。
  2. (2) 从PCB中读取页目录起始地址,再根据一级页号查页目录表,找到下一级页表在内存中存放位置。
  3. (3) 根据二级页号查表,找到最终想要访问的内存块号。
  4. (4) 结合页内偏移量得到物理地址。

虚拟存储技术

再解决了页必须连续存放的问题后,再看如何第二个问题:没有必要让整个页表常驻内存,因为进程一段时间内可能只需要访问某几个特定的页面。
解决方案:可以在需要访问页面时才把页面调入内存——虚拟存储技术(后面再说)。可以在页表中增加一个标示位,用于表示该页表是否已经调入内存。

应用

若采用多级页表机制,则各级页表的大小不能超过一个页面。

举例说明,某系统按字节编址,采用40位逻辑地址,页面大小为4KB,页表项大小为4B,假设采用纯页式存储,则要采用()级页表,页内偏移量为()位?

页面大小 = 4KB,按字节编址,因此页内偏移量为12位。
页号 = 40 - 12 = 28位。
页面大小 = 4KB,页表项大小 = 4B,则每个页面可存放1024个页表项。因此各级页表最多包含1024个页表项,需要10个二进制位才能映射到1024个页表项,因此每级页表对应的页号应为10位二进制。共28位的页号至少要分为3级。

1、 进程的4G 线性空间被划分成三个部分:进程空间(0-3G)、内核直接映射空间(3G – high_memory)、内核动态映射空间(VMALLOC_START - VMALLOC_END)

2、 三个空间使用同一张页目录表,通过 CR3 可找到此页目录表。但不同的空间在页目录表中页对应不同的项,因此互相不冲突

3、 内核初始化以后,根据实际物理内存的大小,计算出 high_memory、VMALLOC_START、VMALLOC_END 的值。并为“内核直接映射”空间建立好映射关系,所有的物理内存都可以通过此空间进行访问。

4、 “进程空间”和“内核动态映射空间”的映射关系是动态建立的(通过缺页异常)

假设在有三个线性地址 addr1, addr2, addr3 ,分别属于三个线性空间不同部分(0-3G、3G-high_memory、vmalloc_start-vmalloc_end),但是最终都映射到物理页面1:

1、 三个地址对应不同的页表和页表项

2、 但是页表项的高 20bit 肯定是1,表示物理页面的索引号是1

3、 同时,根据高 20 bit,可以从 mem_map[] 中找到对应的 struct page 结构,struct page 用于管理实际的物理页面(就是实际物理页面的物理地址了,到这里就不绕弯子了,顺便想到高速缓冲的匹配命中操作是用哈希表,换算出的要访问的实际物理地址拿到哈希表的输入计算一下哈希值,看看有没命中)(红线)

4、 从线性地址最终的,根据页目录表,页表,可以找到物理地址

5、 Struct page 和物理地址之间很容易互相转换

6、 从物理地址,可以很容易的反推出在内核直接映射空间的线性地址(蓝线)。要想得到在进程空间或者内核动态映射空间的对应的线性地址,则需要遍历相应的“虚存区间”链表。


关于页目录表:
1、 每个进程有一个属于自己的页目录表,可通过 CR3 寄存器找到
2、 而内核也有一个独立于其它进程的页目录表,保存在 swapper_pg_dir[] 数组中

3、 当进程切换的时候,只需要将新进程的页目录把地址加载到 CR3 寄存器中即可

4、 创建一个新进程的时候,需要为它分配一个 page,作为页目录表,并将 swapper_pg_dir[] 的高 256 项拷贝过来,低 768 项则清0

linux0.11版本,所有进程共享同一个页目录而各自使用不同的页表,该共享的页目录就放在物理地址最前面的4k

poYBAGJ6ZJ6AdSSmAACsd8Aievs752.jpg

标题:Linux系统文件页表目录和页表结构(图文详解)

原文作者:玩转Linux内核,地址:https://zhuanlan.zhihu.com/p/429914858 转载注明来源

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5068

    文章

    19013

    浏览量

    303079
  • 内核
    +关注

    关注

    3

    文章

    1362

    浏览量

    40221
  • Linux
    +关注

    关注

    87

    文章

    11222

    浏览量

    208886
收藏 人收藏

    评论

    相关推荐

    Linux目录结构文件操作

    Linux目录结构为树状结构,最顶级的目录为根目录/。
    发表于 09-05 10:15 541次阅读

    关于和MMU的问题

    刚开始学,好多东西都云里雾里的TT为什么在bootloader里要进行初始化然后开启MMU,然后在进入内核后还要创建开启MMU?这两个有什么不一样么?s3c2410,bootl
    发表于 05-06 17:25

    解读Linux文件系统目录结构

    通过命令ls/可以展示Linux系统目录结构,主要包括以下内容:1. binbin是Binary的缩写, 这个目录存放着最经常使用的命令。2
    发表于 01-09 13:38

    详解Linux目录结构

    /:根目录,位于Linux文件系统目录结构的顶层,一般根目录下只存放
    发表于 07-25 07:45

    Linux系统命令及其使用详解 _120

    电子发烧友网站提供《Linux系统命令及其使用详解 _120.doc》资料免费下载
    发表于 04-18 13:23 3次下载

    Linux设备驱动开发详解》第5章、Linux文件系统与设备文件系统

    Linux设备驱动开发详解》第5章、Linux文件系统与设备文件系统
    发表于 10-27 14:13 0次下载
    《<b class='flag-5'>Linux</b>设备驱动开发<b class='flag-5'>详解</b>》第5章、<b class='flag-5'>Linux</b><b class='flag-5'>文件系统</b>与设备<b class='flag-5'>文件系统</b>

    linux文件系统基础

    一 、linux文件结构 文件结构文件存放在磁盘等存贮设备上的组织方法。主要体现在对
    发表于 11-07 15:28 0次下载

    Windows和Linux的区别以及Linux系统目录结构

    本文先对 Windows 和 Linux 上面文件系统原理、组织概念进行区分,并给出例子、列举两者的优缺点以具体说明,最后较为详细地介绍了 Linux 系统
    的头像 发表于 06-18 17:37 8578次阅读
    Windows和<b class='flag-5'>Linux</b>的区别以及<b class='flag-5'>Linux</b><b class='flag-5'>系统</b>的<b class='flag-5'>目录</b><b class='flag-5'>结构</b>

    Linux实用教程之Linux文件目录操作总结

    Linux系统下除了一般文件之外,所有的目录和设备(光驱、硬盘等)都是以文件的形式存在的,本节主要讲述
    发表于 09-29 16:18 0次下载

    解析Linux内核管理中那些鲜为人知的秘密

    虚拟内存管理,而管理是在虚拟内存管理中尤为重要,本文主要以回答几个管理中关键性问题来解析Linux内核
    的头像 发表于 06-11 16:32 1611次阅读

    Linux中匿名的访问分析

    Linux 中 有后备文件支持的称为文件,如属于进程的代码段、数据段的,内存回收的时候这些
    的头像 发表于 10-12 17:52 2828次阅读

    嵌入式Linux开发之文件系统目录结构介绍

    前言Linux文件系统,顾名思义:文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统
    发表于 11-01 16:31 3次下载
    嵌入式<b class='flag-5'>Linux</b>开发之<b class='flag-5'>文件系统</b><b class='flag-5'>目录</b><b class='flag-5'>结构</b>介绍

    嵌入式Linux系统编程学习之一目录结构

    嵌入式Linux系统编程学习之一目录结构文章目录嵌入式Linux
    发表于 11-02 12:06 9次下载
    嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>系统</b>编程学习之一<b class='flag-5'>目录</b><b class='flag-5'>结构</b>

    STM32MP157 Linux系统移植开发篇7:Linux内核目录结构详解

    Linux内核目录结构Linux内核源代码非常庞大,随着版本的发展不断增加。它使用目录结构,并
    发表于 12-17 18:29 10次下载
    STM32MP157 <b class='flag-5'>Linux</b><b class='flag-5'>系统</b>移植开发篇7:<b class='flag-5'>Linux</b>内核<b class='flag-5'>目录</b><b class='flag-5'>结构</b><b class='flag-5'>详解</b>

    RISC-V Linux创建

    临时分析 MMU开启前,需要建立好kernel、dtb、trampoline等。以便MMU开启后,并且在内存管理模块运行之前,kernel可以正常初始化,dtb可以正常地被解析
    的头像 发表于 10-08 11:14 535次阅读