pte

MIT-6.828 Lab2实验报告

匿名 (未验证) 提交于 2019-12-02 21:53:52
tags:mit-6.828 os 本文主要介绍lab2,讲的是操作系统内存管理,从内容上分为三部分: 第一部分讲的是物理内存管理,要进行内存管理首先需要知道哪些物理内存是空闲的,哪些是被使用的。还需要实现一些函数对这些物理内存进行管理。 第二部分讲的是虚拟内存。一个虚拟地址如何被映射到物理地址,将实现一些函数来操作页目录和页表从而达到映射的目的。 第三部分讲的是内核的地址空间。将结合第一部分和第二部分的成果,来对内核地址空间进行映射。 Part 1: Physical Page Management 通过lab1可以总结出如下的物理内存分布图: 大致上可以分为三部分: 0x00000~0xA0000:这部分叫做basemem,是可用的。 接着是0xA0000~0x100000:这部分叫做IO Hole,不可用。 再接着就是0x100000以上的部分:这部分叫做extmem,可用。 kern/pmap.c中的i386_detect_memory()统计有多少可用的物理内存,将总共的可用物理内存页数保存到全局变量npages中,basemem部分可用的物理内存页数保存到npages_basemem中。 Exercise 1: 需要我们写一个物理内存页的allocator。要求实现kern/pmap.c文件中的boot_alloc(),mem_init(),page_init()

保护模式中的PDE与PTE

萝らか妹 提交于 2019-12-02 00:05:47
Windows内核分析索引目录 :https://www.cnblogs.com/onetrainee/p/11675224.html 保护模式中的PDE与PTE 1. PDE与PTE的认知    我们在上一节,10-10-12模式中已经见过下表。    PDT(Page Direcotry Table)y页目录表,其中每一个成员被称为页目录表成员。    PTT(Page Table)页表,其中每一个成员被称为页表成员。       页目录表、页表与物理页,本质上都是页。   10-10-12模式遵循4KB大小的机制,即每一个页大小为4KB。     页目录表与页表存内存,所以可以一共有 1KB = 2^10个;而物理页存储字节,共存2^12个;因此10-10-12分页就是这么来的。 二、向零地址读写内存   我们有编程经验的人知道,零地址其实不可以读写的。   其本质原因是因为 00000000h 这个线性地址对应的物理地址没有挂靠物理页,也即对应的PTE=0,自然物理页索引就不存在。   但是,我们可以通过windbg往0地址中挂靠物理页,这样就很容易实现对零地址的内存读写。 测试代码 1 #include "stdafx.h" 2 3 int main(int argc, char* argv[]) 4 { 5 // 将X的物理页挂靠0地址上 6 int x = 1; 7

16_TLB与流水线

て烟熏妆下的殇ゞ 提交于 2019-12-01 22:38:04
1 前面做的实验起始有缺陷 访问内存之后,后面执行两句代码后;并不能保证刚才访问的代码还在TLB中;有可能被刷新出去了; 实验验证缺陷: 代码 不连续 TLB 被淘汰: 2万次中有1次被淘汰;由于访问代码不连续 代码: // 7_TLB_test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//​#include "pch.h"#include<stdio.h>#include<stdlib.h>#include<Windows.h>​#define PTE(x) ( (DWORD*)(0xc0000000 + ((x >> 12) << 3)))#define PDE(X) ( (DWORD*)(0xc0600000 + ((x >> 21) << 3))) DWORD g_out;DWORD g_OldPte[2];#pragma section("data seg", read, write)_declspec(allocate("data seg"))DWORD pagel[1024]; //41d000_declspec(allocate("data seg"))DWORD page2[1024]; //41c000//0x401000void _declspec(naked) IdtEntry(){// 保存旧的pte ,以用来恢复pte

18_ShadowWalker

