Presentation is loading. Please wait.

Presentation is loading. Please wait.

操作系统实验 lab1-系统引导 2016-3-1.

Similar presentations


Presentation on theme: "操作系统实验 lab1-系统引导 2016-3-1."— Presentation transcript:

1 操作系统实验 lab1-系统引导

2 实验相关

3 联系方式 授课教师 实验助教 课程助教: 徐锋-系楼817 叶保留-系楼616 王瑶菁 (直博生二年级 系楼812-10)
QQ: 课程助教: 席圣渠(812-9)…

4 课程网站 http://moon.nju.edu.cn/people/yaojingwang/static/OS/mai n.html
到我的主页跳转: 课程主页跳转: 实验提交网址: 虚拟机下载地址:

5 实验内容安排 实验一: 系统引导 实验二: 系统调用 实验三: 进程与中断 实验四: 并发控制 实验五(选做): 文件系统
完成实验五可获得加分

6 实验要求 实验内容要求: 实验报告需要写出整个程序的设计思路。不要在实验报告 中粘贴大段的代码,只粘贴那些你觉得十分重要,值得一 提的部分,并配以文字说明。也可以增加一些额外的内容, 例如截图、视频、心得体会或是意见建议。但不要把无关 的文件(临时文件、虚拟机镜像等)提交。 你在实现的过程中,遭遇的难题、致命的bug,导致它们 的原因、最后解决的方法,以及从中的收获或教训。 独立完成,不要相互抄袭

7 实验要求 实验报告提交规范: 提交的文件打成一个压缩包(zip),包含 lab 和 report 两个文件夹
压缩包以自己的学号和姓名命名,格式为 “labX-学号姓名”。 /lab中存放最终版本的源代码。历史版本、最终 版本中,需要包括编译脚本、所有源文件,但不 应该包括任何二进制文件。 /report中存放实验报告

8 实验架构 操作系统实验 操作系统模拟器: QEMU 操作系统: Debian 虚拟机软件: VisualBox
操作系统: Windows/Mac 真实硬件

9 实验一-系统引导

10 实验目的 实验目的: 掌握开发环境,能独立的完成开发环境的配 置 学习如何在Linux环境下编写、调试程序 学习AT&T汇编程序的特点
通过阅读相关的文档和手册,初步掌握vim 编辑器、shell命令、GNU make、GNU binutils和GNU GDB的使用方法。 理解系统引导程序的含义,理解系统的启动 过程 理解系统的内存布局

11 实验内容 实验内容: 在理解操作系统启动的基础之上,分析系统 启动的过程,并开发出运行在没有操作系统 和运行库的计算机上的简单应用程序。
关键代码分为启动部分(bootloader)和应用 部分(app)

12 实验内容 第一部分: 简单的引导程序 第二部分: 将磁盘程序片段加载 到内存并运行 第二部分运行流程
实现一个简单的引导程序, 完成 从实模式到保护模式的跳转并输 出”Boot: Hello world!” 引导程序: Loading… 读扇区内容并加载到内存 解析 ELF 文件并加载程序 第二部分: 将磁盘程序片段加载 到内存并运行 引导程序: Executing… 跳转运行用户程序 在引导程序中, 将磁盘第2号扇区 以后的用户程序(ELF 文件格式) 加载到堆栈的位置, 再通过解析 这段 ELF 文件将其加载到内存 的相应位置并运行 用户程序: Process: Hello world! 返回引导程序 引导程序: Back to Boot

13 计算机体系结构基本知识

14 80386简介 回顾实模式 实模式下的寄存器集合 寻址空间与寻址方式 通用寄存器 段寄存器 状态和控制寄存器 寻址空间
实际物理地址 = (段寄存器 << 4) + 偏移地址 MOV AX,ES:[1200H] CS=0x0000: IP=0x7c00 和CS=0x0700: IP=0x0c00 以及 CS=0x07c0: IP=0x0000所寻址的地址是完全相同的!

15 80386简介(续) 回顾实模式 实模式下的中断 中断向量表存放在物理内存开始的位置 (0x0000---0x03ff)
总共最多可以有256个中断向量 00h---04h 号中断向量为系统专用 08h---0fh 硬件中断(8259A使用) 10h---1fh BIOS使用 20h---3fh DOS使用 如常用的 int 21h 40h---ffh 用户使用

16 80386简介(续) 一个实模式下用户程序的 例子 各个段在物理上必须是连 续的
装载程序在将程序装入时 需要按照具体的装载位置 设置CS、DS、SS

17 80386简介(续) 实模式系统存在的问题 安全性问题 分段机制本身的问题
程序采用物理地址来实现访存功能,而无法 实现对任务的代码和数据的保护 一个程序可以通过改变段寄存器和偏移寄存 器修改不属于自己的代码或者数据,甚至操 作系统 分段机制本身的问题 段必须是连续的,从而无法利用零碎的空间 段的大小有限制,从而限制了代码的规模

