linux内核源码分析之页表

2023-11-15

目录

页表说明

虚拟地址转换为物理地址过程

内核中的宏以及说明


页表用来把虚拟页映射到物理页,并且存放页的保护单位,即访问权限。

页表说明

5级页表如下

1)页全局目录(Page Global Directory,PGD)

2)  页四级目录(Page 4th Directory,P4D)

3)页上册目录(Page Upper Directory,PUD)

4)页中间目录(Page Middle Directory,PMD)

5)直接页表(Page Table ,PT)

        各处理器架构可以选择使用五级,四级,三级,两级页表。同一处理器架构在页长度不同的情况下可能选择不同的页表级数。配置页表级数,内核中宏CONFIG_PGTABLE_LEVELS,一般使用默认值。

 每个进程有独立的页表,进程的mm_struct实例的成员pgd指向全局目录,前面四级的页表项存放下一级页表的起始地址,直接地址的页表项存放帧号(Page Frame Number  PFN)。

虚拟地址被分解为6部分:全局目录索引,页四级目录索引,页上层目录索引,页中间目录索引,直接页表索引和业内偏移。

虚拟地址转换为物理地址过程

查询页表,把虚拟地址映射为物理地址

1)根据全局目录的起始地址页全局目录索引得到页全局目录表项的地址,然后从页表项得到四级目录的起始地址。以此类推得到直接页表的起始地址。

2)根据直接页表的起始地址和直接页表的索引得到页表项的地址,然后得到页帧号。

3)页帧号页内偏移组合成物理地址。

内核中的宏以及说明

内核定义了各级页表索引在虚拟地址中的偏移

PAGE_SHIFT 页内偏移位数
PMD_SHIFT 页中间目录索引的偏移
PUD_SHIFT 页上层目录索引的偏移
P4D_SHIFT 页四级目录索引的偏移
PGDIR_SHIFT 页全局索引的偏移

 定义了各级页表表项描述的地址空间大小

PAGE_SIZE 直接页表项映射的地址空间的大小,单位页长度
PMD_SIZE  页中间目录表项映射的地址空间大小
PUD_SIZE 页上层目录表项映射地址空间大小
P4D_SIZE 页4级目录表项映射地址空间大小
PGDIR_SIZE 全局目录表项映射地址空间大小

各级页表存放指针个数以及页的阶数

PTRS_PER_PGD 全局目录的表项数据 PGD_ORDER 全局目录页阶
PTR_PER_P4D 页四级目录的表项数量 P4D_ORDER 四级目录页阶
PTR_PER_PUD 页上层目录的表项数量 PUD_ORDER 上层目录页阶
PTR_PER_PMD 页中间目录的表项数量 PMD_ORDER 中间目录页阶
PTR_PER_PTE 直接页表的表项数量 PTE_ORDER 直接页表阶数

typdef struct {unsigned long pgd;}pgd_t;

内核定义了宏和内联函数,以全局目录为例

//宏pgd_val()用来把pgd_t类型转化换成无符号整数
#define pgd_val(x) ((x).pgd)

//宏__pgd()用来把无符号长整数转化为pgd_t类型
#define __pgd(x) ((pgd_t)) { (x) })

//宏pgd_index(address)用来从虚拟地址分解除页全局目录索引
#define pgd_index(address)((address)>>PGDIR_SHIFT) & (PTRS_PER_PGD - 1)

//宏pgd_offset(mm,addr)用来返回指定进程的虚拟地址对应的页全局目录表项的地址
#define pgd_offset_k(address) pgd_offset(&init_mm,address)

//内联函数pgd_none(pgd)用来判断页全局目录表项是空表项,空表项没有指向下一级

//内联函数pgd_present(pgd)用来判断页全局目录表项是否存在,即是否指向下一级页表

大多数处理器支持的最小页长度是4KB


