一、8.分页

image-20230805141453894

当物理内存不够时就把不常用的内存暂时存入磁盘,并且描述符的P位置0,把要使用的段放入内存,描述符P位置1

但是这种方式会产生大量内存碎片,影响内存分配效率

设想一个虚拟内存,每隔任务都有他独立的虚拟内存,虚拟内存和实际物理内存大小相等

image-20230805143033518

image-20230805143639053

image-20230805145409103

image-20230805145350406

image-20230805150433539

image-20230805150641853

image-20230805150817405

image-20230805152040020

image-20230805152400522

image-20230805152555257

因为创建系统内核的页目录时,内核程序已经加载到内存了,为了方便起见,本书设定在内核的页部件输出的物理地址应与段部件输出的地址相同

页目录项和页表项的组成格式:

image-20230805162003098

  • P:存在位,为1时表示页表或页存在在内存中
  • RW:读写位,为1时可读可写
  • US:用户/管理位,为1时允许所有访问,0时只允许0、1、2特权级访问
  • PWT:和高速缓存有关,间接决定改善页面访问效率
  • PCD:决定是否采用高速缓存
  • A:已访问位,显示使用频率
  • D:脏位,表示次页表或页已写入数据
  • PAT:固定为0
  • G:全局位,表示是否为全局性质的,放入高速缓存,访问速度加快
		;准备打开分页机制;创建系统内核的页目录表PDT;页目录表清零 mov ecx,1024                       ;1024个目录项mov ebx,0x00020000                 ;页目录的物理地址xor esi,esi.b1:mov dword [es:ebx+esi],0x00000000  ;页目录表项清零 add esi,4loop .b1;在页目录内创建指向页目录自己的目录项mov dword [es:ebx+4092],0x00020003 ;在页目录内创建与线性地址0x00000000对应的目录项mov dword [es:ebx+0],0x00021003    ;写入目录项(页表的物理地址和属性)     

image-20230805163509714

		;创建与表目录项相对应的页表,初始化页表项 mov ebx,0x00021000                 ;页表的物理地址xor eax,eax                        ;起始页的物理地址 xor esi,esi.b2:       mov edx,eaxor edx,0x00000003                                                      mov [es:ebx+esi*4],edx             ;登记页的物理地址add eax,0x1000                     ;下一个相邻页的物理地址 inc esicmp esi,256                        ;仅低端1MB内存对应的页才是有效的 jl .b2	.b3:                                      ;其余的页表项置为无效mov dword [es:ebx+esi*4],0x00000000  inc esicmp esi,1024jl .b3 

image-20230805163929328

		;令控制寄存器CR3指向页目录,并正式开启页功能 mov eax,0x00020000                 ;PCD=PWT=0mov cr3,eaxmov eax,cr0or eax,0x80000000mov cr0,eax                        ;在PE=1的情况下(保护模式)PG置1,开启分页机制
		;在页目录内创建与线性地址0x80000000对应的目录项mov ebx,0xfffff000                 ;页目录自己的线性地址 mov esi,0x80000000                 ;映射的起始地址shr esi,22                         ;线性地址的高10位是目录索引shl esi,2mov dword [es:ebx+esi],0x00021003  ;写入目录项(页表的物理地址和属性);目标单元的线性地址为0xFFFFF200;将GDT中的段描述符映射到线性地址0x80000000sgdt [pgdt]mov ebx,[pgdt+2]or dword [es:ebx+0x10+4],0x80000000 ;保护模式下初始代码段描述符or dword [es:ebx+0x18+4],0x80000000 ;内核栈段描述符or dword [es:ebx+0x20+4],0x80000000 ;显示缓冲区描述符or dword [es:ebx+0x28+4],0x80000000 ;公共例程段描述符or dword [es:ebx+0x30+4],0x80000000 ;内核数据段描述符or dword [es:ebx+0x38+4],0x80000000 ;内核代码段描述符add dword [pgdt+2],0x80000000      ;GDTR也用的是线性地址 lgdt [pgdt]

image-20230806110915101

		;为程序管理器的TSS分配内存空间mov ebx,[core_next_laddr]call sys_routine_seg_sel:alloc_inst_a_pageadd dword [core_next_laddr],4096
