Lab2实验分享

article/2025/8/28 23:24:39

文章目录

        • 一.TLB访存机制
        • 二.二级页表
        • 三.Page存储结构
        • 四.自映射机制图示
        • 五.页面与地址的转化
        • 六.部分实验代码详解

一.TLB访存机制

当一个虚拟地址被送到MMU中进行翻译的时候,硬件首先在TLB中寻找包含这个地址的页面,如果它的虚页号在TLB中,并且没有违反保护位,那么就可以直接从TLB中得到相应的物理页号,而不去访问页表;如果发现虚页号在TLB中不存在,那么MMU将进行常规的页表查找,同时通过一定的策略来将这一页的页表项替换到TLB中,之后再次访问这一页的时候就可以直接在TLB中找到。

拿到了物理地址后,可以直接访问内存拿数据,不过会慢,所以,Cache就是部分物理地址到数据的映射。是内存的一部分copy。
在这里插入图片描述

二.二级页表

首先,c语言可以操作任何空间的地址,这个就是虚拟地址。

我们要做的就是模拟二级页表机制,往虚拟地址里面填写物理地址,再通过f(va)−>pa和f(pa)→va转换取到地址里面的东西。

简单来说,把放着很多很多页的虚拟地址,按照虚拟地址的索引,把它对应的物理地址放到另一个虚拟地址pgidr里。

这样就“假装”建立起了二级页表,物理地址从未使用过,要访问时永远要加上ULIM。

Page结构体其实是物理地址的一个“象征”。因为它减去pages拿到ppn以后,shift12位再加上ULIM,就是虚拟地址,减去ULM又变回物理地址。建立起来虚拟页和物理页之间的桥梁。尽管自己不是真正的4KB页,但是是桥梁。

三.Page存储结构

在这里插入图片描述

四.自映射机制图示

在这里插入图片描述

五.页面与地址的转化

在本次实验中涉及到许多的页面与地址的转化,其中用到许多已经定义的函数,现整理如下:

page2pa:得到某个page结构体的物理地址

/* Get the physical address of Page 'pp'.*/
static inline u_long
page2pa(struct Page *pp)
{return page2ppn(pp) << PGSHIFT;
}

pa2page:得到某个物理地址所对应的Page结构体

/* Get the Page struct whose physical address is 'pa'.*/
static inline struct Page *
pa2page(u_long pa)
{if (PPN(pa) >= npage) {panic("pa2page called with invalid pa: %x", pa);}return &pages[PPN(pa)];
}

page2kva:得到某个Page结构体的内核虚拟地址

/* Get the kernel virtual address of Page 'pp'.*/
static inline u_long
page2kva(struct Page *pp)
{return KADDR(page2pa(pp));
}

PPN:得到某个虚拟地址的页号

#define PPN(va)		(((u_long)(va))>>12)

PADDR:将某个内核虚拟地址转化为物理地址

// translates from kernel virtual address to physical address.
#define PADDR(kva)						\({								\u_long a = (u_long) (kva);				\if (a < ULIM)					\panic("PADDR called with invalid kva %08lx", a);\a - ULIM;						\})

KADDR:将某个物理地址转化为内核虚拟地址

// translates from physical address to kernel virtual address.
#define KADDR(pa)						\({								\u_long ppn = PPN(pa);					\if (ppn >= npage)					\panic("KADDR called with invalid pa %08lx", (u_long)pa);\(pa) + ULIM;					\})

本次实验的前半部分涉及了许多对这类函数的应用,熟练掌握这类函数实现各类地址查询是本次实验的一大难点。

六.部分实验代码详解

部分代码含义解释如下:

 1 #define BY2PG        4096             // 页面大小的Byte数,一个页面大小为4kb2 #define PDMAP        (4*1024*1024)    // 一个页表管理1024个页面,大小总共4*1024*1024Byte3 #define PGSHIFT        12             // 页面的偏移位数,4kb对应12位4 #define PDSHIFT        22        // 页表的偏移位数,同上,即log2(PDMAP)5 #define PDX(va)        ((((u_long)(va))>>22) & 0x03FF) // 取虚拟地址高10位,为页目录号6 #define PTX(va)        ((((u_long)(va))>>12) & 0x03FF) // 取虚拟地址高11~20位,为页表号7 #define PTE_ADDR(pte)    ((u_long)(pte)&~0xFFF) // 页表项取低12位,为页内偏移8 9 // page number field of address
