操作系统——让操作系统走进保护模式

实验内容:

  1. 向软盘镜像文件写入一个你指定的文件,手工读取在磁盘中的信息
  2. 在软盘中找到指定的文件,读取其扇区信息
  3. 将指定文件装入指定内存区,并执行
  4. 学会在bochs中使用xxd读取反汇编信息

实验环境:

Ubuntu32位 + VMware Workstation

实验步骤:

  1. 向软盘镜像文件写入一个你指定的文件,手工读取在磁盘中的信息
  2. 在软盘中找到指定的文件,读取其扇区信息
  3. 将指定文件装入指定内存区,并执行
  4. 学会在bochs中使用xxd读取反汇编信息

实验的问题以及解决:

1.FAT12格式是怎样的?


其中,引导扇区的格式为:

引导扇区中决定了磁盘的基本信息,是FAT12格式的核心。

2.如何读取一张软盘的信息

要想读取软盘信息,最好的方法就是读取它的引导扇区。
引导扇区是软盘的第一个扇区,其中每个字节都有其对应的含义,结束标志为0xAA55。可以通过linux的xxd指令查看其内容。
Xxd的帮助文档如下:

查看a.img结果如下:

将其中不同字节的含义进行区分,就能得到软盘的信息。

3.如何在软盘中找到指定的文件

由于我们知道,FAT12文件系统存在FAT表和根目录,也就是说每一个文件的信息应该是被存储在这两个目录表中的,所以我们可以在表中查找文件的信息,之后根据表中的扇区号、簇号和偏移信息来查看文件内容。


在上图中,我在a.img这个软盘中插入了一个文件叫river.txt,可以看到,在根目录中存放了其信息,包括文件名称等,我们主要注意的是偏移为0x1A,长度为2的内容,含义为此条目对应的开始簇号。由于在这个文件系统中我们设置的是一个扇区对应一个簇,所以簇和扇区其实差不多。
可以看到,在这个例子里,开始簇号为0x0003,即3。也就是对应着数据区的3号簇。
根据定义,数据区开始扇区号 = 根目录区开始扇区号 + 14 = 33,但开始扇区号为2,我们是3号簇,所以我们的偏移为:
512 * 34 = 0x4400

找到啦!

4.如何在系统引导过程中,从读取并加载一个可执行文件到内存,并转交控制权?

读取,加载并转交 共有三步,我们一步一步分析。

读取:
首先需要从磁盘扇区中,找到可执行文件的位置。算法思路比较清晰,就是遍历更目录区所有的扇区,将每一个扇区加载入内存,然后从中寻找文件名为Loader.bin的条目。找到的那一刻,es:di是指向条目中字母N后面的那个字符。


当找到之后,代码停在死循环位置,即114行。
我们在bochs中debug一下这个程序,在此之前别忘了把Loader.bin文件放入软盘。

由于我们没有对这个程序的结尾进行什么输出,所以我们需要使用debug来观察是否匹配成功。

下断点,跳过BPB,查看此时的反汇编程序:

也就是说在0x7cad位置为程序死循环位置,我们在这里下一个断点,并查看es:di前后的内容。

这样看起来不太直观,我们直接查看字符内容:

看到了我们的文件名,此时继续查看当前寄存器es 和 di的值:

表示内存0x9012b处,说明我们成功找到了这个文件。

**加载:**找到之后,根目录区对我们就失去了作用,所以为了简化实验,我们直接选择将Loader程序覆盖在这个区域,也就是加载到BaseOfLoader:OffsetOfLoader处。装入扇区对我们来说并不复杂,但从FAT中找到一个项还是需要经过计算的。而且如果Loader较大,占用多个扇区的话,我们需要反复从FAT中找相应的项,所以我们使用一个函数来完成。

红框画出来的是区别对待扇区号是奇数还是偶数。
计算FAT的值的算法为:偏移 + SectorNoOfFAT1(FAT1的第一个扇区号)
偏移 = FATEntry所在的扇区相对于FAT的扇区号。(因为FAT不止占用一个扇区)
需要注意的是,由于一个FAT项可能跨越两个扇区,所以总是一次读取两个扇区。
下面开始加载:

首先理解为什么要有一个宏变量叫DeltaSectorNo。由于数据区的第一扇区号为2,所以在从FAT中获取了偏移量X之后,我们需要用 “X+RootDirSectors+19-2”来算出正确扇区号,我们将19-2=17定义为DeltaSectorNo,来简化代码篇幅。
上述程序将文件内容加载到内存中,结束条件如红框2所示,结束之后打印字符串“Ready.”

**移交控制权:**怎样才算移交控制权呢?那当然是看他有没有成功输出啦:

成功!
如果将pmtest9.asm编译之后的文件命名为loader.bin,也是可以运行的:

5.为什么需要这个Loader程序不包含dos系统调用?

