自己动手写操作系统第三章pmtest7源码解析——检测系统内存
摘要:在pmtest6.asm中,我们已经初步接触了分页机制,但是很显然,上述分页机制浪费比较严重,而且没有体现应有的用处。本节,我们主要介绍如何根据内存容量,恰当地分配页表。
一、理论基础
1.如何获取内存分布信息?
获取内存,需要用到dos下的int 15h中断,可以参考这里: http://blog.csdn.net/trochiluses/article/details/20078161
二、代码剖析
在pmtest7中,我们需要对代码结构作出一定的调整:
1、定义库文件:
在库文件lib.c中,定义如下函数:DispAL,DispReturn、DispInt、DispStr我们仍然采用分段的方式来分析比较陌生的代码:另外,我们定义了szPMMessage,接着,有这样一句汇编: push szPMMessage 这句对堆栈的改变是多少? 你要知道,这是push in stack的是地址,而不是具体的字符串。
2.DispInt和DispStr的原理有很大的不同:
1)Dispint中,堆栈中存放的直接是要显示的整数,但是,有几点需要注意 mov eax,[esp+4]中,采用的是ss寻址,而不是ds寻址;为什么esp需要+4,是因为经过call指令之后,堆栈顶部存放的不再是刚刚入栈的整数,而是EIP!!!2)DispStr中,堆栈中存放的是字符串的地址,同样ebp也是相对ss进行寻址的3)关于内存寻址符号[]? [esi]\[gs:edi]\[esp] 注意,内存寻址实际上采用的基地址+变址寻址。语法和对应的实际地址如下 [esi]---> ds:esi [idata]----->ds:idata [esp]-------->ss:esp [ax]------>error!! stosb------>es:edi lodsb------->ds:esi 当然,也可以直接指定段寄存器[gs:edi]
3.读取内存信息,确定内存上限的原理是什么?
注意:进行内存信息读取之前,我们需要明白,BIOS读取的内存地址都是64b的,所以,我们只使用低32位就可以了。另外,我们读取到的内存信息,并不是按照基地址从小到大排列的,所以我们要用 if(BaseAddrLow + LengthLow > MemSize) MemSize = BaseAddrLow + LengthLow; 这一句来检测内存上限(注意,这是内存地址的上限,而不是内存大小的上限)
4.理清代码跳转结构
s16code:init segment info,get meminfo, jmp to protect model:s code32 scode32:display szpmmessage,display title,display memsize, setuppageing,jmp code16 normal
自己动手写操作系统第三章pmtest7源码解析——检测系统内存相关推荐
- 线程池解析(三)——Worker源码解析
相关文章 线程池解析(一)--概念总结 线程池解析(二)--execute.addWorker源码解析 线程池解析(三)--Worker源码解析 线程池解析(四)--submit源码解析(Runnab ...
- 【vuejs深入三】vue源码解析之二 htmlParse解析器的实现
写在前面 一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. 昨天博主分析了一下在vue中,最为基础核心的api,parse函数,它的作用是将vue的模板字符串转换成ast,从而 ...
- 轻触开源(三)-Gson项目源码解析_贰
2019独角兽企业重金招聘Python工程师标准>>> 转载请注明出处:https://my.oschina.net/u/874727/blog/750473 Q:102525062 ...
- [深度学习] 自然语言处理 --- Self-Attention(三) 知识点与源码解析
在当前的 NLP 领域,Transformer / BERT 已然成为基础应用,而 Self-Attention 则是两者的核心部分,下面尝试用 Q&A 和源码的形式深入 Self-Atte ...
- 自己动手写CSDN博客提取器源码分析之三:处理网页保存为pdf文件
下面我讲下处理pdf文件的,这里我用了PD4ML来处理的,原因有几个:(1).它对CSS的支持做的很好:(2).可以处理图片(很爽吧)(3).可以处理中文,不过麻烦一些.基础的过程可以看我的另外一篇帖 ...
- 第三章 sysrepo-plugind源码分析
应用程序通过将对Sysrepo的调用通过Sysrepo提供的相应的API接口访问方法,称为Syrepo的间接访问方法.该方法是应用程序通过创建Deamon进程,通过IPC Shm机制与Sysrepo通 ...
- 第十一章 AtomicInteger源码解析
1.原子类 可以实现一些原子操作 基于CAS 下面就以AtomicInteger为例. 2.AtomicInteger 在没有AtomicInteger之前,对于一个Integer的线程安全操作,是需 ...
- java容器三:HashMap源码解析
前言:Map接口 map是一个存储键值对的集合,实现了Map接口的主要类有以下几种 TreeMap:用红黑树实现 HashMap:数组和链表实现 HashTable:与HashMap类似,但是线程安全 ...
- 全面剖析《自己动手写操作系统》第四章---加载Loader.bin
全面剖析<自己动手写操作系统>第四章--FAT12文件系统 http://blog.csdn.net/zgh1988/article/details/7284834 1.突破512字 ...
最新文章
- python中处理日期和时间的标准模块是-Python时间相关处理
- oracle instead of update触发器,Oracle中的instead of触发器
- js字符串替换_浅析Vue的生命周期以及JS异步
- SQLServer 事务复制中使用脚本添加某个对象的发布
- 跨域资源共享(CORS)--跨域ajax
- 【clickhouse】ClickHouse中的低基数(LowCardinality)类型
- java 顺序表的实现_顺序表的简单实现(Java)
- 单向链表存储方式下插入、删除、搜索
- perl 语言(数组)
- 51单片机c语言100例百度云,51单片机C语言编程100例.docx
- Panabit存在命令执行漏洞
- 《笑谈反病毒和病毒技术》
- 趣味密码学入门--cryptohack
- 梦想学院计算机,菲梦学院电脑版
- 计算机视觉领域摄像头布置,几种深度摄像头简介 | 增强视觉 | 计算机视觉 增强现实...
- 计算机开路人阿兰·图灵
- BiDi 算法详解及应用(一)
- 基础项目(10)BCD转二进制程序设计讲解
- 【电子电路基础实验】数码管
- 新斗罗大陆Linux楼高服务端+详细图文架设教程