首页 > 其他分享 >[hit-oslab] 实验7-地址映射-实验记录

[hit-oslab] 实验7-地址映射-实验记录

时间:2024-11-24 10:30:18浏览次数:7  
标签:hit 框号 虚拟地址 地址映射 物理地址 地址 实验 ldt ds

Bochs常用调试命令

b [addr]		// 加断点于[addr]
c				//继续运行
ctrl+c			// 暂停运行
n              	// 单步运行
回车			// 继续上次的命令
r				// 查看常用寄存器信息
sreg           	// 查看段寄存器信息
q				// 退出 debug

按照实验指导,将test.c导入到linux0.11的用户目录下,打开调试,在0.11中编译,运行。发现一直在循环。
在这里插入图片描述
↑ 0.11中

在这里插入图片描述
↑ 调试器中

终端上显示的代码是下一行将要执行的代码(还未执行)。

所以当前下一句是cmp dword ptr ds:0x3004, 0x00000000 ; 833d0430000000。这句话是反汇编的结果,意思是拿虚拟地址ds:0x3004的值跟0比。通过之前亲手导入的test.c,我们知道如果相等则退出死循环。所以现在的目的就是在这个环境下找出虚拟地址ds:0x3004所对应的物理地址是多少,利用bochs的setpmem指令将那个物理地址上的内容改为0,再继续运行一句,linux0.11就可以退出死循环。这就是该实验的目的。

取巧

由于bochs里面的命令很多、很强大,所以如下图,两句话就把地址拿到了。
在这里插入图片描述
当然这对知识的增长毫无帮助。

正解

先查段表,得到虚拟地址,再查页表,得到物理地址。

step1. 找到段表(LDT)地址

在这里插入图片描述

关注这一行:ldtr:s=0x0068, dl=0x52d00068, dh=0x000082fd, valid=1
这个ldtr是什么:寄存器,里面的某些位包含当前进程的ldt表的首地址。即,切换了它就切换了用户的段表。(类比PC,切换了PC就切换了用户代码)
ldtr的结构如下图
在这里插入图片描述
0x0068=0000000001101|0|00,意思是,要去GDTR中找,第(1101)2项,其实就是第13项。

在这里插入图片描述
按照下图,

在这里插入图片描述
拼一拼凑一凑:
在这里插入图片描述

所以LDT首地址是:0x00fd52d0

step2. 查到ds真实值

ds是段基址,值就在ldt表中,首先打出ldt表的内容。

那么代表ds的是哪个呢?
拿出一开始的截图:
在这里插入图片描述
ds=0x0017=0000000000010|1|11,所以在ldt表中查第三项。那就是0x00003fff 0x10c0f300

再拼一拼凑一凑:
在这里插入图片描述

所以ds真实值为0x10000000
加上偏移,所以变量i的虚拟地址为:0x10003004

验证:
在这里插入图片描述

step3. 虚拟地址转物理地址

这里实验指导写的十分清晰:
在这里插入图片描述

step4. 找页框号

IA-32 下,页目录表的位置由 CR3 寄存器指引。“creg”命令可以看到:
在这里插入图片描述
页目录表首地址是0

找第65个项

在这里插入图片描述
这就是页目录号

页目录表和页表中的内容很简单,是 1024 个 32 位(正好是 4K)数。这 32 位中前 20 位是物理页框号,后面是一些属性信息(其中最重要的是最后一位 P)。

所以页表地址为 0x00fa7000

在这里插入图片描述
所以页框号为 0x00fa6000

页框号+偏移为最终答案0x00fa6004

ref

https://www.lanqiao.cn/courses/115(实验地址)
https://blog.csdn.net/genzld/article/details/90672003(图1.1)
https://blog.csdn.net/weixin_53159274/article/details/137796343(Bochs命令)

标签:hit,框号,虚拟地址,地址映射,物理地址,地址,实验,ldt,ds
From: https://blog.csdn.net/weixin_45339670/article/details/143999756

相关文章

  • 实验4 类的组合、继承、模板类、标准库
    1.实验二:GradeCalc.hpp#include<iostream>#include<vector>#include<string>#include<algorithm>#include<numeric>#include<iomanip>usingstd::vector;usingstd::string;usingstd::cin;usingstd::cout;usingstd::endl......
  • 实验4
    task21#include<iostream>2#include<vector>3#include<string>4#include<algorithm>5#include<numeric>6#include<iomanip>78usingstd::vector;9usingstd::string;10usingstd::cin;......
  • 实验4 类的组合、继承、模板类、标准库
    任务一task1_1.cpp#include<iostream>usingstd::cout;usingstd::endl;//类A的定义classA{public:A(intx0,inty0);voiddisplay()const;private:intx,y;};A::A(intx0,inty0):x{x0},y{y0}{}voidA::display()const{co......
  • 实验四 类的组合,继承,模板类,标准库
    一、实验目的 知道什么是类模板,会正确定义和使用简单的类模板会使用C++正确定义,使用派生类加深对类的组合机制(has-a),类的继承机制(is-a)的领悟和理解练习标准库string,vector的用法,能基于问题场景灵活使用针对具体场景,练习运用面向对象思维进行设计,组合使用标准库和自定义类,......
  • 无加密的机密性:Chaffing and Winnowing原理和C#实验仿真
    最近在Crypto2023上看到一篇有趣的文章[1],其旨在一个存在拥有所有密钥并知道所有消息的“独裁者”的信道中,通过安排与常规密文无法区分的隐藏的“变形”消息来进行机密通信的方法——变形签名,但由于本人技术水平有限无法完整实现整个系统。而当阅读到其中的一个技术分支——......
  • 实验4 类的组合、继承、模板类、标准库
    实验任务1task1_1.cpp#include<iostream>usingstd::cout;usingstd::endl;//类A的定义classA{public:A(intx0,inty0);voiddisplay()const;private:intx,y;};A::A(intx0,inty0):x{x0},y{y0}{}voidA::display()const{......
  • 实验四
    1#include"GradeCalc_2.hpp"2#include<iomanip>34voidtest(){5intn;6cout<<"输入班级人数:";7cin>>n;89GradeCalcc1("OOP",n);1011cout<<"录入成绩:&quo......
  • OOP实验四
    任务2:源码:1#include<iostream>2#include<vector>3#include<string>4#include<algorithm>5#include<numeric>6#include<iomanip>78usingstd::vector;9usingstd::string;10usingstd::cin;......
  • 实验4 类的组合、继承、模板类、标准库
     task2:GradeCalc.hpp: #include<iostream>#include<vector>#include<string>#include<algorithm>#include<numeric>#include<iomanip>usingstd::vector;usingstd::string;usingstd::cin;usingstd::cout;using......
  • 希冀 操作系统 实验lab1 内核、Boot和printf(保姆级教程 建议点赞收藏 )
    这次我把所有代码都写出来方便大家复制(可以直接复制我的代码粘贴到终端执行)开始之前首先先拉取lab1的内容(一定先干这个,不然做不了实验!!!!!!!!!!!!!!!!)先切换到这个目录下cd20221105894-lab变为:输入gitpullgitcheckoutlab1 之后刷新一下你的学号-lab文件夹,如果改变了就好了,如果......