10 #define PPN(va)        (((u_long)(va))>>12) // 物理页号,为虚拟地址偏移12位
11 #define VPN(va)        PPN(va) // 虚页号
12 
13 #define VA2PFN(va)        (((u_long)(va)) & 0xFFFFF000 )
14 #define PTE2PT        1024
15 //$#define VA2PDE(va)        (((u_long)(va)) & 0xFFC00000 )
16 
17 /* Page Table/Directory Entry flags
18  *   these are defined by the hardware
19  */
20 #define PTE_G        0x0100    // 全局位
21 #define PTE_V        0x0200    // 有效位
22 #define PTE_R        0x0400    // 修改位,如果是0表示只对该页面进行过读操作,否则进行过写操作,要引发中断将内容写回内存
23 #define PTE_D        0x0002    // 文件缓存的修改位dirty
24 #define PTE_COW        0x0001    // 写时复制copy on write
25 #define PTE_UC        0x0800    // 未缓存uncached
26 #define PTE_LIBRARY        0x0004    // 共享内存

其余的一些定义(异常码的解释略去):

 1 #define KERNBASE 0x80010000 // 内核基地址2 3 #define VPT (ULIM + PDMAP ) //4 #define KSTACKTOP (VPT-0x100) // 内核栈顶5 #define KSTKSIZE (8*BY2PG) // 内核栈大小6 #define ULIM 0x80000000 // 用户态地址上限7 8 #define UVPT (ULIM - PDMAP) // 9 #define UPAGES (UVPT - PDMAP) // 用户页表
10 #define UENVS (UPAGES - PDMAP) // 用户进程控制块
11 
12 #define UTOP UENVS // 用户态高地址
13 #define UXSTACKTOP (UTOP) // 用户态异常栈
14 #define TIMESTACK 0x82000000 // 上下文保存栈
15 
16 #define USTACKTOP (UTOP - 2*BY2PG) // 用户栈
17 #define UTEXT 0x00400000 // 用户代码段

最后是一些函数与函数宏:

  • void bcopy(const void *, void *, size_t):内存拷贝
  • void bzero(void *, size_t):内存清空
  • assert(x):支持断言机制。
  • TRUP(_p):相当于min(_p, ULIM),似乎是为了防止用户读写内核段内存。

在进行内存初始化时,mips_detect_memory()mips_vm_init()page_init()被依次调用。mips_detect_memory()用来初始化一些全局变量(此处将物理内存大小设置为64MB,在实际中,内存大小是由硬件得到的,这里只是模拟了检测物理内存大小这个过程)。其余的函数的功能为:

  • static void *alloc(u_int n, u_int align, int clear):申请一块内存,返回首地址。
  • static Pte *boot_pgdir_walk(Pde *pgdir, u_long va, int create):从页目录项中找出虚拟地址va对应的页表项,若create置位,则不存在时创建。
  • void boot_map_segment(Pde *pgdir, u_long va, u_long size, u_long pa, int perm):将虚拟地址va映射到物理地址pa
  • void mips_vm_init():创建一个二级页表。
  • void page_init(void):将内存分页并初始化空闲页表。
  • int page_alloc(struct Page **pp):分配一页内存并把值赋给pp。
  • void page_free(struct Page *pp):释放一页内存。
  • int pgdir_walk(Pde *pgdir, u_long va, int create, Pte **ppte):建立起二级页表结构后从页目录中找到va对应页表项的函数。
  • int page_insert(Pde *pgdir, struct Page *pp, u_long va, u_int perm):将物理页pp映射到va。
  • struct Page * page_lookup(Pde *pgdir, u_long va, Pte **ppte):找到虚拟地址va对应的物理页面。
  • void page_decref(struct Page *pp):降低物理页面的引用次数,降到0后释放页面。
  • void page_remove(Pde *pgdir, u_long va):释放虚拟地址va对应的页面。
  • void tlb_invalidate(Pde *pgdir, u_long va):更新TLB。

