《深入Linux内核架构》第3章 内存管理(3)

目录

3.3 页表

3.3.1 数据结构

3.3.2 特定于PTE的信息

3.3.3 页表项的创建和操作


3.3 页表

页表作用:

        将虚拟地址转换为物理地址。

内核总是使用四级页表。所以如果体系架构只支持两级页表,则需模拟第三和第四级页表。

四级页表:

        PGD(Page Global Directory) 页全局目录

        PUD(Page Upper Directory) 页上层目录

        PMD(Page Middle Directory) 页中间目录

        PTE(Page Table Entry)         页表项

如何根据虚拟地址找到对应物理地址?(页表查询过程)

      1. 读取页表基址寄存器 (PTBR) 值,其中存放PGD页表的物理地址。

        2. 根据虚拟地址算出PGD index,再结合PGD物理地址,得到PUD物理地址。

        3. 根据虚拟地址算出PUD index,再结合PUD物理地址,得到PMD物理地址。

        4. 根据虚拟地址算出PMD index,再结合PMD物理地址,得到PTE物理地址。

  

不同体系架构用不同寄存器作为基址寄存器 (PTBR)

        x86:CR3(Control Register 3)

        ARM:TTBR(Translation Table Base Register)

3.3.1 数据结构

一个虚拟地址使用unsigned long定义。

对于所有体系架构都成立:

        sizeof(void *) = sizeof(unsigned long)

一个虚拟地址分为5部分:

#define PAGE_SIZE(1UL << PAGE_SHIFT)

        一个页大小

        其中#define PAGE_SHIFT         12

                则一个页大小2的12次方,即4K。

PTRS_PER_PGD 页全局目录中表项数

PTRS_PER_PUD 页上层目录中表项数

PTRS_PER_PMD 页中间目录中表项数

PTRS_PER_PTE 页表项中表项数

        对于只支持两级页表的体系:

                PTRS_PER_PMD=1

                PTRS_PER_PUD=1

页表项的数据结构,pgd和pte为例:

        typedef struct {

                unsigned long pgd;

        } pgd_t;

        typedef struct {

                unsigned long pte;

        } pte_t;

将pte_t转换为unsigned long:

        #define pgd_val(x) ((x).pgd)

        #define pte_val(x) ((x).pte)

将unsigned long转换为pte_t:

        #define __pgd(x) ((pgd_t) { (x) } )

        #define __pte(x) ((pte_t) { (x) } )

计算给定虚拟地址的PMD index:

        pmd_index(unsigned long addr)

计算给定地址 address在页上层目录PUD指向的页中间目录(PMD)的索引值

        pmd = pmd_offset(pud_t *pud, unsigned long addr)

将给定地址返回按页对齐

        addr = PAGE_ALIGN(addr);

        如PAGE_ALIGN(6000) ,返回8192

3.3.2 特定于PTE的信息

一个PTE页表项条目:

        除了指示物理内存页的位置,还利用多余bit实现如下信息。

ARM为例:

#define L_PTE_VALID (_AT(pteval_t, 1)

#define L_PTE_PRESENT (_AT(pteval_t, 1)

        上面两个含义一样,该PTE是否指向一个有效的物理页。

#define L_PTE_FILE (_AT(pteval_t, 1)

        该页表项指向的物理页是磁盘文件映射页

#define L_PTE_DIRTY (_AT(pteval_t, 1)

        该页表项指向的物理页有脏数据,待写回磁盘

#define L_PTE_RDONLY (_AT(pteval_t, 1)

        该页表项指向的物理页是只读,如程序的代码段页面

#define L_PTE_USER (_AT(pteval_t, 1)

        设置该位,表示页面可被用户进程访问。

        否则页面只能被内核访问。

#define L_PTE_XN (_AT(pteval_t, 1)

        eXecute Never,该页面将不允许执行指令,如堆栈,数据段页面。

#define L_PTE_SHARED (_AT(pteval_t, 1)

        该页表项指向的物理页可被多个进程共享

#define L_PTE_NONE (_AT(pteval_t, 1)

        该页表项无效或不存在

注意:之前说过struct page表示一个物理页,内部flag成员也表示物理状态。

二者区别:

        PTE关注虚拟内存层面的标志信息。给MMU和虚拟内存管理系统使用。

        struct page中flags关注物理内存层面。给内存管理子系统使用。

二者可能需要互相同步标志信息。

MMU进行虚拟地址转换物理地址时,读取PTE中标志信息。

ARM中实现有:

