系统软件开发实践实验报告(计科-4 徐竹) 联系客服

发布时间 : 星期三 文章系统软件开发实践实验报告(计科-4 徐竹)更新完毕开始阅读d324b7a60722192e4536f6b0

《系统软件开发实践》 实验报告 第11页

可以用QEMU来模拟一个完整的系统,同时,也可以用QEMU来实现系统源码级的调试:

要想深入理解ucore,就需要了解支撑ucore运行的硬件环境,即了解处理器体系结构(了解硬件对ucore带来影响)和机器指令集。ucore目前支持的硬件环境是基于Intel 80386以上的计算机系统。

80386有四种运行模式:实模式、保护模式、SMM模式和虚拟8086模式。这里对涉及ucore的实模式、保护模式做一个简要介绍。

实模式:80386加电启动后处于实模式运行状态,在这种状态下软件可访问的物理内存空间不能超过1MB,且无法发挥Intel 80386以上级别的32位CPU的4GB内存管理能力。实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,操作系统和用户程序并没有区别对待,而且每一个指针都是指向实际的物理地址。

保护模式:实际上,80386就是通过在实模式下初始化控制寄存器,GDTR,LDTR,IDTR与TR等管理寄存器以及页表,然后再通过加载CR0使其中的保护模式使能位置位而进入保护模式的。当80386工作在保护模式下的时候,其所有的32根地址线都可供寻址,物理寻址空间高达4GB。在保护模式下,支持内存分页机制,提供了对虚拟内存的良好支持。保护模式下80386支持多任务,还支持优先级机制,不同的程序可以运行在不同的优先级上。优先级一共分0~3 4个级别,操作系统运行在最高的优先级0上,应用程序则运行在比较低的级别上;配合良好的检查机制后,既可以在任务间实现数据的安全共享也可以很好地隔离各个任务。

80386是32位的处理器,即可以寻址的物理内存地址空间为2^32=4G字节。在理解操作系统的过程中,需要用到三个地址空间的概念。地址是访问地址空间的索引。物理内存地址空间是处理器提交到总线上用于访问计算机系统中的内存和外设的最终地址。一个计算机系统中只有一个物理地址空间。线性地址空间是每个运行的应用程序看到的地址空间,在操作系统的虚存管理之下,每个运行的应用程序都认为自己独享整个计算机系统的地址空间,这样可让多个运行的应用程序之间相互隔离。处理器负责把线性地址转换成物理地址。

在Ubuntu Linux中的C语言编程主要基于GNU C的语法,通过gcc来编译并生成最终执行文件。

GNU make(简称make)是一种代码维护工具,在大中型项目中,它将根据程序各个模块的更新情况,自动的维护和生成目标代码。make命令执行时,需要一个 makefile (或Makefile)文件,以告诉make命令需要怎么样的去编译和链接程序。首先,我们用一个示例来说明makefile的书写规则。以便给大家一个感兴认识。这个示例来源于gnu的make使用手册,在这个示例中,我们的工程有8个c文件,和3个头文件,我们要写一个makefile

-

《系统软件开发实践》 实验报告 第12页

来告诉make命令如何编译和链接这几个文件。只要我们的makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自己编译所需要的文件和链接目标程序。

三、实验步骤与分析

根据一个操作系统的设计实现过程,我们可以有如下的实验步骤:

1.启动操作系统的bootloader,用于了解操作系统启动前的状态和要做的准备工作,了解运行操作系统的硬件支持,操作系统如何加载到内存中,理解两类中断--“外设中断”,“陷阱中断”等;

2.物理内存管理子系统,用于理解x86分段/分页模式,了解操作系统如何管理物理内存; 3.虚拟内存管理子系统,通过页表机制和换入换出(swap)机制,以及中断-“故障中断”、缺页故障处理等,实现基于页的内存替换算法;

4.内核线程子系统,用于了解如何创建相对与用户进程更加简单的内核态线程,如果对内核线程进行动态管理等;

5.用户进程管理子系统,用于了解用户态进程创建、执行、切换和结束的动态管理过程,了解在用户态通过系统调用得到内核态的内核服务的过程; 6.处理器调度子系统,用于理解操作系统的调度过程和调度算法;

7.同步互斥与进程间通信子系统,了解进程间如何进行信息交换和共享,并了解同步互斥的具体实现以及对系统性能的影

响,研究死锁产生的原因,以及如何避免死锁;

8.文件系统,了解文件系统的具体实现,与进程管理等的关系,了解缓存对操作系统IO访问的性能改进,了解虚拟文件系统(VFS)、buffer、cache和disk、driver之间的关系。

其中每个开发步骤都是建立在上一个步骤之上的,一步步完成从理解操作系统原理到实践操作系统设计与实现的探索过程。

实验五(第五周) 操作系统实验(Lab1实验)

一、实验目的

通过分析和实现这个bootloader和ucore OS我们可以了解:

1、计算机原理中CPU的编址与寻址、基于分段机制的内存管理CPU的中断机制以及外设(串口/并口/CGA,时钟,硬盘);

2、Bootloader软件中编译运行bootloader的过程、调试bootloader的方法、PC启动bootloader的过程、 ELF执行文件的格式和加载、外设访问:读硬盘,在CGA上显示字符串;

-

《系统软件开发实践》 实验报告 第13页

3、ucore OS软件编译运行ucore OS的过程、ucore OS的启动过程、调试ucore OS的方法、函数调用关系(在汇编级了解函数调用栈的结构和处理过程)、中断管理(软件相关的中断处理)、外设管理(时钟)。

二、实验说明

ucore的运行环境可以是真实的X86计算机,不过考虑到调试和开发的方便,我们可采用X86硬件模拟器。

(ucore系统结构图)

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

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

-

《系统软件开发实践》 实验报告 第14页

├── boot 引导扇区的代码 ├── kern 操作系统内核代码

├── Lab1 代码树 libs JOS的C代码库

├── tools 代码测试工具和脚本

├── Makefile 代表整体组装运行的过程

三、OS启动过程分析

PC加电启动:Bochs模拟硬件,可以通过修改Bochs的配置调整硬件。BIOS运行,BIOS程序被Bochs加载到0xF0000-0x100000处于实模式下,寻址空间1M检查和初始化硬件,加载引导扇区到0000:7c00 –0000:7dff;

引导扇区(即BootLoader)执行:BIOS的最后一条指令是跳转到0x7c00处,把CPU控制权交给了BootLoader程序,实模式转换为保护模式,加载内核文件;

内核开始执行:初始化内核数据结构,运行终端。

CPU加电 BIOS从0xffff0开始执行,进行硬件测试、初始化设备等将boot loader拷贝于0x7c00,跳转后进入boot loader 执行BIOS boot/boot.s完成实模式到保护模式的切换; boot/main.c载入内核于0x10000跳转后执行内核 执行boot loader kern/entry.S设置GDT,初始化堆栈 进入kernel (操作系统启动流程图)

三、实验过程与详细分析

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

首先说一下操作系统镜像文件 ucore.img 是如何一步一步生成的:linux系统下在命令行中输入“make V=”即可看到生成过程,下面我以流程图的方式分步骤一一说明下操作系统镜像文件的生成过程:

首先把C语言的源代码进行编译成为.o文件,也就是目标文件

-