18 80386简介(续) 保护模式带来的变化 保护模式下的寄存器 通用寄存器(从16位扩展到32位) 段寄存器(维持16位)
EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP 段寄存器(维持16位) CS、DS、SS、ES、FS、GS 状态和控制寄存器(32位) EFLAGS、EIP、CR0、CR1、CR2、CR3 系统地址寄存器 GDTR、IDTR、TR、LDTR 调试与测试寄存器

19 80386简介(续) 8086的寄存器 80386的寄存器 通用寄存器 段寄存器 段描述符寄存器 状态和控制寄存器 系统地址寄存器
AX、BX、CX、DX、SP、BP、DI、SI EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP 段寄存器 CS、DS、SS、ES CS、DS、SS、ES、FS、GS 段描述符寄存器 对程序员不可见 状态和控制寄存器 FLAGS 、IP EFLAGS、EIP、CR0、CR1、CR2、CR3 系统地址寄存器 GDTR、IDTR、TR、LDTR 调试寄存器 DR0--DR7 测试寄存器 TR0--TR7

20 80386简介(续) 寻址方式的变化 在保护模式下,分段机制是利用一个称作段 选择子的偏移量到全局描述符表中找到需要 的段描述符,而这个段描述符中就存放着真 正的段的物理首地址,然后再加上偏移地址 量便得到了最后的物理地址。 一般保护模式段式寻址可用xxxx:yyyyyyyy 表示。其中xxxx表示索引,也就是段选择子, 是16位的;yyyyyyyy是偏移量,是32位的。 段选择子(xxxx)为段寄存器,如CS、DS、 SS、ES、FS、GS;偏移量(yyyyyyyy)是 一个32位寄存器,如ESI、EDI、EBP、ESP。

21 80386简介(续) 80386以及以后的处理器专门设计了一个寄存器 GDTR(Global Descriptor Table Register),专 门用于存储全局描述符表在内存中存放的位置。

22 80386简介(续) 段描述符 段基址为2,3,4,7字节,共32位。
段限长为0,1以及6字节的低四位,共20位,段限长即段最大长度,与属性G共同确定。G = 0时描述符中的20位段限长为实际段限长,最大限长为1MB(0-FFFFFh)。G = 1则 32位段限长为描述符中的20位乘以4KB,即段限长左移 12位后加上FFFH,最大限长为 4GB。 段描述符 每个描述符为8个字节(8×8=64位) 代码段和数据段的描述符

23 80386简介(续) 段描述符的属性 D/B:对于不同类型段含义不同。
在可执行代码段中,这一位叫做D位,D = 1使用32位地址和32/8位操作 数,D = 0使用16位地址和16/8位操作数。 在向下扩展的数据段中,这一位叫做B位,B = 1段的上界为4GB,B = 0 段的上界为64KB。 在描述堆栈段的描述符中,这一位叫做B位,B = 1使用32位操作数,堆 栈指针用ESP,B = 0使用16位操作数,堆栈指针用SP。 AVL:Available and Reserved Bit,通常设为0。 P:存在位,P = 1表示段在内存中。 DPL:描述符特权级,取值0 ~ 3共4级。0特权级为最高,而3特权级 为最低,表示访问该段时CPU所需处于的最低特权级,我们在后面 会详细讨论特权级的问题。 S:描述符类型标志,S = 1表示代码段或者数据段;S = 0表示系统 段(TSS、LDT)和门描述符。

24 80386简介(续) 描述符类型 TYPE和S结合使用,可以表示的描述符类型有:代码段、数据段、 TSS、LDT、中断门(Interrupt Gate)、陷阱门(Trap Gate)、 调用门(Call Gate)、任务门(Task Gate)。 当S = 1,TYPE < 8时 当S = 1,TYPE < 8时 TYPE 说明 十进制值 E W A 数据段 只读 1 只读,已访问 2 读/写 3 读/写,已访问 4 只读,向下扩展 5 只读,向下扩展,已访问 6 读/写,向下扩展 7 读/写,向下扩展,已访问 TYPE 说明 十进制值 C R A 代码段 8 1 只执行 9 只执行,已访问 10 执行/读 11 执行/读,已访问 12 只执行,一致 13 只执行,一致,已访问 14 执行/读,一致 15 执行/读,一致,已访问

25 80386简介(续) 安全性问题 x86平台CPU有0、1、2、3四个特权级,其中level0是 最高的特权级,可以执行所有指令;
而level3则是最低的特权级,只能执行算术逻辑指令, 很多特殊的操作(如CPU模式转换以及I/O操作指令) 都不能在这个级别下进行。 现代操作系统在实际中往往只需使用到level0和level3 两个特权级,具体的就是操作系统内核运行时系统处 于level0(即CS寄存器的末两位为00),而用户程序 运行是系统是处于level3的(即CS的末两位为11)。 将在第二次实验中进行详细讲述。

