操作系统-ucore-lab1

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

HUNAN UNIVERSITY

操作系统

实验报告

目录

一、内容 (2)

二、目的 (2)

三、实验设计思想和流程 (3)

四、主要文件结构说明 (4)

五、实验环境以及实验过程与结果分析(包含实验详细过程) (4)

练习1:理解通过make生成执行文件的过程 (4)

练习2:使用qemu执行并调试lab1中的软件。 (6)

练习3:分析bootloader进入保护模式的过程。 (9)

练习4:分析bootloader加载ELF格式的OS的过程。 (11)

练习5:实现函数调用堆栈跟踪函数 (14)

练习6:完善中断初始化和处理 (16)

六、实验体会 (18)

一、内容

lab1中包含一个bootloader和一个OS。这个bootloader可以切换到X86保护模式,能够读磁盘并加载ELF执行文件格式,并显示字符。而这lab1中的OS只是一个可以处理时钟中断和显示字符的幼儿园级别OS。

为了实现lab1的目标,lab1提供了6个基本练习和1个扩展练习,要求完成实验报告。二、目的

操作系统是一个软件,也需要通过某种机制加载并运行它。在这里我们将通过另外一个更加简单的软件-bootloader来完成这些工作。为此,我们需要完成一个能够切换到x86的保护模式并显示字符的bootloader,为启动操作系统ucore做准备。lab1 提供了一个非常小的bootloader和ucore OS,整个bootloader执行代码小于512个字节,这样才能放到硬盘的主引导扇区中。通过分析和实现这个bootloader和ucore OS,读者可以了解到:

计算机原理

CPU的编址与寻址: 基于分段机制的内存管理

CPU的中断机制

外设:串口/并口/CGA,时钟,硬盘

Bootloader软件

编译运行bootloader的过程

调试bootloader的方法

PC启动bootloader的过程

ELF执行文件的格式和加载

外设访问:读硬盘,在CGA上显示字符串

ucore OS软件

编译运行ucore OS的过程

ucore OS的启动过程

调试ucore OS的方法

函数调用关系:在汇编级了解函数调用栈的结构和处理过程

中断管理:与软件相关的中断处理

外设管理:时钟

三、实验设计思想和流程

依照实验指导书完成了六个对应练习:

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

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

练习3:分析bootloader进入保护模式的过程

练习4:分析bootloader加载ELF格式的OS的过程练习5:实现函数调用堆栈跟踪函数

练习6:完善中断初始化和处理

四、主要文件结构说明

五、实验环境以及实验过程与结果分析(包含实验详细过程)

实验环境为:LINUX_64系统。

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

1.操作系统镜像文件ucore.img是如何一步一步生成的?(需要比较详细地解释Makefile

中每一条相关命令和命令参数的含义,以及说明命令导致的结果)

# create ucore.img

UCOREIMG := $(call totarget,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)

//为了生成bootblock,首先需要生成bootasm.o、bootmain.o、sign

$(bootblock): $(call toobj,$(bootfiles)) | $(call totarget,sign) @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)

$(call create_target,bootblock)

(1)通过GCC编译器将Kernel目录下的.c文件编译成OBJ目录下的.o文件。

(2)ld命令根据链接脚本文件kernel.ld将生成的*.o文件,链接成BIN目录下的kernel文件

(3)通过GCC编译器将boot目录下的.c, .S文件以及tools目录下的sign.c文件编译成OBJ 目录下的*.o文件。

(4)ld命令将生成的*.o文件,链接成BIN目录下的bootblock文件。

(5)dd命令将dev/zero, bin/bootblock,bin/kernel 写入到bin/ucore.img

注:/dev/zero文件代表一个永远输出 0的设备文件,使用它作输入可以得到全为空的文件。因此可用来创建新文件和以覆盖的方式清除旧文件。下面使用dd命令将从zero设备中创建一个10K大小(bs决定每次读写1024字节,count定义读写次数为10次),但内容全为0的文件。dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

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

相关文档
最新文档