pte_t pte_modify(pte_t pte, pgprot_t newprot)

        修改pte页表项对应bit,完成对应标志更改。

#define pte_present(pte) (pte_val(pte) & L_PTE_PRESENT)

        检查一个页表项指向的物理页是否存在且有效

#define pte_dirty(pte) (pte_val(pte) & L_PTE_DIRTY)

        检查一个页表项指向的物理页是否有脏数据

#define pte_write(pte) (!(pte_val(pte) & L_PTE_RDONLY))

        检查该页表项指向的物理页是否可写

应用层malloc时,内核如何分配?

        1. 内核在虚拟地址空间分配一块虚拟内存。

        2. 创建页表项PTE,并标记空或者无效,并设置页表项为保护状态。

        3. 当应用程序首次写虚拟内存时,因为页是保护状态,所以会触发page fault。

        4. page fault中断处理中,通过页置换或页换出找到可用物理页,并将该物理页映射到引起错误的虚拟地址。

        5. 最后更新页表项,包括设置PTE_PRESENT,也可能设置PTE_DIRTY(页被写入)。

3.3.3 页表项的创建和操作

pte_t pte = mk_pte(struct page *page, pgprot_t pgprot)

        定义一个页表项PTE,用于指向page物理页,并设置相应属性pgprot。

pud_t *pud_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address)

        在PGD中分配一个PUD条目

pmd_t *pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long address)

        在PUD中分配一个PMD条目

int __pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma,

pmd_t *pmd, unsigned long address)

        在给定虚拟内存区域(VMA)的虚拟地址address分配一个新的页表项(PTE)。

        常用于创建新的VMA或扩展现有VMA。

void pte_free(struct mm_struct *mm, pgtable_t pte)

        释放页表条目PTE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/488924.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pycharm连接服务器运行时找不到文件或目录

选择你要修改的python interpreter 进入下图界面&#xff0c;默认选择的是Deployment configuration,需要将其改成SSH。 再将上图python interpreter path和pycharm helpers path 配置成服务器上相应地址即可。 over

【Java项目】基于jspssm的高校二手交易平台

目录 背景 技术简介 系统简介 界面预览 背景 随着互联网技术的不断进步&#xff0c;高校二手交易市场通过网络平台得到了显著的扩展。开发这一平台时&#xff0c;首要任务是深入挖掘并满足用户的实际需求&#xff0c;通过精准把握用户需求来构建一个专门化的高校二手交易系…

基于Django(python+sql)的校园二手交易系统设计与实现(完整程序+开题报告+论文)

随着互联网的迅猛发展&#xff0c;校园内的二手交易市场也逐渐呈现出蓬勃的发展态势。学生们在校园生活中会产生大量的闲置物品&#xff0c;而其他学生也有可能需要这些物品。本论文研究了校园二手交易系统的需求分析、系统实现和测试三个部分&#xff0c;旨在提高校园二手交易…

10.测试教程-性能测试loadrunner1

文章目录 1.LoadRunner的安装2.Loadrunner的基本概念3.开发测试脚本3.1录制基本的用户脚本3.2插入事务3.3插入集合点3.4参数化输入3.5插入函数3.6插入检查点3.7运行时设置3.8单机运行测试脚本 4.玩转三个测试工具4.1Virtual User Generator(此处讲解和3.1是一致的)4.2Controlle…

简单破除github的2FA验证

简单破除github的2FA验证 文章目录 简单破除github的2FA验证&#x1f468;‍&#x1f3eb;Authenticator工具 &#x1f468;‍&#x1f3eb;Authenticator工具 最近使用github的时候发现要搞一个2FA的验证才可以 验证的途径有两种&#xff1a;一种是用手机电话验证&#xff0c;…

Java基于微信小程序的校园请假系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#…

HTML作业2

作业1: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>table…

金三银四面试题(四):Full GC 和 Minor GC

如何触发Full GC&#xff1f;这是面试中的高频题。同样了解Full GC和Minor GC对于理解Java应用程序的性能和内存管理非常重要。 区分 GC 在此之前&#xff0c;我们要搞清楚&#xff0c;什么是Full GC&#xff0c;什么是Minor GC&#xff1f; Minor GC Minor GC是Java虚拟机…

Unity构建详解(3)——SBP的依赖计算

【前置知识】 先要搞清楚Asset和Object的关系&#xff0c;可以简单理解为一个Asset对应多个Object。 unity自定义的Asset也要有一个存储的标准&#xff0c;其采用的是YAML&#xff0c;我们看到的所有Unity自定义的Asset格式&#xff0c;例如.prefab&#xff08;预制体&#x…