参考:
《深入理解linux内核》
《Linux内核深度解析》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux内核源码分析之页表 的相关文章

  • UE4 蓝图通信:接口调用

    UE4学习心得 蓝图间信息通信的几种方法 UE4的接口调用技术有点简单粗暴 而且主要体现在主蓝图对子蓝图的信息通信 在内容浏览器中添加一个蓝图接口 命名为TestInterface 双击打开接口 直接使用其创建时自带的一个接口函数 将其重命
  • 物理机安装centos7(u盘安装)——详细版

    我用的是华为的物理机 其它物理机操作几乎相同 可能不同的设置调试方法不同 如果是虚拟机安装 直接跳到centos7设置即可 物理机U盘启动 安装centos8方法相同 可能有些需要硬件配置相关 相关问题看具体报错方式 UltraISO下载地
  • 在C语言中 ¬∧∨这些符号什么意思

    b b b a a a b a a 或运算是 a b a b b b a a a 这三个都是位运算 是取非运算 交你个小窍门 没啥子好多的了 好好看看 里面有详细的解释 这就是在逻辑运算中常用到的短路判断 ls的已经说的很清楚了 b a b
  • 微信小程序之首页搭建

    小程序开发与实战 学习视频 https www bilibili com video BV1Gv411g7j6 p 9 spm id from pageDriver 实现导航栏和tabBar 实现导航栏和tabBar tabBar看下图 参
  • 电荷泵

    电荷泵 又称为电容式的开关稳压器 或开关电容DC DC变换器 无感式DC DC变换器 电荷泵采用电容作为开关和储能的元件 如图所示 S1与S3闭合 S2与S4断开 则Vin给电容充电 而后S1与S3断开 S2与S4闭合 则电容放电 此时Vo
  • Virtual Judge-4099:队列和栈

    Virtual Judge 4099 队列和栈 题目描述 队列和栈是两种重要的数据结构 它们具有push k和pop操作 push k是将数字k加入到队列或栈中 pop则是从队列和栈取一个数出来 队列和栈的区别在于取数的位置是不同的 队列是
  • PyTorch入门(六)使用Transformer模型进行中文文本分类

    在文章PyTorch入门 五 使用CNN模型进行中文文本分类中 笔者介绍了如何在PyTorch中使用CNN模型进行中文文本分类 本文将会使用Transformer模型实现中文文本分类 本文将会使用相同的数据集 文本预处理已经在文章PyTor
  • C语言程序——用星号打印图案

    文章目录 前言 一 用星号打印图案 二 程序实例 1 程序代码 2 运行结果 3 结果分析 三 拓展应用 总结 前言 用打印字符来输出星号组成的HELLO 一 用星号打印图案 用星号打印图案 一般利用星号画出具体的模拟输出形式 然后在输出时
  • 【Android】常用对话框大全(一)Android Dialog

    Android的对话框有多少种 Android好看的对话框有很多 如Android material qmui xui kongzue等系列对话框 但博主只打算讲解Android material系列对话框 讲太多没必要 实在想要做成人家那
  • 千万级数据清洗ETL设计方案

    千万级数据清洗项目分析总结 项目简介 一 需求分析 1 前期需求 2 中期需求 3 后期需求 二 技术支持 1 MySQL 2 Redis 三 框架设计 1 流线型代码 2 工厂模式 四 调式工作 1 线上测试 五 问题回顾 1 Mysql
  • scratch python的区别ev3_机器人编程和少儿编程,傻傻分不清—乐高EV3入门感想

    机器人编程和少儿编程的区别 机器人编程和少儿编程不是一个概念 机器人编程是少儿编程的重要组成部分 少儿学习编程大体上是两种方式 1 纯软件 最具代表性的是scratch 是麻省理工学院专门针对小朋友研发的图形化编程语言 无需英文和代码基础
  • win7系统扩展双屏幕时,如何在两个屏幕下都显示任务栏

    扩展屏幕下都显示任务栏 win7系统本身无法设置该功能 目前我是不知道 但可以下载第三方软件来解决该问题 第一步 Dual Monitor Taskbar 下载软件 下载链接 http pan baidu com s 1o61isjw 密码
  • Web 浏览器演变史

    浏览器的演变是由梦想和创新编织而成的 Tim Bernas Lee 在80年代在CERN工作时 提出了HTML技术 用以改善CERN庞大的信息管理需求 Tim 也编写了第一款浏览器 它是基于NeXT提供的interface builder开
  • 【STM32学习笔记】(7)——STM32时钟系统详解

    STM32时钟系统 时钟系统的简介 RCC Reset Clock Control 复位和时钟控制器 时钟是单片机运行的基础 时钟信号推动单片机内各个部分执行相应的指令 时钟系统就是CPU的脉搏 决定cpu速率 像人的心跳一样 只有有了心跳
  • 深度优先搜索(DFS) 广度优先搜索(BFS)

    深度优先搜索算法 Depth First Search DFS是搜索算法的一种 它沿着树的深度遍历树的节点 尽可能深的搜索树的分支 当节点v的所有边都己被探寻过 搜索将回溯到发现节点v的那条边的起始节点 这一过程一直进行到已发现从源节点可达
  • 软件系统产品线特征及构建过程

    根据SEI定义 结合业界的一些研究 软件产品线有如下几个重要特征 1 一个软件产品线应该有一系列的产品成员组成 既产品家族 2 产品家族中的所有产品都服务于一些特定的领域 3 产品家族成员之间在服务功能 产品质量 产品性能 产品应用范围等方
  • Kotlin协程概览

    协程 Coroutines 并不是 Kotlin 提出来的新概念 很多的编程语言都有实现 如 Go Python 等 本文所讲 专指kotlin的协程 在Android 11中 Asynctask已经被废弃了 因为协程可以更简单 直观的实现

