实验四 获取C程序中一个逻辑地址对应的物理地址

实验四 获取C程序中一个逻辑地址对应的物理地址

实验环境

操作系统版本ubuntu-14.04.1-desktop-i386
下载连接http://old-releases.ubuntu.com/releases/trusty/ubuntu-14.04.1-desktop-i386.iso
实验课件及源码https://wwe.lanzouw.com/ilBQnyrwffi

一.实验目的

1、了解IA32架构中的逻辑地址映射机制,包括分段和分页
2、了解Linux的分段机制及其特色
3、理解并掌握Linux从线性地址到物理地址的映射机制

二.实验内容

1、通过添加内核模块来获取一个应用程序变量的物理地址,验证Linux中分页机制的设置和实现方法

三.实验步骤

1、logadd2phyadd_test.c为测试程序即应用程序,按普通方式编译和执行。
在这里插入图片描述

2、Logadd2phyadd.c为LKM内核模块,需要编译后通过insmod命令添加到系统中。
在这里插入图片描述

3、执行logadd2phyadd_test程序时,其中write语句会把要查找的虚拟地址addr发送给Logadd2phyadd模块;Logadd2phyadd将根据页表映射机制查找器物理地址,并返回给应用程序。
在这里插入图片描述

四.实验总结

此次实验的目的是了解IA32架构中的逻辑地址映射机制,包括分段和分页,了解Linux的分段机制及其特色,理解并掌握Linux从线性地址到物理地址的映射机制。
首先需要根据传入的参数pid进行find_get_pid调用,然后再调用pid_task获得该进程的task结构体指针。一个虚拟地址只有在进程自己的地址空间中才是有意义的。其次,根据进程的任务描述符进行地址映射。Linux内核3.13.0使用的是四级映射机制。在IA32架构上,PUD实际上不起作用。
然后,在四级页表映射完成之后计算该线性地址对应的物理地址,paddr = (pte_val(*pte_tmp) & PAGE_MASK) | (vaddr & ~PAGE_MASK);其中pte_val(*pte_tmp) & PAGE_MASK获得的是物理帧号,而vaddr & ~PAGE_MASK获得的则是在该物理帧内的偏移量。二者进行或操作后就得到了完整的物理地址。最后输出物理帧号、帧内偏移量等信息
需要特别注意的是,如果要输出实际物理地址包含的内容,不能直接使用该物理地址,正确的方式是进行地址变换后再获取指针所执的内存单元的内容。
通过这次实验使我了解了怎样通过添加内核模块来获取一个应用程序变量的物理地址,并且验证了Linux中分页机制的设置和实现方法,让我学到了很多。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值