http://chatgpt.dhexx.cn/article/I2NnwrTU.shtml

相关文章

实验吧(1)

实验吧真是一个神奇的地方&#xff0c;里面的东西表示全部都看不懂&#xff0c;emmmmm &#xff0c;加油&#xff01;好好学习&#xff01; 案例&#xff1a;忘记密码了&#xff01; 在实验吧里面打开解题链接&#xff0c;然后就会跳转到一个输入密码的页面&#xff0c;当然你…

实验吧 认真一点

本实验是输入id获取结果&#xff0c;查看页面源码&#xff0c;没有什么注释信息。随便输入个1&#xff0c;结果为You are in ...............&#xff0c;其他的id显示为You are not in ............... 使用Burp suite进行模糊测试&#xff0c;结果为or部分sql命令都可以使用。…

实验吧_网站综合渗透_Discuz!

前言 这个一个实验吧中的环境&#xff0c;分值为50分&#xff0c;下面是题目说明。诶&#xff0c;发现自己很菜。 实验吧_网站综合渗透_dedecms解析地址 需要的学会或者已经掌握的知识 已知cms版本在线搜索通用漏洞掌握菜刀或者类似的工具的使用其他 题目说明 你是国内一流安…

实验吧-简单的登录题——WriteUp再研究

前言 这个题目的难点就是在于对于CBC加密方式尤其是解密这部分要琢磨一番&#xff0c;让我想起当年大学的时候信安三勇中的两勇的课&#xff0c;一门密码学&#xff0c;一门数学基础&#xff0c;可怕之极。这个题网上writeup一大堆&#xff0c;但是在一些方面解释的不是很详细…

实验吧-简单的登录题

前言 这是在实验吧上面的一道web题。主要考察cbc字节反转攻击。 分析 题目开始就是输入id去登录 首先想到的就是sql注入了,输入1后页面显示Hello,重新载入的话页面返回报错信息 确实存在注入,看那后面的逗号,猜测注入点在limit后面。然后试了很多,发现题目把union,#…

前端框架是什么意思?

说起前端框架&#xff0c;很多人都不知道是什么意思&#xff0c;下面本篇文章就来给大家介绍一下前端框架是什么意思&#xff1f;希望对大家有所帮助。 前端框架是什么意思&#xff1f; 前端框架一般指用于简化网页设计的框架&#xff0c;使用广泛的前端开发套件&#xff0c;比…

优秀的前端开发框架

优秀的前端开发框架 1.Vue Vue2文档&#xff1a;Vue.js Vue3文档&#xff1a;Vue.js - 渐进式 JavaScript 框架 | Vue.js 用于构建用户界面的渐进式框架 Vue的核心库只关注视图层。可与elementUI配合Element - The worlds most popular Vue UI framework 2.React 原先的Fa…

matplotlib 绘图 显示中文

参考: Matplotlib中正确显示中文的四种方式 在 matplotlib 中无法直接显示中文(比如使用: plt.xlabel(), plt.ylabel, plt.title()等) from matplotlib import pyplot as pltplt.plot(np.arange(5)) plt.xlabel(x 标签) plt.ylabel(y 标签) plt.title(标题) plt.show()运行上述…

Matplotlib入门:等高线图contour

import matplotlib.pyplot as plt import numpy as npdef f(x,y):return (1-x/2x**5y**3)*np.exp(-x**2-y**2)n 256 x np.linspace(-3,3,n) y np.linspace(-3,3,n)# 生成网格 X,Y np.meshgrid(x,y)# contourf 会在等高线之间进行填充 plt.contourf(X,Y,f(X,Y),8,alpha0.75,…

matplotlib设置坐标轴

import numpy as np设置x,y范围 x np.linspace(-3,3,100) y1 2*x 1 y2 x**2#xy范围 plt.xlim((-1,2)) plt.ylim((-2,3))plt.plot(x,y1,colorred,linewidth1.0,linestyle--) plt.plot(x,y2,colorblue,linewidth5.0,linestyle-) #color指的是线的颜色&#xff0c;linewidth指…

