操作系统-ucore-lab1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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.一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?