alloc_inst_a_page:                          ;分配一个页,并安装在当前活动的;层级分页结构中;输入:EBX=页的线性地址push eaxpush ebxpush esipush dsmov eax,mem_0_4_gb_seg_selmov ds,eax;检查该线性地址所对应的页表是否存在mov esi,ebxand esi,0xffc00000shr esi,20                         ;得到页目录索引,并乘以4 or esi,0xfffff000                  ;页目录自身的线性地址+表内偏移 test dword [esi],0x00000001        ;P位是否为“1”。检查该线性地址是 jnz .b1                            ;否已经有对应的页表;创建该线性地址所对应的页表 call allocate_a_4k_page            ;分配一个页做为页表 or eax,0x00000007mov [esi],eax                      ;在页目录中登记该页表.b1:;开始访问该线性地址所对应的页表 mov esi,ebxshr esi,10and esi,0x003ff000                 ;或者0xfffff000,因高10位是零 or esi,0xffc00000                  ;得到该页表的线性地址;得到该线性地址在页表内的对应条目(页表项) and ebx,0x003ff000shr ebx,10                         ;相当于右移12位,再乘以4or esi,ebx                         ;页表项的线性地址 call allocate_a_4k_page            ;分配一个页,这才是要安装的页or eax,0x00000007mov [esi],eax pop dspop esipop ebxpop eaxretf  
allocate_a_4k_page:                         ;分配一个4KB的页;输入:无;输出:EAX=页的物理地址push ebxpush ecxpush edxpush dsmov eax,core_data_seg_selmov ds,eaxxor eax,eax.b1:bts [page_bit_map],eaxjnc .b2inc eaxcmp eax,page_map_len*8jl .b1mov ebx,message_3call sys_routine_seg_sel:put_stringhlt                                ;没有可以分配的页,停机 .b2:shl eax,12                         ;乘以4096(0x1000) pop dspop edxpop ecxpop ebxret

image-20230806120423774

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/25119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang pprof 监控系列—— cpu 占用率 统计原理

经过前面的几节对pprof的介绍,对pprof统计的原理算是掌握了七八十了,我们对memory,block,mutex,trace,goroutine,threadcreate这些维度的统计原理都进行了分析,但唯独还没有分析pprof 工具是如何统计cpu使用情况的,今天我们来分析…

[Pytorch]卷积运算conv2d