随机推荐

  • (管用)Sqlite数据库升级

    调用构造器DBHelper中super里面的方法 增大newVersion的值 就会自动执行onUpgrade 增加数据库字段的sql语句 String upgradeGoods alter table Person add column
  • matlab 里tic toc的用法,Matlab中tic和toc用法

    简单地说 tic和toc是用来记录matlab命令执行的时间 tic用来保存当前时间 而后使用toc来记录程序完成时间 两者往往结合使用 用法如下 tic operations toc 显示时间单位 秒 Tic和toc函数可以计算运行一段时
  • 微信小程序的简单开发案例(记事本)

    微信小程序案例之简单记事本实现 我最近在学习微信小程序 主要熟悉了微信开发者工具的简单使用以及小程序的开发流程 微信小程序的学习要求不高 只要有一些web前端等知识基础即可 1 小程序简介 微信小程序是一种不用下载就能使用的应用 也是一项创
  • vant2-上拉加载、下拉刷新

    可以使用vant组件库实现 上拉刷新 下拉加载功能 vant2开发指南 htt ps youzan github io vant v2 zh CN list 上拉加载 List列表
  • CXF学习笔记三(发布restFul)

    一 概述 JAX RS是Java提供用于开发RESTful Web服务基于注解 annotation 的API JAX RS旨在定义一个统一的规范 使得Java程序员可以使用一套固定的接口来开发REST应用 避免了依赖第三方框架 同时JAX
  • 神经网络算法入门书籍,bp神经网络算法的优点

    请问学bp神经网络哪本书比较好 我研究生3年学的都是这个玩意 你是本科生吧 给你推荐一本书 我和我的同学都觉得这本书非常宝贝 西安电子科技大学出版的一本关于神经网络的书 定价是20元 至少3年前的版本是20元 蓝紫色皮 那本书非常好 不过是
  • Linux ffmpeg编译踩坑

    1 安装freetype字体库 avfilter添加文字水印的依赖项 下载freetype https www freetype org download html 配置 编译 安装 读取版本信息 configure make sudo m
  • Beego框架基本使用实践教程

    项目介绍 一款 Go 语言基于Beego Layui MySQL等框架精心打造的一款模块化 高性能 企业级的敏捷开发框架 本着简化开发 提升开发效率的初衷触发 框架自研了一套个性化的组件 实现了可插拔的组件式开发方式 单图上传 多图上传 下
  • 计算机专业毕业论文指导记录详细,毕业论文指导记录怎么写 了解一下

    1 指导记录总共6次 请各位同学按照法学院网站上公布的毕业论文写作进度确定每次指导记录的时间 同时根据自己的论文选题和实际情况 可稍作调整 2 第一次 根据学院的统一部署 布置学生毕业论文写作的总体要求与进度 要求学生严格按照学院的部署 积
  • shared_ptr的线程安全性

    shared ptr的线程安全性 shared ptr的reference count是线程安全的 但是指向的对象不是线程安全的 本文链接 https blog csdn net D Guco article details 8015532
  • SpringBoot+SSM+MySQL整合项目演示(不涉及前后端交互)

    文章目录 准备工作 创建项目 图1 图2 图3 图4 工程目录 代码编写 数据库 pom文件修改 完整项目目录 User类 创建一个来接收查询出来数据的对象 UserMapper接口 UserMapper xml文件配置 Service层
  • git 常用操作总结

    记录一下经常使用到的 git 操作 目录 开发新功能 拉取远程分支 开发新功能 创建 develop 分支 git branch dev 新建功能分支 根据 develop 为基础再键新的 feature 功能分支 b 是创建并且切换到改分
  • # vue# 【九】 个人中心的制作

    Z vue个人中心的制作 个人中心的制作 在实际开发里面 经常会有一些登录页需要进行编写 例如下面这些类型 而这些版面的制作 比较讲究的是思路问题 例如我们想要制作一个登录页 点击就可以输入名字 并且修改名字 整体思路 我们可以先把整体拆分
  • AV1视频编码标准资源汇总

    AV1视频编码标准资源汇总 A Progress Report The Alliance for Open Media and the AV1 Codec http www streamingmedia com Articles Edito
  • NoPrint.js:使用JavaScript在HTML中禁用打印、截屏、复制和粘贴

    NoPrint js是一个小巧整洁的开源JS库 可禁用HTML中的打印 截图 复制和粘贴功能 它还提供启用AutoBlur选项 让鼠标离开网页后内容变得模糊 这个功能可以阻止大多数普通用户截取屏幕截图 NoPrint js可以在几乎所有的浏
  • javaweb期末课设之图书管理系统(附源码)

    一 设计目标 项目是以北京航天航空大学图书管理系统为主题的网站 包含如下功能 注册 登录 用户端 图书查询及借阅 用户端 借阅记录及归还 管理员端 添加及修改图书 管理员端 管理用户信息 用户 管理员端 更改密码 二 运用的软件技术 前端设
  • Spring Boot项目pom

    spring boot web
  • VMware Workstation 虚拟机创建客户端系统,出现此主机不支持64位客户机操作系统问题解决

    安装VMware Workstation 虚拟机 选择centos7 64位是出现此主机不支持64位客户机操作系统 由于是window10系统 我们肯定是支持64的 所以硬件和系统应该是支持的才对 那么可能是哪个系统设置影响到了 有可能有下
  • 编译安装QGLViewerPlugin

    QGLViewer 编译安装步骤 由于工作学习的需要 要用opengl绘制显示些模型动画 原来用的是Qt做UI 直接调用的是QGLWidget类 但这个只是提供了基本的框架 很多交互操作还需添加代码完成 自己偷懒也觉得繁琐 就借用了开源的工
  • linux内核源码分析之页表

    目录 页表说明 虚拟地址转换为物理地址过程 内核中的宏以及说明 页表用来把虚拟页映射到物理页 并且存放页的保护单位 即访问权限 页表说明 5级页表如下 1 页全局目录 Page Global Directory PGD 2 页四级目录 Pa