IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 30天自制操作系统:第九天 内存管理 -> 正文阅读

[Java知识库]30天自制操作系统:第九天 内存管理

1 整理源文件(harib06a)

这里仅仅是对文件进行了一些整理,查看下图即可。
在这里插入图片描述

2 内存容量检查(1)(harib06b)

内存管理在操作系统中是一大块,既是重点也是难点,所以作者也花了较大的篇幅进行介绍。

要进行内存管理,首先要做的事情就是搞清楚内存究竟有多大,范围是到哪里。如果连这一点都搞不清楚的话,内存管理就无从谈起。

在最初启动时,BIOS肯定要检查内存容量,所以我们只要问一问BIOS,就能知道内存容量有多大,但问题是,如果那样做的话,一方面asmhead.nas会变长,另一方面,BIOS版本不同,BIOS函数的调用方法也不相同,麻烦事情比较多,所以自己去检查内存。

介绍一种做法。(这段内容是作者介绍高速缓冲存储器Cache,介绍它的目的是为了能够帮助我们理解为什么在检查内存之前需要关闭它,由于内容偏向于介绍性,所以直接截取原书中的内容)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将AC标志位置0时,用到了AND运算,那里出现了一个运算符“~”,它是取反运算符。为了禁止缓存,需要对CR0寄存器的某一标志位进行操作,对哪里操作,怎么操作,都在程序中有了体现,需要用到函数load_cr0store_cr0,这两个函数也只能用汇编来写(如下图所示)。
在这里插入图片描述

此外,memtest_sub函数,时内存检查处理的实现部分。
在这里插入图片描述
这个程序所做的是:调查从start地址到end地址的范围内,能够使用的内存的末尾位置。做的检查很简单。首先如果p不是指针,就不能指定地址去读取内存,所以要先执行 “p = i;” ,紧接着使用这个p,将原值保存到变量old中,接着试写 0xaa55aa55,在内存里反转该值,检查结果是否正确,如果正确,就再次反转它,检查一下能否能恢复到初始值。最后,使用old变量,将内存的值恢复回去。如果在某个环节没能恢复成预想的值,那么就在那个环节终止调查,并报告终止时的地址。

i的值每次增加4是因为每次要检查四个字节,之所以把变量命名为pat0、pat1是因为这些变量表示测试时所用的几种形式。

运行可以发现速度相当慢,对代码进行优化:
在这里插入图片描述
改变的内容只是for语句中 i 的增值部分以及p的赋值部分。每次只检查4,就要检查全部内存,速度太慢了,所以改成了每次增加0x1000,相当于4KB,这样一来速度提升了1000倍。p的赋值计算式也变了,这是因为,如果不进行任何改变仍写作p = i的话,程序就只会检查4KB最开头的4个字节,所以要改成p = i + 0xffc;,让它只检查末尾的4个字节。毕竟在系统启动时内存就已经被仔细检查过了,所以像这次这样,目的只是确认容量的话,做到如此程度就足够了,甚至可以每次检查1MB都没什么问题。
在这里插入图片描述

3 内存容量检查(2)(harib06c)

这一小节作者着重讲述了为什么会出现上面的那个情况(内存容量不对),由于讲解非常详细,这里也贴上原书的解释。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
汇编程序这里需要仔细按照旁边的注释去理解。

4 挑战内存管理(harib06d)

这里牵涉到非常多的算法,难度一般,如果有OS基础的话理解起来还是不咋难的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-24 10:24:23  更:2021-09-24 10:24:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 18:31:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码