我们设计Loader程序的初衷是来完成 引导->加载内核入内存->跳入保护模式->开始执行内核 的前三步,也就是说此时我们的操作系统内核并没有开始运行,所以Loader程序是不可能包含dos系统调用的,因为此时的dos都没准备好呢!

操作系统——让操作系统走进保护模式相关推荐

  1. 一步步编写操作系统 25 cpu的保护模式

    在保护模式下,我们将见到很多在实模式下没有的新概念,很多都是cpu硬件原生提供,并且要求的东西,也就是说按照cpu的设计,必须有这些东西cpu才能运行.咱们只要了解它们是什么并且怎么用就行了,不用深入 ...

  2. 自制操作系统(五) 保护模式寻址原理、字符鼠标指针显示

    首先就是对前一天程序的一些优化,引入了结构体: struct BOOTINFO {char cyls, leds, vmode, reserve;short scrnx, scrny;char *vr ...

  3. Linux下的实模式和保护模式

    实模式:(即实地址访问模式)它是Intel公司80286及以后的x86(80386,80486和80586等)兼容处理器(CPU)的一种操作模式.实模式被特殊定义为20位地址内存可访问空间上,这就意味 ...

  4. 操作系统学习:实模式进入保护模式

    本文参考书籍 1.操作系统真相还原 2.Linux内核完全剖析:基于0.12内核 3.x86汇编语言 从实模式到保护模式 ps:基于x86硬件的pc系统 保护模式相关介绍 从实模式进入保护模式其实经历 ...

  5. 操作系统引导--从实模式到保护模式

    从开始到保护--系统开机引导 ------没有一个文档能写的通俗易懂,我希望写出来. 开机引导和实模式: 两个星期加上假期吐血整理,所述为计算机的开机引导,其中包括一系列计算机内存设置等等,由于没有老 ...

  6. 我是如何学习写一个操作系统(三):操作系统的启动之保护模式

    前言 上一篇其实已经说完了boot的大致工作,但是Linux在最后进入操作系统之前还有一些操作,比如进入保护模式.在我自己的FragileOS里进入保护模式是在引导程序结束后完成的. 实模式到保护模式 ...

  7. x86从实模式到保护模式 pdf_【自制操作系统04】从实模式到保护模式

    通过前三章的努力,我们成功将控制权转交给了 loader.asm 这个程序.具体说就是 bios 通过加载并跳转到 0x7c00(IMB大叔们定的) 把控制权转交给了我们操作系统的第一个汇编程序 mb ...

  8. 《自己动手写操作系统》读书笔记——初识保护模式

    <自己动手写操作系统>读书笔记--初识保护模式 http://www.cnblogs.com/pang123hui/archive/2010/11/27/2309930.html 书本第三 ...

  9. 从零开始操作系统------探析保护模式

    本文基于郑纲的<操作系统还原>,仅为个人学习笔记,前期的虚拟机配置等不再详细记录,其中不理解或者出错的地方还望提出意见! 从零开始操作系统------MBR直操硬盘.内核加载器 为什么有保 ...

最新文章

  1. 解决WAMP搭建PHP环境后后局域网其他机器无法访问的问题
  2. curl可以访问但httpclient不能访问_exta进程不能访问+ASM实例的解决方法
  3. 重装IDEA再也不愁了,一招搞定同步个人配置!
  4. 没学过python、但是还是有公司要-学习python 基础都会了 为什么还是做不出项目呢?...
  5. Administer Service Cloud
  6. Oracle 行列转换
  7. 处理器管理与进程管理
  8. html5svg在线编辑器,SVG to Canvas在线转换工具
  9. 关于数据库的设计的一点思路
  10. php smarty2 框架,PHP CodeIngiter 2.x.x 框架与 Smarty 3.x.x 模板引擎整合
  11. mysql root 登录权限管理_MySQL基础教程(7)MySQL用户与权限管理
  12. sql语句ding_SQL语句映射文件增删改查、参数、缓存
  13. mybatis对mysql进行分页
  14. Spring Boot 集成Shiro和CAS
  15. IGBTMOS管的工作原理及检测方法
  16. windows下的流氓软件删得彻底点
  17. 输入一个字符串,输出该字符串中字符的所有组合。(腾讯2014笔试附加题)
  18. vue 自定义指令v-directive
  19. 自动控制原理02 数学模型
  20. 【无标题】wo断层了,为了自己错误买单

热门文章

  1. JAVA中堆和栈的区别和联系
  2. 华为鸿蒙系统发布,附演讲全文
  3. html+css过渡案例案例一
  4. Mac Allure配置及使用-解决allure版本不兼容导致无法打开报告
  5. 数据可视化之美——《纽约时报》的一天
  6. 男人穿衣不可不知的20条规律
  7. 用计算机绘制函数图象教案,信息技术应用 用计算机画函数图象教案设计(一等奖)...
  8. MATLAB中imageDatastore
  9. ios隐藏标题栏方式
  10. 一个对文本信息统计的熵增验证程序