文章目录 [Pytorch]卷积运算conv2d一.F.Conv2d二.nn.Conv2d三.nn.Conv2d的运算过程 [Pytorch]卷积运算conv2d 一.F.Conv2d torch.nn.functional.Conv2d()的详细参数: conv2d(input: Tensor, weight: Tensor, bias: Optional[Tensor]None, stride: Union[_int, _s…

常见Charles在Windows10抓包乱码问题

废话不多说 直接开整 最近反复安装证书还是乱码 网上各种百度还是不行 首先计算机查看安装好的证书 certmgr.msc 找到并删除掉 重新安装证书 具体解决方法: 第一步:点击 【工具栏–>Proxy–>SSL Proxying Settings…】 第二步:配置…

C++路线(全网20篇高赞文章总结)

为节省时间,可直接跳转到 --> 🌼干货 目录 🌼前言 🌼来源 🐖现状 🌼干货 入门阶段 入门项目 学习顺序 🐉大二打算 🌼前言 来源的20篇博客,视频中&#x…

XML约束和解析

文章目录 概述使用场景语法dtd约束Schema约束解析DOM4j(重点) 概述 可扩展的标记性语言 使用场景 以前: 传输数据的媒介。 例如:微服务架构中,可以用xml文件进行多语言之间的的联系。 现在: 做配置文件 现在作为传输数据的媒介…

【java】使用maven完成一个servlet项目

一、创建项目 创建一个maven项目 maven是一个管理java项目的工具,根据maven的pom.xml可以引入各种依赖,插件。 步骤 打开idea,点击新建项目 点击创建项目,项目创建就完成了 进入时会自动打开pom.xml文件。 pom是项目的配置文件…

css, resize 拖拉宽度

效果如下&#xff1a; 可直接复制预览查看属性值: 关键样式属性&#xff1a; resize: horizontal; overflow-x: auto; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content…

【一次调频】考虑储能电池参与一次调频技术经济模型的容量配置方法(Matlab代码实现)

目录 &#x1f4a5;1 概述 1.1 文献来源 1.2 储能电池参与一次调频的方法 1.3 流程图 &#x1f4da;2 运行结果 2.1 数据 2.2 文献结果 2.3 复现结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码、数据、文章讲解 &#x1f4a5;1 概述 1.1 文献来源 摘要&#xff1a;规…

【学习笔记】Java安全之反序列化

文章目录 反序列化方法的对比PHP的反序列化Java的反序列化Python反序列化 URLDNS链利用链分析触发DNS请求 CommonCollections1利用链利用TransformedMap构造POC利用LazyMap构造POCCommonsCollections6 利用链 最近在学习Phith0n师傅的知识星球的Java安全漫谈系列&#xff0c;随…

Django实现音乐网站 ⑶

使用Python Django框架制作一个音乐网站&#xff0c;在系列文章2的基础上继续开发&#xff0c; 本篇主要是后台单曲、专辑、首页轮播图表模块开发。 目录 后台单曲、专辑表模块开发 表结构设计 单曲表&#xff08;singe&#xff09;结构 专辑表&#xff08;album&#xff0…

K8s集群安全机制(RBAC)

RBAC 基于角色的访问控制

MacBook触控板窗口管理 Swish for Mac

Swish for Mac是一款用于通过手势来控制mac应用窗口的软件&#xff0c;你可以通过这款软件在触控板上进行手势控制&#xff0c;你可以在使用前预设好不同手势的功能&#xff0c;然后就能直接通过这些手势让窗口按照你想要的方式进行变动了 Swish 支持 Haptick Feedback 震动反…

是什么让科大讯飞1个月股价翻倍?

目录 1、讯飞星火认知大模型的特点 2、讯飞星火认知大模型有多强大&#xff1f; 2.1、语言理解方面 2.2、知识问答方面 2.3、逻辑推理方面 2.4、数学题解答方面 2.5、代码理解与编写方面 3、如何使用讯飞星火认知大模型&#xff1f; 4、总结 我关注科大讯飞源于2021年…

接口测试——认知(一)

目录 引言 环境准备 1. 为什么要进行接口测试 2. 什么是接口 3. 接口测试与功能测试的区别 引言 为什么要做接口自动化测试&#xff1f; 在当前互联网产品迭代频繁的背景下&#xff0c;回归测试的时间越来越少&#xff0c;很难在每个迭代都对所有功能做完整回归。 但接…

Java抽象类和接口【超详细】

文章目录 一、抽象类1.1 抽象类概念1.2 抽象类语法1.3 抽象类特性1.4 抽象类的作用 二、接口2.1 接口的概念2.2 语法规则2.3 接口使用2.4 接口特性2.5 实现多个接口2.6 接口间的继承2.7 接口使用实例2.8Clonable 接口和深拷贝2.9 抽象类和接口的区别 一、抽象类 1.1 抽象类概念…

bash的特性(二)IO重定向与管道

bash的I/O重定向及管道 一、概述 在shell中&#xff0c;最常使用的fd(file descriptor)有三个&#xff0c;标准输入&#xff0c;标准输出&#xff0c;错误输出。进程用文件描述符来管理打开的文件。 名称 文件描述符 标准输入&#xff08;stdin) 0 键盘&#xff0c;也可以…

(十一)大数据实战——hadoop高可用之HDFS手动模式高可用

前言 本节内容我们介绍一下hadoop在手动模式下如何实现HDFS的高可用&#xff0c;HDFS的高可用功能是通过配置多个 NameNodes(Active/Standby)实现在集群中对 NameNode 的热备来解决上述问题。如果出现故障&#xff0c;如机器崩溃或机器需要升级维护&#xff0c;这时可通过此种…

DP-GAN剩余代码

在前面计算完损失后&#xff0c;该进行更新&#xff1a; 1&#xff1a;netEMA是模型的生成器&#xff1a; 遍历生成器的state_dict&#xff0c;将每一个键对应的值乘以EMA_decay。 接着根据当前迭代步数计算num_upd&#xff0c;每1000,2500,10000代倍数就执行一次。 当num…

❤ npm不是内部或外部命令,也不是可运行的程序 或批处理文件

❤ npm不是内部或外部命令,也不是可运行的程序 或批处理文件 cmd或者终端用nvm 安装提示&#xff1a; npm不是内部或外部命令,也不是可运行的程序或批处理文件 原因&#xff08;一&#xff09; 提示这个问题&#xff0c;有可能是Node没有安装&#xff0c;也有可能是没有配置…

ardupilot 中坐标变换矩阵和坐标系变换矩阵区别

目录 文章目录 目录摘要1.坐标变换矩阵与坐标系变换矩阵摘要 本节主要记录ardupilot 中坐标变换矩阵和坐标系变换矩阵的区别,这里非常重要,特别是进行姿态误差计算时,如果理解错误,很难搞明白后面算法。 1.坐标变换矩阵与坐标系变换矩阵 坐标变换矩阵的本质含义:是可以把…