26 Lab1-系统引导

27 操作系统的架构 以Unix为例

28 系统的启动 物理内存的分布 物理内存的 0x000A0000 - 0x00100000为VGA显 示存储、BIOS ROM以 及扩展ROM
物理内存的高端 0xefffffff-0xffffffff往往 被PCI设备的外设I/O所 占据。

29 系统的启动(续) BIOS的加载 80386在设计的时候必须考虑向下兼容性, 所以80386以及其后的机器在启动后,仍 然是处于实模式;
在PC启动的时候,首先会在实模式下运 行BIOS;

30 系统的启动(续) BIOS加载完成后…… BIOS主要完成系统自检、以及启动前的准备 工作(如让各个设备做好准备工作)
BIOS的工作完成后,BIOS将会读取硬盘的 MBR(Master Boot Record,硬盘的第0柱 面、0磁道、0扇区。512字节)到内存的 0x7c00到0x7dff的位置(被装入的程序又被 称为Boot Loader),紧接着再执行一个跳 转指令将CS设置为0x0000,IP设置为 0x7c00,即刚被装入的Boot Loader 找到lab中Boot loader的程序

31 系统的启动(续) lab 中的 bootloader
bootloader的源程序是由一个叫做的 start.S的AT&T汇编程序与一个叫做 boot.c的C程序组成的。 start.S主要是将处理器从实模式转换到 32位的保护模式,这是因为只有在保护 模式中我们才能访问到物理内存高于 1MB的空间; boot.c的主要作用是将内核的可执行代码 从硬盘镜像中读入到内存中。

32 系统的启动(续) ELF文件头 .text节:可执行指令的部分 .rodata节:只读全局变量部分 .stab节:符号表部分
.stabstr节:符号表字符串部分 .data节:可读可写的全局变量部 分 .bss节:未初始化的全局变量部 分,这一部分不会在磁盘有存储 空间,因为这些变量并没有被初 始化,因此全部默认为0,于是 在将这节装入到内存的时候程序 需要为其分配相应大小的初始值 为0的内存空间 .comment节:注释部分,这一 部分不会被加载到内存

33 系统的启动(续) ELF文件头的数据结构 struct Elf { uint32_t e_magic; // 标识文件是否ELF文件
uint8_t e_elf[12]; // 魔数和相关信息 uint16_t e_type; // 文件类型 uint16_t e_machine;// 针对体系结构 uint32_t e_version; // 版本信息 uint32_t e_entry; // Entry point 程序入口点 uint32_t e_phoff; // 程序头表偏移量 uint32_t e_shoff; // 节头表偏移量 uint32_t e_flags; // 处理器特定标志 uint16_t e_ehsize; // 文件头长度 uint16_t e_phentsize;// 程序头部长度 uint16_t e_phnum; // 程序头部个数 uint16_t e_shentsize;// 节头部长度 uint16_t e_shnum; // 节头部个数 uint16_t e_shstrndx; // 节头部字符索引 }; ELF文件头的数据结构 e_entry是可执行程序的 入口地址 e_phoff和e_phnum可以 用来找到所有的程序头表 项 e_phoff是程序头表的第 一项相对于ELF文件的开 始位置的偏移 e_phnum则是表项的个数 e_ shoff和e_ shnum可以 用来找到所有的节头表项

34 系统的启动(续)

35 系统的启动(续) Step #0 Boot loader

36 系统的启动(续) Step #1 Enter Protected Mode

37 系统的启动(续) Step #2 Load the kernel binary

38 系统的启动(续) Step #3: Initialize Kernel VM

39 系统的启动(续) Step #4: Kernel Running

40 系统的启动(续) Step #5 User Process Running

41 实验代码框架 \bootloader \utils \app Makefile 引导程序代码 相关工具 用户程序(你的操作系统)
编译文件方案

42 实验框架代码(续)

43 实验攻略(伪) 实模式到保护模式 关中断 定义 GDT 数据结构 打开 A20地址线 加载 GDT 描述符
置 cr0 寄存器的 PE 位为1 长跳转进入保护模式代码

44 实验攻略(伪) 怎么显示字符 回忆一下 C 语言的地址操作, 尝试用 C 语 言修改显存输出字符

45 实验攻略(伪) ELF 文件解析 完成之后你就可以从此告别引导程序啦 读 ELF 头的程序头偏移大小和数量
读各个程序头的程序文件偏移和大小及物理偏移 和大小 写入内存 跳转程序入口运行 完成之后你就可以从此告别引导程序啦

46 实验攻略(伪) 用户程序 实现一个简单的库函数--自定义print asm()? 内存地址操作?

47 实验攻略(伪)


Download ppt "操作系统实验 lab1-系统引导 2016-3-1."

Similar presentations


Ads by Google