MIT 6.828操作系统学习笔记01——Lab1

Lab 1: Booting a PC

Part 1: PC Bootstrap

第一个练习的目的是让你能够更加熟悉x86汇编语言,以及PC启动的整个过程,而且也会首次学习使用QEMU软件来仿真xv6操作系统,并且配合GDB对操作系统的运行进行调试。在lab的这个部分,你将不用编写任何的代码。

开始学习x86汇编语言

由于x86汇编语言在我们这节实验中扮演了非常重要的角色,大二的时候我曾经学过一些最最基本的汇编语言,看懂一些命令还是没问题的。MIT官方为我们提供了一个关于汇编语言的参考资料,里面基本介绍了汇编语言的方方面面,你可以把这本书作为一个工具书,或者直接上网查。

如果没有任何汇编基础,建议还是看一看书,推荐王爽的《汇编语言》,把一些基础的指令看懂。汇编语言只在Lab1用到的比较多,后面是Lab大多还是用C语言来写的,所以也不必过分担心。

Exercise 1:

练习1并没有什么实质性内容,就是MIT建议我们要对汇编语言有个大致的了解,这样才能让后面的学习更加方便一点。

仿真X86计算机

这门课采用软件模拟的方式来调试整个操作系统,也就是说让xv6操作系统运行在一个用软件仿真出来的x86计算机上。这个仿真软件就是QEMU,这个仿真器有一个非常好的优点,就是它能和调试器GDB共同配合使用,这样的话我们就可以一条指令一条指令的调试运行在QEMU里面的xv6操作系统了。关于如何编译安装QEMU的过程,在我的上一篇博文中已经写过了,不会的可以去了解一下。

利用QEMU来运行xv6操作系统

安装好QEMU之后,我们就可以用它来运行我们的操作系统啦~

开始工作之前,要先把代码克隆到本地。同样,官方提供的仓库地址没办法使用,我在Github上找到了Mirror并且fork到我的仓库中了。 地址:https://github.com/chenat9/at-jos.git

创建一个你要存放代码的目录

mkdir ~/6.828

克隆仓库到本地

git clone https://github.com/chenat9/at-jos.git

cd at-jos.git

然后我们就要先编译这个操作系统源码,来生成能够运行在Qemu上的操作系统映像文件,我们只需要在lab目录下输入命令

make

这样计算机会为我们自动编译整个xv6操作系统,如果你的屏幕上显示下列信息,代表你已经编译成功啦

但是我的计算机显示了错误,如图 输入图片说明

出现这两个错误的原因是我的计算机是64位系统,所以要安装下面的依赖库:

sudo apt-get install gcc-multilib

如果你没有更改成国内速度比较快的源,这个过程会比较慢,更改方法,同样参见我的Tools博文。

安装完依赖库,重新编译,成功通过。

输入图片说明

可以看到在某个文件夹下生成了kernel.img文件,这个就是我们的操作系统的镜像文件。

最后启动操作系统。依然在此文件夹下运行

make qemu

稍等几秒可以看到以下界面,证明你已经成功了!!!

JOS

到目前为止,你已经完成了在ubuntu上仿真x86计算机,并且运行JOS操作系统内核了。

PC机的物理地址空间

此部分我的文章中就不涉及理论知识的部分了,因为我掌握的也不是太好,大家可以去看官方文档,或者Google一些中文翻译来看。我直接进入下一部分。

The ROM BIOS

在这一部分,我将使用QEMU的debug功能去分析PC机的启动过程。

打开两个终端窗口,其中一个输入 make qemu-gdb (或者 make qemu-nox-gdb)。这个命令将会启动QEMU makegdb 但是在处理器开始执行第一条指令,并且等待GDB的连接前,QEMU是处于停止状态的。在第二个终端窗口中,在同一目录下运行make 或者 make gdb ,可以看到如下界面: make

来分析一下图中的指令

[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b

这是在GDB中第一条被执行的汇编指令,由此你可以推断出:

  • PC机在地址 0x000ffff0 处开始执行, 这是ROM BIOS所保留的64KB空间中最高处。

  • PC机开始启动时, 两个寄存器的值为 CS = 0xf000 IP = 0xfff0.

  • 第一条被执行的命令是一条跳转指令, 跳转到了如下地址 CS = 0xf000 and IP = 0xe05b.

那么为什么QEMU是这么启动的呢?

这要从CPU的设计说起,BIOS被固定在PC机 0x000f0000-0x000fffff 地址范围内,这个设计确保了机器启动时,硬件可以去固定的地址空间去得到指令。处理器重置,进入实模式并且设置 CS寄存器为 0xf000 ,IP寄存器为 0xfff0。

接下来再讲就涉及到地址转换的部分了,我还没有系统的了解透彻, 所以先不涉及了。

Exercise 2:

使用GDB的'si'命令(单步调试命令 Step Instruction),去追踪ROM BIOS几条指令,并且试图去猜测,它是在做什么。但是不需要把每个细节都弄清楚。

我在Terminal中输入si,可以看到窗口中依次打印出汇编指令。

si

关于这些汇编指令的分析,说实话,我也不会,我在网上搜的资料,对照着理解。

我的学习记录,也是参照着MIT官方文档,和这个博客的文章逐步进行的。在此感谢博客主人,如有侵权,联系我删除。

Excercise 2 Answer : http://www.cnblogs.com/fatsheep9146/p/5078179.html

本人也是在学习过程中记录下来的学习笔记,

如有错误和遗漏,请发邮件:chenat9@foxmail.com 批评指正。

转载于:https://my.oschina.net/neilchennn/blog/867832

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值