给你一囗甜甜゛ 提交于 2019-12-01 22:37:49
白皮书中 page-fault error code: shadowWalker 原理: 接管 指定程序 的 执行页面异常、读写页面异常;然后 调用一下正常的 使其出现在快表;然后恢复到假的pte ------ 根据白皮书中 的error code 过滤出 执行、读写异常类型 相关: 将 402000 这个页面通过修改pte 设置为不存在(直接 给 p位置为 0);这样产生异常 我们接管 然后通过 0x10 判断 是否是执行异常;是的话,就将页面给挂上去。 全程接管 读写、执行异常 读写异常 -- 不能交给系统默认处理;因为系统有虚拟地址的管理,他可能以为还没有映射该页面或者可能被置换到磁盘文件等,再次映射;但是还是不是我们想要的正确的。 所以我们接管。 只接管 402000 页面(具体根据项目//后来我的项目是 412000) 因为其他页面也会产生异常;如果想把该程序的都接收,那么得区分出来分别处理,这里我们只处理一个页面就行;原理类似。 利用 TLB 使得瞬间正常,然后又恢复异常状态;不然只接管了一次。 #define K REAL PTEO 0x8003f3e4#define K REAL PTE1 0x8003f3e0#define K FAKE PTEO 0x8003f3dc#define K FAKE PTE1 0x8003f3d8DWORD g esp;DWORD 9

15_TLB中的G属性

强颜欢笑 提交于 2019-12-01 22:37:09
》 TLB 是为了增加访问内存的效率 即 如果 是 29 9 12 分页 请求数据 可能需要访问 4次内存;为了解决这个问题;出现了 TLB (虚拟地址到物理地址的转换关系),如果目标地址在TLB缓存中,那么直接从TLB 取出 物理地址; 》 这个实验做起来很麻烦,因为: TLB 是CPU 内部的,没法通过汇编指令访问TLB; 调试器,也没有办法知道 TLB 中有哪些项 只有通过实验现象 结果,来证明其存在。 内存访问的步骤: 》 注意 TLB 产生异常 3; 不会回到 2;而是产生 0x0E 异常。 1 简单实验查看 快表 带来的影响: 图解: 代码: // 7_TLB_test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//​#include "pch.h"#include<stdio.h>#include<stdlib.h>#include<Windows.h>​#define PTE(x) ( (DWORD*)(0xc0000000 + ((x >> 12) << 3)))#define PDE(X) ( (DWORD*)(0xc0600000 + ((x >> 21) << 3))) DWORD g_out;#pragma section("data seg", read, write)_declspec(allocate("data seg

self-mapping page tables

青春壹個敷衍的年華 提交于 2019-11-29 14:18:55
1. x86 10-10-12分页   很久之前就听说过页表的自映射机制,但始终不是很理解。直到昨天读了《Windows内核原理与实现》中内存管理一章才明白了其设计的思想。所以准备记录下来自己的理解。   首先我准备先从最简单的x86两级分页开始(x86 PAE\x64分页准备以后在写),首先x86未开启PAE模式的情况下最大能够索引4GB大小的空间,由于是10-10-12分页,因此PDE有2^10项(1024),每个PDE又能索引2^10项(1024)个PTE,因此描述4GB大小的内存空间总共需要2^20个页表,又因为再此分页模式下每项占4个字节,所以总共需要4MB大小的空间来存放页表。  Windows对页表的存储是在一块连续的4MB物理空间(且地址对齐),Windows将PTE的起始地址放在0xC0000000。由于这4M的页表描述了整个内存空间,而页表也属于这块物理内存的一部分,那么其中就肯定存在从某一项开始连续的1024项页表用来描述这4M的页表自身。如果我们将这1024项页表作为PDE,就节省了4K的PDE空间。实现了页目录表作为页表的复用。这就被称为页表自映射。  每个页表能够描述4KB大小的内存,因此就引出了一个PFN(page frame number)的一个概念,整个内存可以用这个PFN来描述,同时这个PFN又是PTE的索引。PTE_base =

ucore Lab2 实验笔记

风流意气都作罢 提交于 2019-11-29 04:57:51
ucore Lab2 lab 2 直接执行 make qemu-nox 会显示 assert 失败: kernel panic at kern/mm/default_pmm.c:277: assertion failed: (p0 = alloc_page()) == p2 - 1 1 连续物理内存管理 1.1 page 概览 对物理内存的管理,为了节省空间,也是为了配合接下来的虚拟内存管理,通常以某个比 byte 大一些的单位进行管理,我们称这一单位内存为一" 页(page) ",通常是 4KB.待 pages 初始化完毕后,物理内存示意图如下: 其中绿色代表可以分配的内存,红色代表不可被分配的内存.注意, ucore 规定物理内存可用范围最大不超过 KERNSIZE .函数 page_init 的主要作用就是初始化 pages 也就是所有 page 的所有信息. 注意, pages 以全局指针的形式存在,因为最开始无法知道 page 的数量,所以无法写成数量确定的数组.此数量必须尽快确认,否则后期无法管理. 如何确定 page 的数量 npage 呢? 1.1 探测物理内存布局,获取 pages 大小 npages 可由最大物理内存边界/PGSIZE 得出. 而最大物理内存边界可以借助 BIOS 可以探测并计算出来,参考 探测系统物理内存布局 和 实现物理内存探测