基于SSM框架的酒店预订系统

基于SSM框架的酒店预订系统的设计与实现 摘要 当今世界的互联网信息技术飞速发展&#xff0c;网络化的工作模式已经几乎覆盖到各个工作领域中的业务内&#xff0c;人们的日常生活也渐渐离不开互联网。因此&#xff0c;在当下全国各处的酒店都开始构建起了自己的网络预订系统。…

Win11文件右键菜单栏完整显示教程

近日公司电脑升级了win11&#xff0c;发现了一个小麻烦事&#xff0c;如下图&#xff1a; 当我想使用svn或git的时候必须要多点一下&#xff0c;这忍不了&#xff0c;无形之中加大了工作量&#xff01; 于是&#xff0c;菜单全显示教程如下&#xff1a; 第一步&#xff1a;管…

Java前端控制器模式

文章目录 以下是Java前端控制器模式的主要组成部分和工作原理&#xff1a;组件与角色&#xff1a;工作流程&#xff1a;应用场景与优势&#xff1a; Java Web应用程序示例 Java前端控制器模式是一种软件设计模式&#xff0c;它在构建基于Java的Web应用程序时特别有用&#xff0…

基于springboot实现在线拍卖系统项目【项目源码+论文说明】

基于springboot实现在线拍卖系统演示 摘要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍…

2024/3/23打卡数组分割(第14届蓝桥杯)——二项式+快速幂

题目 思路 分析该题&#xff0c;要将集合 划分成两个子集 &#xff0c;且两个子集的和都是偶数。 可知&#xff1a;偶数 偶数 偶数&#xff1b;偶数 奇数 奇数&#xff1b;奇数 奇数 偶数&#xff1b; 分析可得&#xff1a;如果该集合的和为奇数&#xff0c;就不能分…

jQuery实现的会员中心安全修改表单特效代码

jQuery实现的会员中心安全修改表单特效代码是一款实现了可以修改登录密码&#xff0c;交易密码&#xff0c;手机号码&#xff0c;实名认证&#xff0c;电子邮箱&#xff0c;安全设置表单&#xff0c;会员表单等设置效果的代码 下载地址 https://www.qqmu.com/2635.html

卡行领航家用户端是怎么拼团怎么挣钱的?

#领航家代理政策/怎么代理/奖金制度/双2.0模式# 全国V&#xff1a;ok1234vip 领航家用户端&#xff1a;0.52费率 一次拼团0.44费率 两次拼团0.36费率 三次拼团0.2费率 ………… 十次拼团&#xff0c;客户每月挣20480 领航家代理端&#xff1a;无押激活返现高达166/台 分润万5-万…

智慧公厕的全域感知、全网协同、全业务融合和全场景智慧赋能

公共厕所是城市的重要组成部分&#xff0c;为市民提供基本的生活服务。然而&#xff0c;传统的公厕管理模式存在诸多问题&#xff0c;如排队等候时间长、卫生状况差、空气质量差等&#xff0c;严重影响市民的出行和生活质量。为了解决这些问题&#xff0c;智慧公厕应运而生&…

Spring IOC 容器的加载过程(bean 的创建过程)

Spring IOC 容器的加载过程&#xff08;bean 的创建过程&#xff09; 配置Bean 通过xml或者是Component Bean 等进行配置 解析Bean,得到BeanDefinition定义对象 通过 BeanDefintionReader 将 bean 进行解析&#xff0c;准备要创建的bean对象的定义对象BeanDefinition,存放到Be…

ATA-2048高压放大器在医疗中的作用是什么

高压放大器在医疗设备和医学应用中发挥着至关重要的作用。它们是一种专用的电子设备&#xff0c;用于放大医学图像和信号&#xff0c;以便医生能够更准确地诊断和治疗病患。下面西安安泰将详细介绍高压放大器的作用、原理和应用领域。 高压放大器是专门设计用于处理医学图像和信…

CrossOver虚拟机软件2024中文版最新功能介绍

CrossOver是一款由CodeWeavers公司开发的&#xff0c;运行在Mac和Linux操作系统下&#xff0c;能够模拟Windows系统应用运行环境的软件。它不需要用户单独安装Windows操作系统&#xff0c;就能让Windows平台上的应用程序在Mac和Linux上顺畅运行。CrossOver在技术上使用了Wine&a…