操作系统ucore实验----lab1

lab1操作系统启动过程实验指导书:https://chyyuu.gitbooks.io/ucore_os_docs/content/ucore源码以及参考答案:https://github.com/chyyuu/ucore_os_lab练习一:理解通过make生成执行文件的过程。question 1操作系统镜像文件ucore.img是如何一步一步生成的?(需要比较详细地解释Makef...
摘要由CSDN通过智能技术生成

lab1操作系统启动过程

实验指导书:https://chyyuu.gitbooks.io/ucore_os_docs/content/

ucore源码以及参考答案:https://github.com/chyyuu/ucore_os_lab

练习一:理解通过make生成执行文件的过程。

在这里插入图片描述

question 1

操作系统镜像文件ucore.img是如何一步一步生成的?(需要比较详细地解释Makefile中每一条相关命令和命令参数的含义,以及说明命令导致的结果)
这个练习只是要大家熟悉makefile以及make,不必完整的掌握makefile里面的源码,只需要知道那些命令是什么意思就够了,了解就好。这东西要你记也记不住,学习makefile和linux系统命令一样,不是一朝一夕久能学好的,需要时间的累积和经验的积累。

下面来进行分析
首先我们查看lab1下的Makefile文件
找到create ucrore.image
在这里插入图片描述

这个代码用到了两个块分别叫做kernel和bootblock,我们先展示不管这两个块的内容是什么,假设我们已经有这两个块了,先直接分析下面的代码,先全局再局部分析嘛

dd是一条linux命令指令:
dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。 conv=conversion:用指定的参数转换文件。 conv=notrunc:不截短输出文件

这里的意思就是说先创建一个大小为10000字节的内存块儿,然后再将bootblock和kernel拷贝过去

然后我们再去看看kernel和bootblock的内容

在这里插入图片描述
在这里插入图片描述
这里用到了很多函数 就不一一截图了,太麻烦,这两个部分主要就是通过gcc编译一些源码,源码在你的lab1/boot和lab1/kern中,暂时我们不用去追究源码写的什么内容,后面的实验会慢慢分析的。

在终端中执行输入 make V= 会看到ucore.image 的编译内容
正是我们之前说的先创建一个大小为10000字节的内存块儿,然后再将bootblock和kernel拷贝过去

在这里插入图片描述
其中相关参数的含义为:

  • ggdb 生成可供gdb使用的调试信息
  • m32生成适用于32位环境的代码
  • gstabs 生成stabs格式的调试信息
  • nostdinc 不使用标准库
  • fno-stack-protector 不生成用于检测缓冲区溢出的代码
  • 0s 位减小代码长度进行优化

question 2

一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?

查看lab1/tools/sign.c源代码

在这里插入图片描述
由31,32行代码看出、符合规范的硬盘主引导扇区的大小为512个字节,且最后两个字节为0x55、0xAA。

练习二:使用qemu执行并调试lab1中的软件。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这个实验我感觉只是练习一下gdb调试 跟着视频上做就好了,这个练习比较简单
1.首先修改 lab1/tools/gdbinit,内容为:


set architecture i8086

target remote :1234


意思是与qemu建立连接
2.在 lab1目录下,执行make debug

3.然后在gdb进行单步调试

4.gdb界面下,可通过如下命令来看BIOS的代码

x /2i $pc

练习2.2 在初始化位置0x7c00设置实地址断点,测试断点正常。

在tools/gdbinit结尾加上


b *0x7c00 //在0x7c00处设置断点。此地址是bootloader入口点地址,可看boot/bootasm.S的start地址处

c //continue简称,表示继续执行

x /5i $pc //显示当前eip处的汇编指令

set architecture i386 //设置当前调试的CPU是80386


在lab1目录下,运行make debug,可发现gdb打印出 the target architecture is assumed to be i386。

练习2.3 :从0x7c00开始跟踪代码运行,将单步跟踪反汇编得到的代码与bootasm.S和bootblock.asm进行比较

  1. 在tools/gdbinit结尾加上

b *0x7c00

c

x /10i $pc

  1. 在0x7c00会进行break&#x
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值