摘要:在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源码解析——检测系统内存相关推荐

  1. 线程池解析(三)——Worker源码解析

    相关文章 线程池解析(一)--概念总结 线程池解析(二)--execute.addWorker源码解析 线程池解析(三)--Worker源码解析 线程池解析(四)--submit源码解析(Runnab ...

  2. 【vuejs深入三】vue源码解析之二 htmlParse解析器的实现

    写在前面 一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. 昨天博主分析了一下在vue中,最为基础核心的api,parse函数,它的作用是将vue的模板字符串转换成ast,从而 ...

  3. 轻触开源(三)-Gson项目源码解析_贰

    2019独角兽企业重金招聘Python工程师标准>>> 转载请注明出处:https://my.oschina.net/u/874727/blog/750473 Q:102525062 ...

  4. [深度学习] 自然语言处理 --- Self-Attention(三) 知识点与源码解析

    在当前的 NLP 领域,Transformer / BERT 已然成为基础应用,而 Self-Attention  则是两者的核心部分,下面尝试用 Q&A 和源码的形式深入 Self-Atte ...

  5. 自己动手写CSDN博客提取器源码分析之三:处理网页保存为pdf文件

    下面我讲下处理pdf文件的,这里我用了PD4ML来处理的,原因有几个:(1).它对CSS的支持做的很好:(2).可以处理图片(很爽吧)(3).可以处理中文,不过麻烦一些.基础的过程可以看我的另外一篇帖 ...

  6. 第三章 sysrepo-plugind源码分析

    应用程序通过将对Sysrepo的调用通过Sysrepo提供的相应的API接口访问方法,称为Syrepo的间接访问方法.该方法是应用程序通过创建Deamon进程,通过IPC Shm机制与Sysrepo通 ...

  7. 第十一章 AtomicInteger源码解析

    1.原子类 可以实现一些原子操作 基于CAS 下面就以AtomicInteger为例. 2.AtomicInteger 在没有AtomicInteger之前,对于一个Integer的线程安全操作,是需 ...

  8. java容器三:HashMap源码解析

    前言:Map接口 map是一个存储键值对的集合,实现了Map接口的主要类有以下几种 TreeMap:用红黑树实现 HashMap:数组和链表实现 HashTable:与HashMap类似,但是线程安全 ...

  9. 全面剖析《自己动手写操作系统》第四章---加载Loader.bin

    全面剖析<自己动手写操作系统>第四章--FAT12文件系统    http://blog.csdn.net/zgh1988/article/details/7284834 1.突破512字 ...

最新文章

  1. python中处理日期和时间的标准模块是-Python时间相关处理
  2. oracle instead of update触发器,Oracle中的instead of触发器
  3. js字符串替换_浅析Vue的生命周期以及JS异步
  4. SQLServer 事务复制中使用脚本添加某个对象的发布
  5. 跨域资源共享(CORS)--跨域ajax
  6. 【clickhouse】ClickHouse中的低基数(LowCardinality)类型
  7. java 顺序表的实现_顺序表的简单实现(Java)
  8. 单向链表存储方式下插入、删除、搜索
  9. perl 语言(数组)
  10. 51单片机c语言100例百度云,51单片机C语言编程100例.docx
  11. Panabit存在命令执行漏洞
  12. 《笑谈反病毒和病毒技术》
  13. 趣味密码学入门--cryptohack
  14. 梦想学院计算机,菲梦学院电脑版
  15. 计算机视觉领域摄像头布置,几种深度摄像头简介 | 增强视觉 | 计算机视觉 增强现实...
  16. 计算机开路人阿兰·图灵
  17. BiDi 算法详解及应用(一)
  18. 基础项目(10)BCD转二进制程序设计讲解
  19. 【电子电路基础实验】数码管
  20. 新斗罗大陆Linux楼高服务端+详细图文架设教程

热门文章

  1. 芯片设计中的latch_为什么ICG Cell中使用锁存器(Latch),而不使用触发器(Flip Flop)?...
  2. 《WEB开发-HEXO博客搭建》第3章 Hexo博客域名添加
  3. 链表逆序(拷贝和插入)
  4. Twitter的网页代码
  5. 11-20什么是内网,外网,局域网,如何判断
  6. asynchronous socket error 10053错误及解决方法
  7. 第35篇 网络(五)获取本机网络信息
  8. 二维码扫码登录的原理
  9. Unity 射线与碰撞范围检测【踩坑记录】
  10. Kafka不丢失数据与不重复消费数据