python安装matplotlib画图模块

在python中会使用很多图标的东西作为可视化输出的必不可少的内容。matplotlib提供了很好的图形化显示。 下面就如何快速安装matplotlib做一下简要的说明&#xff1a; 博主用的python版本是3.8.2 win R 输入 python 一般情况下我们用pip安装一些python模块的时候都会提示 先升…

Python Matplotlib 绘制表格

Python Matplotlib 绘制表格 ​ 最近因为开发一个项目&#xff0c;需要用到Matplotlib绘制一些图片和表格&#xff0c;网上找到的一些&#xff0c;感觉总差点意思&#xff0c;绘制个表格感觉有点过于麻烦&#xff0c;因此自己整理了下。 ​ 绘制方法直接使用Matplotlib绘制&a…

Matplotlib快速入门

1. Matplotlib 常用模块 Matplotlib 库中主要包含两个重要模块 pyplob 和 pylab。pyplot 是 Matplotlib 中的一个重要模块&#xff0c;在后续教程中&#xff0c;我们会经常使用 pyplot&#xff0c;该模块允许我们自动、隐式地创建图形及其轴&#xff0c;以实现所需的绘图&…

Matplotlib之Figure的使用

Matplotlib之Figure的使用 意义实现方法代码实例现象 拓展&#xff08;图像参数设置&#xff09;图像的展现曲线的展现代码及现象 意义 figure是画图的窗口&#xff0c;本文主要解决我们想多个窗口显示多样的数据时的问题 实现方法 代码实例 下面展示一些 内联代码片。 im…

matplotlib隐藏坐标轴

1. 隐藏x坐标轴 import matplotlib.pyplot as pltx [3, 4, 4, 6, 7, 8, 8, 12] y [11, 12, 12, 14, 17, 15, 14, 19]fig, ax plt.subplots(figsize(6, 6), dpi100)ax.scatter(x, y) # 显示辅助线 ax.grid(True) # 1. 隐藏x坐标轴 ax.get_xaxis().set_visible(False) fig.sh…

Matplotlib的颜色

Matplotlib的颜色 下面是一段代码示例&#xff1a; plt.figure() plt.rcParams[font.family] [SimHei] x [男, 女] y1 [923, 1013] y2 [1393, 1741] plt.bar(range(2), y1, width0.2, facecolorred, label糖尿病患者) plt.bar([i0.2 for i in range(2)], y2, width0.2, …

matplotlib

今天我们来介绍一下python的一个可视化工具matplotlib matplotlib 使用matplotlib的方式有很多&#xff0c;但最通常的是Pylab模式的ipython(-ipython –pylab) matplotlib的api都位于matplotlib.pyplot中&#xff0c;所以一般的引入方式为&#xff1a; import matplotlib.…

Matplotlib绘制动图

简介 Matplotlib是非常著名的Python绘图库&#xff0c;支持非常复杂的底层定制化操作。本文通过Matplotlib中的动画绘制工具来讲解如何绘制动态图&#xff0c;首先讲解通过交互模式如何显示动态图&#xff0c;继而讲解通过两个动画类来实现动图地保存&#xff08;GIF格式&…

python使用matplotlib绘图

文章目录 一、模块介绍二、模块安装三、主要API介绍设置绘图风格plt.style.use()新建画布plt.figure()绘制折线图plt.plot()绘制垂直柱状图plt.bar()绘制水平柱状图plt.barh()绘制饼状图plt.pie()绘制散点图plt.scatter()设置横纵坐标的标签plt.xlabel(), plt.ylabel()添加文字…

零基础学Python:Matplotlib用法

本文目录&#xff1a; 一、初识matplotlib二、线形图plot&#xff08;&#xff09;函数用法 三、散点图scatter()函数用法 四、饼状图pie&#xff08;&#xff09;函数用法 五、直方图hist()函数用法 前言&#xff1a; &#x1f4e2;&#x1f4e2;&#x1f4e2; &#x1f3c5;&…