arm64 linux pgd_offset_k 代码阅读过程中的疑问记录

2023-10-27

start_kernel -> setup_arch -> early_fixmap_init -> pgd_offset_k

    pgd_t *pgd;
    unsigned long addr = FIXADDR_START; // 0xffff7ffffabfe000
    
    pr_err("Test pgd_index(addr) is 0x%llx \n",pgd_index(addr));    // 0xff
    
    pr_err("sdssglTest swapper_pg_dir is %llx.\n",swapper_pg_dir);    // 0xffff800000eec000
    
    pr_err("sdssglTest init_mm->pgd is %llx,   pgd is %llx\n",(&init_mm)->pgd,pgd);    //  0xffff800000eec000,0xffff800000eec7f8
    
    pr_err("sdssglTest  pgd_index(addr) + (&init_mm)->pgd is 0x%llx \n",PGDIR_SHIFT,pgd_index(addr)+(&init_mm)->pgd);    // 0xffff800000eec7f8
    
    pr_err("sdssglTest 0xffff800000eec000 + 0xff is 0x%llx.\n",(u64)(0xffff800000eec000) + 0xff);     // 0xffff800000eec0ff


    pgd = pgd_offset_k(addr);   // 0xffff800000eec7f8


#define pgd_offset_k(addr)  pgd_offset(&init_mm, addr)
#define pgd_offset(mm, addr)    ((mm)->pgd+pgd_index(addr)) // 0xffff800000eec000 + 0xff
#define pgd_index(addr)     (((addr) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1))  // addr >> PGDIR_SHIFT  = 0xffff7ffffabfe000 >> 39 =  0x1fffeff
                                                                            // 0x1fffeff & (0x200 -1) = 0x1fffeff & 0x1ff = 0xff


问题描述:
    在 early_fixmap_init 函数中,调用 pgd_offset_k 计算 FIXADDR_START 虚拟地址在 pgd 中的虚拟地址,
    addr = 0xffff800000eec7f8
    由 pgd_offset_k 宏定义可知,需要计算 (mm)->pgd , pgd_index(addr),然后将两者相加
    通过打印可知:(mm)->pgd = 0xffff800000eec000
                   pgd_index(addr) = 0xff
        所以 pgd_offset_k(addr) 应该等于 0xffff800000eec0ff ,但是实际上却等于 0xffff800000eec7f8
        将两个数,0xffff800000eec000 + 0xff 打印出也是 0xffff800000eec0ff,但是 pgd_index(addr)+(&init_mm)->pgd 这个相加却为 0xffff800000eec7f8


    

问题解决:

由于arm64,一个pgt页表项占用8个字节,所以0xff个页表项则占用 0xff * 8 = 0x7f8 个字节,再说地址不能f结尾,要对齐,所以为 0xffff800000eec7f8
    

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

arm64 linux pgd_offset_k 代码阅读过程中的疑问记录 的相关文章

