在show_pte 中可以很容易的看出是如何打印pgd/pud/pmd/pte的
void show_pte(struct mm_struct *mm, unsigned long addr)
{
    pgd_t *pgd;

if (!mm)
        mm = &init_mm;
//打印指针直接有%p就可以了,具体可以看后面实际的效果
    pr_alert("pgd = %p\n", mm->pgd);
    pgd = pgd_offset(mm, addr);
    pr_alert("[%08lx] *pgd=%016llx", addr, pgd_val(*pgd));

do {
        pud_t *pud;
        pmd_t *pmd;
        pte_t *pte;

if (pgd_none(*pgd) || pgd_bad(*pgd))
            break;

pud = pud_offset(pgd, addr);

打印64 bit的数据可以用%016llx

printk(", *pud=%016llx", pud_val(*pud));
        if (pud_none(*pud) || pud_bad(*pud))
            break;

pmd = pmd_offset(pud, addr);
        printk(", *pmd=%016llx", pmd_val(*pmd));
        if (pmd_none(*pmd) || pmd_bad(*pmd))
            break;

pte = pte_offset_map(pmd, addr);
        printk(", *pte=%016llx", pte_val(*pte));
        pte_unmap(pte);
    } while(0);

printk("\n");
}
从show_pte 函数可以看到,首先判断mm_struct *mm 是否为null,如果为null的话,说明是在kernel space,则将init_mm 赋值给mm,init_mm表示kernel space的memory分布。
得到mm_struct *mm 后,通过给定的虚拟地址就可以得到pgd的值
    pr_alert("pgd = %p\n", mm->pgd);
    pgd = pgd_offset(mm, addr);
    pr_alert("[%08lx] *pgd=%016llx", addr, pgd_val(*pgd));
这里mm->pgd表示pgd的之,而pgd_val(*pgd)表示pgd这个指针指向的值
得到pgd后
        pud = pud_offset(pgd, addr);
        printk(", *pud=%016llx", pud_val(*pud));
        if (pud_none(*pud) || pud_bad(*pud))
            break;
就可以通过pud_offset的的pud的之,通过pud_val(*pud)可以得到pud这个指针指向的值
pmd和pte都是通过类似kernel已经提供好的函数pmd_offset和pte_offset_map来得到其值
但是在show_pte 中默认只打印了pmd/pud/pte指针指向的值,并没有打印其本身的值,说的有点绕,直接看下面的code

实际效果

得到pmd的虚拟地址是ffff842ffbffd000,减去ffff800000000000,就是对应的物理地址42ffbffd000

如何打印pmd和*pmd的值相关推荐

  1. 牛客网(剑指offer) 第三题 输入一个链表,从尾到头打印链表每个节点的值。

    //输入一个链表,从尾到头打印链表每个节点的值. //解题思路:遍历每一个节点  并将节点放入数组中 最后翻转数组 function printListFromTailToHead($head) {$ ...

  2. JVM实用参数(三)打印所有XX参数及值

    原文地址:https://blog.codecentric.de/en/2012/07/useful-jvm-flags-part-3-printing-all-xx-flags-and-their- ...

  3. 利用反射打印对象一般成员属性值

    为什么80%的码农都做不了架构师?>>>    利用反射打印对象一般成员属性值 public static void printVoOrDtoVal(Object obj){ Str ...

  4. 一个简单的方式打印数组中的所有值

    用简单的方式打印数组中的所有值,即利用 Arrays类的 tostring方法. 调用 Arrays.toString(a),返回一个包含数组元素的字符串,这些元素被放置在括号内,用逗号分隔. 要想打 ...

  5. Eclipse打印Java的char默认值,出现方框原因

    众所周知,Java为char赋值默认值(只有成员变量才会赋值,对于局部变量,不会有默认值),默认值就是'\u0000'.但是,我在Eclipse打印char默认值时,Eclipse的console显示 ...

  6. python——生成带logo的二维码图片并且保存、控制打印机打印图片二维码、整合打印(获取输入框的值)、打包成exe文件

    1.生成带logo的二维码图片并且保存 前提条件:在D盘里有logo.png的图片,生成的二维码图片在D盘里的111.png import qrcode from PIL import Image# ...

  7. 剑指offer66题 -- 输入一个链表,从尾到头打印链表每个节点的值

    class Solution { public: vector<int> printListFromTailToHead(ListNode* head) {   /*     //变量定义 ...

  8. String类型的数组打印数组名默认打印出来的是地址值怎么办,怎样打印出数组的元素

    String[] arr={"aa","dd"}; arr[0]="dd"; System.out.println(Arrays.toStr ...

  9. 静态分析工具PMD使用说明

    静态分析工具PMD使用说明 目录 静态分析工具PMD使用说明... 1 目录... 2 1.           编写目的... 3 2.           PMD简介... 4 3.        ...

最新文章

  1. 用.net中的socket实现文件传输
  2. 使用容器的正确方式,Docker在雪球的技术实践
  3. mysql、clickhouse读写分离性能测试
  4. android数据持久化存储(2)
  5. C++11新特性之lambda表达式
  6. python 作用域从大到小排序_Python 内置函数、作用域、闭包、递归
  7. 安卓案例:注册用户免启动时的广告页面
  8. 微服务架构开发实战:如何实现微服务的自动扩展?
  9. stm32g474教程_(完整版)STM32F103通用教程
  10. Linux/Unix系统下nginx+php安装简明教程
  11. mac mysql配置jdk_mac开发环境搭建
  12. http之content-type
  13. 中国团队入选美国物理学会2018年度国际物理学十大进展
  14. 路由重分布 rip,eigrp,和ospf
  15. 【数字图像处理】霍夫(Hough)变换
  16. c语言编程中%d怎么运用的,C语言格式符%d与%D的区别
  17. 程序员联合开发网 程序员创业指导书
  18. mysql变量赋值加冒号,mysql 冒号
  19. beetl 获取html属性值,Beetl2.7.16中文文档(2)之高级功能
  20. linux运维实习报告,it运维实习报告.docx

热门文章

  1. Python+经济学:柯布道格拉斯生产函数相关
  2. 采样定理 ADC采样
  3. javaScript字符串比较
  4. 矩阵合同,相似与等价 以及初等变换矩阵
  5. cannot connect to 192.168.137.137:5555: 由于目标计算机积极拒绝,无法连接。
  6. 基于域控的SSO单点登录
  7. offsetParent与parentElement ,parentNode,parentElement,childNodes和children
  8. EPLAN_语言翻译工具的使用
  9. Android游戏源码合集(主要是AndEngine和Libgdx的)
  10. Lab 0: Setting up a productive workflow