ucore_lab1实验报告

环境配置Ubuntu
ucore是一个清华大学出品的教学用操作系统。其以MIT的xv6&jos,harvard的os161,和linux为蓝本。
它循序渐进,适合操作系统的初学者,当然需要对c语言,计算机原理有一定的了解。
其源代码可以在https://github.com/chyyuu/ucore_lab上找到。clone下来是分门别类好的代码,答案,以及需要参考的文档。
在开始做题之前,还需要一些准备工作。

由于整个lab依托于gcc和qemu,所以只能在linux环境下进行。而且在开始之前,还需要先安装gcc和qemu。
我个人使用的是ubuntu 14.04,apt安装的方法:
sudo apt-get install build-essential
sudo apt-get install qemu-system
具体过程:
sudo apt update
在这里插入图片描述
sudo apt install build-essential:
在这里插入图片描述
用命令gcc –version查看是否安装成功:
在这里插入图片描述
sudo apt-get install qemu-sysytem
在这里插入图片描述
使用命令qemu-system-i386 --version查看qemu的版本:
在这里插入图片描述
练习1:
理解通过make生成执行文件的过程
列出本实验各练习中对应的OS原理的知识点,并说明本实验中的实现部分如何对应和体现了原理中的基本概念和关键知识点。
在此练习中,大家需要通过静态分析代码来了解:
操作系统镜像文件ucore.img是如何一步一步生成的?(需要比较详细地解释Makefile中每一条相关命令和命令参数的含义,以及说明命令导致的结果)
一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?

1.1操作系统镜像文件ucore.img是如何一步一步生成的?
生成ucore.img的代码为:

$(UCOREIMG): $(kernel) $(bootblock)
    $(V)dd if=/dev/zero of=$@ count=10000
    $(V)dd if=$(bootblock) of=$@ conv=notrunc
    $(V)dd if=$(kernel) of=$@ seek=1 conv=notrunc
    $(call create_target,ucore.img)

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

由上描述可以看出,首先先创建一个大小为10000字节的块,然后再将bootblock,kernel拷贝过去。然而生成ucore.img需要先生成kernel和bootblock.

Makefile通过一系列命令生成了bootblock和kernel这两个elf文件,之后通过dd命令将bootblock放到第一个sector,将kernel放到第二个sector开始的区域。可以明显看出bootblock就是引导区,kernel则是操作系统内核。
而在这之前还通过sign对bootblock进行了修饰,在512个字节的最后两个字节写入了0x55AA,作为引导区的标记。

生成bootlock的代码为:

$(bootblock): $(call toobj,$(bootfiles)) | $(call totarget,sign) 
    @echo "========================$(call toobj,$(bootfiles))"
    @echo + ld $@
    $(V)$(LD) $(LDFLAGS) -N -e start -Ttext 0x7C00 $^ -o $(call toobj,bootblock)
    @$(OBJDUMP) -S $(call objfile,bootblock) > $(call asmfile,bootblock)
    @$(OBJCOPY) -S -O binary $(call objfile,bootblock) $(call outfile,bootblock)
    @$(call totarget,sign) $(call outfile,bootblock) $(bootblock)

由上代码可得,到要生成bootblock,首先需要生成bootasm.o、bootmain.o、sign .

1.2一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?
查看sign.c源码:

buf[510] = 0x55;
buf[511] = 0xAA;
FILE *ofp = fopen(argv[2], "wb+");
size = fwrite(buf, 1, 512, ofp);
if (size != 512) {
   
    fprintf(stderr, "write '%s' error, size is %d.\n", argv
  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值