随机推荐

  • js sum函数

    addnum function num1 num2 const num1Digits num1 toString split 1 length const num2Digits num2 toString split 1 length co
  • Qt新建项目No valid kits found解决思路

    第一次用Qt Creator创建Project时 进入Kit Selection窗口后 会提示No Valid kits found Please add a kit in the options
  • web性能测试基本性能指标

    文章出处 https blog csdn net qiguiting article details 11584397 Web性能测试的部分概况一般来说 一个Web请求的处理包括以下步骤 1 客户发送请求 2 web server接受到请求
  • Source Insight 4.0常用设置

    1 删除某一个或多个无用的project 历史project 用十六进制编辑器打开 我的文档 Source Insight 4 0 Projects project list sidb 文件 找到你要删除的项目路径及名称字符串 用0替换相关
  • TortoiseGit实现分支的新增、合并、删除详细教程

    分支的新增 合并 删除 关于git分支的操作 内容较多 所以从上篇博客 Windows下TortoiseGit客户端安装 中单独提取了出来 16 创建分支 Create Branch 关于Git Branch 在实际的项目开发过程中 这个非
  • ROS学习笔记(一)

    一 ROS安装与测试 Ubuntu和ROS版本的对应关系 网上教程很多 本人主要参考以下几篇 官网教程 全英文 ROS安装教程 ROS kinetic 超详细安装教程 安装过程中报错以及参考文章 均能有效解决 安装完ROS后 初始化rosd
  • 总结Pyinstaller的坑及终极解决方法

    一 首先要有个稳定环境 下面是博主经测试的觉得坑比较少的环境搭配 Python3 4 PyQt5 4 Pyinstaller3 2 1 Python3 5 PyQt5 8 Pyinstaller3 2 1 二 Pyinstaller遇到坑没
  • el-table表头无法居中显示(使用了cell-style和header-cell-style属性,也没有效果)----解决办法

    解决办法 cell style和header cell style属性要写在style前面
  • Windows Server 2016组策略限制用户登录到本机

    打开组策略 编辑 设置允许本地登录 拒绝本地登录 刷新组策略
  • 【EI会议征稿】第三届机械自动化与电子信息工程国际学术会议(MAEIE 2023)

    第三届机械自动化与电子信息工程国际学术会议 MAEIE 2023 第三届机械自动化与电子信息工程国际学术会议 MAEIE 2023 将于2023年12月15 17日在江苏南京举行 本会议通过与业内众多平台 社会各团体协力 聚集机械自动化 电
  • 嵌入式Linux应用开发笔记:串口

    文章目录 目的 基础说明 开发准备 设备树 应用程序 应用程序与演示 代码 演示 总结 设备树文件 目的 串口 UART 是嵌入式设备中比较常用的功能 这篇文章将记录下应用程序中串口操作相关内容 这篇文章中内容均在下面的开发板上进行测试 新
  • Dockerfile部署lnmp

    Dockerfile部署lnmp 实验步骤 需一台安装好docker的虚拟机 systemctl stop firewalld systemctl disable firewalld setenforce 0 指定网段 docker net
  • stream与Byte相互转换

    stream 转为byte public byte stream2byte Stream stream byte buffer new byte stream length stream Read buffer 0 buffer lengt
  • 嵌入式调试工具合集

    Embedded Develop Tools 嵌入式开发中用到的一些工具软件集 文章目录 Embedded Develop Tools 串口调试 串口收发 串口终端 虚拟串口 串口监控 网络调试 网络抓包 TCP UDP HTTP MQTT
  • Android SDK 安装与Manager下载tools详情

    Android SDK 安装与Manager下载tools详情 Android SDK 安装 前往android网站下载 下载图片红色处即可 下载后双击按步骤安装即可 Manager tools安装 进入安装的文件目录 找到SDK Mana
  • 区块链的5个特征

    id BSN 2021 公众号 BSN研习社 人们看重区块链 最重要的是看重区块链所具有的不可替代的功能和特点 这些特点包括去中心化 开放性 独立性 安全性 匿名性 去中心化 区块链技术不依赖额外的第三方管理机构或硬件设施 没有中心管制 除
  • Linux资源监控工具

    概述 glances 是一款用于 Linux BSD 的开源命令行系统监视工具 它使用 Python 语言开发 能够监视 CPU 负载 内存 磁盘 I O 网络流量 网速 文件系统 系统温度等信息 本文介绍 glances 的使用方法和技巧
  • 类注释文档编写方法

    对于Java语言 最体贴的一项设计就是它并没有打算让人们为了写程序而写程序 人们也需要考虑程序的文档化问题 对于程序的文档化 最大的问题莫过于对文档的维护 若文档与代码分离 那么每次改变代码后都要改变文档 这无疑会变成相当麻烦的一件事情 解
  • 大数据Java基础第十九天作业

    第一题 简单的URL获取资源下载 import java net URL import java net URLConnection import java io InputStream import java io FileOutputS
  • arm64 linux pgd_offset_k 代码阅读过程中的疑问记录

    start kernel gt setup arch gt early fixmap init gt pgd offset k pgd t pgd unsigned long addr FIXADDR START 0xffff7ffffab