欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    操作系统设计与实现.pdf

    • 资源ID:70321030       资源大小:9.51MB        全文页数:246页
    • 资源格式: PDF        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    操作系统设计与实现.pdf

    1 现在还是很初始的草稿版本,需要进一步修订、改进和增加内容。如发现内容有问题或有好的建议请电邮告诉我们(),谢谢!操作系统设计与实现 The Design&Implementation of Operating System 陈渝 向勇 清华大学计算机系 2011 年 6 月 2 第第1 1章章 操作系统简介操作系统简介 要点(OSP):OS 定义:位于 1.2.1 要点(OSP):OS 抽象:位于 1.2.2 对于在校的学生和已经参加工作的工程师而言,能否以较小的时间和精力比较全面地了解操作系统呢?陆游老夫子说过“纸上得来终觉浅,绝知此事要躬行”,也许在了解基本的操作系统概念和原理基础上,通过实际动手来一步一步分析、设计和实现一个微型化的操作系统,会发现操作系统原来如此,概念原理和实际实现之间有紧密的联系和巨大的差异。一方面现在的操作系统课本越来越庞大和抽象,反而忽视了实践。要知道,操作系统的设计实现是在没有教科书的情况下完成的。换句话说,现有操作系统的实现,再有操作系统的课本。而另一方面实际的操作系统相当庞大,如 Linux、Windows 等,都是上百万行的源代码规模,实现这些软件的目的是给人用的,不是给人学的。能否在这两方面找到一个平衡?早期的 UNIX 操作系统和 MIT 教授 Frans Kaashoek 博士等基于 UNIX v6 设计的 xv6 操作系统给了我们启发:对一个计算机专业的本科生而言,设计实现一个操作系统有挑战但是可行!本书想进行这样的教学尝试,以设计实现一个微型但全面的“麻雀”操作系统ucore为基本目标,以增量式地完成各种基于 ucore 操作系统的实验为实践过程,以在此过程中逐步介绍的操作系统的基本概念和原理为实践指导,做到有“理”可循和有“码”可查,最终让读者了解和掌握操作系统的原理、设计与实现。1.1 应具备的背景知识和学习环境应具备的背景知识和学习环境 设计实现操作系统其实就是设计实现一个软件,所以本书的例子和描述需要读者学习过计算机原理课程、程序设计课程,掌握 C 语言编程(了解指针等的编程),对基于 Intel 80386处理器体系结构有一定的了解,大致了解基于基于 Intel 80386 的汇编语言。本书涉及的例子和实验可在 Windows 环境和 Linux 环境下采用命令行(CLI)方式和集成开发环境(IDE)方式进行编译和运行,所以,最好能够有一台 PC 计算机用于进行操作系统实验。1.2 操作系统的概念操作系统的概念 1.2.1 操作系统的定义操作系统的定义 操作系统是计算机系统机构中的一个系统软件,它的职能主要有两个:对下面(也就是计算机硬件),有效地组织和管理计算机系统中的硬件资源(包括处理器、内存、硬盘、显示器、键盘、鼠标等各种外设);对上面(应用程序或用户),提供简洁的服务功能接口,屏蔽硬件管理带来的差异性和复杂性,使得应用程序和用户能够灵活、方便、有效地使用计算机。为了完成这两个职能,操作系统需要在其内部实现中合理地组织计算机中的软硬件资源的使用分配和处理流程,使整个计算机系统能高效地运行。3 1.2.2 操作系统的抽象操作系统的抽象 操作系统为了能够更好地管理计算机系统并对应用程序提供便捷的服务,在操作系统的发展过程中,计算机科学家提出了如下四个个抽象概念,奠定了操作系统的基础。操作系统原理中的其他概念基本上都可基于上述这四个操作系统抽象。中断(中断(Interrupt)简单地说,中断是处理器在执行过程中的突变,用来响应处理器状态中的特殊变化。比如当应用程序正在执行时,产生了时钟外设中断,导致操作系统打断当前应用程序的执行,转而去处理时钟外设中断,处理完毕后,再回到应用程序被打断的地方继续执行。在操作系统中,有三类中断:外设中断(Device Interrupt)、陷阱中断(Trap Interrupt)和故障中断(Fault Interrupt,也称为 exception,异常)。外设中断由外部设备引起的外部 I/O事件如时钟中断、控制台中断等。外设中断是异步产生的,与处理器的执行无关。故障中断是在处理器执行指令期间检测到不正常的或非法的内部事件(如除零错、地址访问越界)。陷阱中断是在程序中使用请求操作系统服务的系统调用而引发的有意事件。在后面的叙述中,如果没有特别指出,我们将用简称中断、陷阱、故障来区分这三种特殊的中断事件,在不需要区分的地方,统一用中断表示。进程(进程(Process)简单地说,进程是一个正在运行的程序。在计算机系统中,我们可以“同时”运行多个程序,这个“同时”,其实是操作系统给用户造成的一个“幻觉”。大家知道,处理器是计算机系统中的硬件资源。为了提高处理器的利用率,操作系统采用了多道程序技术。如果一个程序因某个事件而不能运行下去时,就把处理器占用权转交给另一个可运行程序。为了刻画多道程序的并发执行的过程,就要引入进程的概念。从操作系统原理上看,一个进程是一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。操作系统中的进程管理需要协调多道程序之间的关系,解决对处理器分配调度策略、分配实施和回收等问题,从而使得处理器资源得到最充分的利用。虚存(虚存(Virtual Memory)简单地说,虚存就是操作系统通过处理器中的 MMU 硬件的支持而给应用程序和用户提供一个大的(超过计算机中的内存条容量)、一致的(连续的地址空间)、私有的(其他应用程序无法破坏)的存储空间。这需要操作系统将内存和硬盘结合起来管理,为用户提供一个容量比实际内存大得多的虚拟存储器,并且需要操作系统为应用程序分配内存空间,使用户存放在内存中的程序和数据彼此隔离、互不侵扰。操作系统中的虚存管理与处理器的 MMU密切相关。文件(文件(File)简单地说,文件就是存放在永久存储介质(比如硬盘、光盘、U 盘等)上,方便应用程序和用户读写的数据。当处理器需要访问文件中的数据时,可通过操作系统把它们装入内存。放在硬盘上的程序也是一种文件。文件管理的任务是有效地支持文件的存储、检索和修改等操作。1.3 “麻雀”操作系统“麻雀”操作系统-ucore 写一个操作系统难吗?别被现在上百万行的 Linux 和 Windows 操作系统吓倒。当年Thompson 乘他老婆带着小孩度假留他一人在家时,写了 UNIX;当年 Linus 还是一个 21 岁大 4 学生时完成了 Linux 雏形。站在这些巨人的肩膀上,我们能否也尝试一下做“巨人”的滋味呢?MIT 的 Frans Kaashoek 等在 2006 年参考 PDP-11 上的 UNIX Version 6 写了一个可在 X86上跑的操作系统 xv6(基于 MIT License),用于学生学习操作系统。我们可以站在他们的肩膀上,基于 xv6 的设计,尝试着一步一步完成一个从“空空如也”到“五脏俱全”的“麻雀”操作系统ucore,此“麻雀”包含虚存管理、进程管理、处理器调度、同步互斥、进程间通信、文件系统等主要内核功能,总的内核代码量(C+asm)不会超过 5K 行。充分体现了“小而全”的指导思想。ucore 的运行环境可以是真实的 X86 计算机,不过考虑到调试和开发的方便,我们可采用 X86 模拟器,比如 QEMU、BOCHS 等,或 X86 虚拟运行环境,比如 VirtualBox、VMware Player等。ucore 的开发环境主要是 GCC 中的 gcc、gas、ld 和 MAKE 等工具,也可采用集成了这些工具的 IDE 开发环境 Eclipse-CDT。运行环境和开发环境既可以在 Linux 或 Windows 中使用。那我们准备如何一步一步实现 ucore 呢?安装一个操作系统的开发过程,我们可以有如下的开发步骤:1)启动操作系统的 bootloader,用于了解操作系统启动前的状态和要做的准备工作,了解运行操作系统的硬件支持,操作系统如何加载到内存中,理解两类中断-“外设中断”,“陷阱中断”,内核态和用户态的区别;2)内存管理子系统,用于理解 x86 分段/分页模式,了解操作系统如何管理物理内存和虚存、页表管理、一类中断-“故障中断”、缺页故障处理、基于页的内存替换;3)进程管理子系统,用于了解进程创建、执行、切换和结束的动态管理过程,了解在用户态通过系统调用得到内核态的内核服务的过程;4)处理器调度子系统,用于理解操作系统的调度过程和调度算法;5)同步互斥子系统,用于了解同步互斥的具体实现以及对系统性能的影响,研究死锁产生的原因,以及如何避免死锁;6)进程间通信子系统:用于了解进程间如何进行信息交换和共享;7)文件系统,了解文件系统的具体实现,与进程管理等的关系,了解缓存对操作系统IO 访问的性能改进,了解虚拟文件系统(VFS)、buffer cache 和 disk driver 之间的关系。8)网络协议栈(选做):了解网卡驱动、TCP/IP 协议栈实现和 Web 应用。其中每个开发步骤都是建立在上一个步骤之上的,就像搭积木,从一个一个小木块,最终搭出来一个小房子。在搭房子的过程中,完成从理解操作系统原理到实践操作系统设计与实现的探索过程。这个房子最终的建筑架构和建设进度如下图所示(要标注处各个 proj 的特点,可在最后写):5 外设控制器外设控制器/中断控制器中断控制器串口串口CGACGA并口并口I I/O O地址空间地址空间MEMMEM地址空间地址空间CPUCPU设备驱动层设备驱动层initinit子系统子系统库函数子系统库函数子系统cprintfcprintf/strstr*.*.软件层软件层硬件层硬件层硬盘硬盘网卡网卡键盘键盘时钟时钟串口串口CGACGA并口并口硬盘硬盘网卡网卡键盘键盘时钟时钟中断控制器中断控制器中断管理子系统中断管理子系统bootloaderbootloader内存管理子系统内存管理子系统物理内存分配管理物理内存分配管理虚拟内存分配管理虚拟内存分配管理段式内存管理段式内存管理页式内存管理页式内存管理页替换算法页替换算法swapswap管理管理页故障管理页故障管理连续地址空间分配算法连续地址空间分配算法不连续地址空间分配算法不连续地址空间分配算法写时复制写时复制按需分页按需分页进程管理子系统进程管理子系统进程调度算法进程调度算法进程生命周期管理进程生命周期管理进程调度框架进程调度框架进程间共享库支持进程间共享库支持文件管理子系统文件管理子系统Buffer CacheBuffer CacheUNIXUNIX文件系统文件系统FATFAT文件系统文件系统同步互斥同步互斥/死锁死锁同步互斥应用实例同步互斥应用实例LockLock实现实现semaphoresemaphore实现实现解决死锁问题的实例解决死锁问题的实例进程间通信进程间通信PIPEPIPE消息队列消息队列MonitorMonitor监控子系统监控子系统远程远程debugdebug调试子系统调试子系统系统调用接口系统调用接口内核态内核态用户态用户态用户态函数库用户态函数库各种用户态应用和测试用例各种用户态应用和测试用例网络网络TCPTCP/IPIP协议栈协议栈实验进度颜色图实验进度颜色图 6 1.4 处理器硬件基础简介处理器硬件基础简介 要想深入理解 ucore,就需要了解支撑 ucore 运行的硬件环境,即了解处理器体系结构(了解硬件对 ucore 带来影响)和机器指令集(读懂 ucore 的汇编)。ucore 目前支持的硬件环境是基于 Intel 80386 以上的计算机系统。更多的硬件相关内容(比如保护模式等)将随着实现 ucore 的过程逐渐展开介绍。1.4.1 Intel 80386 运行模式运行模式 80386 有四种运行模式:实模式、保护模式、SMM 模式和虚拟 8086 模式。这里对涉及 ucore 的实模式、保护模式做一个简要介绍。实模式:80386 加电启动后处于实模式运行状态,在这种状态下软件可访问的物理内存空间不能超过 1MB,且无法发挥 Intel 80386 以上级别的 32 位 CPU 的 4GB 内存管理能力。实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,操作系统和用户程序并没有区别对待,而且每一个指针都是指向实际的物理地址。这样用户程序的一个指针如果指向了操作系统区域或其他用户程序区域,并修改了内容,那么其后果就很可能是灾难性的。实模式:实模式是为了和 8086 处理器兼容而设置的。在实模式下,80386 处理器就相当于一个快速的 8086 处理器。80386 处理器被复位或加电的时候以实模式启动。这时候处理器中的各寄存器以实模式的初始化值工作。80386 处理器在实模式下的存储器寻址方式和8086 是一样的,由段寄存器的内容乘以 16 当做基地址,加上段内的偏移地址形成最终的物理地址,这时候它的 32 位地址线只使用了低 20 位,即可访问 1MB 的物理地址空间。在实模式下,80386 处理器不能对内存进行页机制管理,所以指令寻址的地址就是内存中实际的物理地址。在实模式下,所有的段都是可以读、写和执行的。实模式下 80386 不支持优先级,所有的指令相当于工作在特权级(即优先级 0),所以它可以执行所有特权指令,包括读写控制寄存器 CR0 等。实模式下不支持硬件上的多任务切换。实模式下的中断处理方式和 8086处理器相同,也用中断向量表来定位中断服务程序地址。中断向量表的结构也和 8086 处理器一样,每 4 个字节组成一个中断向量,其中包括两个字节的段地址和两个字节的偏移地址。保护模式:实际上,80386 就是通过在实模式下初始化控制寄存器,GDTR,LDTR,IDTR与 TR 等管理寄存器以及页表,然后再通过加载 CR0 使其中的保护模式使能位置位而进入保护模式的。当 80386 工作在保护模式下的时候,其所有的 32 根地址线都可供寻址,物理寻址空间高达 4GB。在保护模式下,支持内存分页机制,提供了对虚拟内存的良好支持。保护模式下 80386 支持多任务,还支持优先级机制,不同的程序可以运行在不同的优先级上。优先级一共分 03 4 个级别,操作系统运行在最高的优先级 0 上,应用程序则运行在比较低的级别上;配合良好的检查机制后,既可以在任务间实现数据的安全共享也可以很好地隔离各个任务。1.4.2 Intel 80386 内存架构内存架构 80386 是 32 位的处理器,即可以寻址的物理内存地址空间为 232=4G 字节。在理解操作系统的过程中,需要用到三个地址空间的概念。地址是访问地址空间的索引。物理内存地址物理内存地址空间空间是处理器提交到总线上用于访问计算机系统中的内存和外设的最终地址。一个计算机系 7 统中只有一个物理地址空间。线性地址空间线性地址空间是每个运行的应用程序看到的地址空间,在操作系统的虚存管理之下,每个运行的应用程序都认为自己独享整个计算机系统的地址空间,这样可让多个运行的应用程序之间相互隔离。处理器负责把线性地址转换成物理地址。一个计算机系统中可以有多个线性地址空间(比如一个运行的程序就可以有一个私有的线性地址空间)。线性地址空间的大小与物理地址空间的大小没有必然的连续。逻辑地址空间逻辑地址空间是应用程序直接使用的地址空间。这是由于 80386 中无法禁用段机制,使得逻辑地址一直存在。比如如下 C 代码片段:int boo=1;int*foo=&a;这里的 boo 是一个整型变量,foo 变量是一个指向 boo 地址的整型指针变量,foo 中储存的内容就是 boo 的逻辑地址。逻辑地址由一个 16 位的段寄存器和一个 32 位的偏移量构成。Foo 中放的就是 32 位的偏移量,而对应的段信息位于段寄存器中。上述三种地址的关系如下:分段机制启动、分页机制未启动:逻辑地址-段机制处理段机制处理-线性地址=物理地址 分段机制和分页机制都启动:逻辑地址-段机制处理段机制处理-线性地址-页机制处理页机制处理-物理地址 1.4.3 Intel 80386 寄存器寄存器 80386 的寄存器可以分为 8 组:通用寄存器,段寄存器,指令指针寄存器,标志寄存器,系统地址寄存器,控制寄存器,调试寄存器,测试寄存器,它们的宽度都是 32 位。一般程序员看到的寄存器包括通用寄存器,段寄存器,指令指针寄存器,标志寄存器。General Register(通用寄存器通用寄存器):EAX/EBX/ECX/EDX/ESI/EDI/ESP/EBP 这些寄存器的低 16 位就是 8086 的 AX/BX/CX/DX/SI/DI/SP/BP,对于 AX,BX,CX,DX 这四个寄存器来讲,可以单独存取它们的高 8 位和低 8 位(AH,AL,BH,BL,CH,CL,DH,DL)。它们的含义如下:EAX:累加器 EBX:基址寄存器 ECX:计数器 EDX:数据寄存器 ESI:源地址指针寄存器 EDI:目的地址指针寄存器 EBP:基址指针寄存器 ESP:堆栈指针寄存器 8 Segment Register(段寄存器,也称段寄存器,也称 Segment Selector,段选择符,段选择子,段选择符,段选择子):除了 8086 的 4 个段外(CS,DS,ES,SS),80386 还增加了两个段 FS,GS,这些段寄存器都是 16 位的,它们的含义如下:CS:代码段(Code Segment)DS:数据段(Data Segment)ES:附加数据段(Extra Segment)SS:堆栈段(Stack Segment)FS:附加段 GS 附加段 Instruction Pointer(指令指针寄存器指令指针寄存器):EIP 的低 16 位就是 8086 的 IP,它存储的是下一条要执行指令的内存地址,在分段地址转换中,表示指令的段内偏移地址。EAXEAXEDXEDXECXECXEBXEBXEBPEBPESIESIEDIEDIESPESPAHAHAXAXALALDHDHDXDXDLDLCHCHCXCXCLCLBHBHBXBXBLBL31231570通用寄存器BPBPSISIDIDISPSPCS CS 1570SS SS DS DS ES ES FS FS GS GS 段寄存器EFLAGSEFLAGS31317 70 0EIP EIP 15152323状态寄存器和指令寄存器状态寄存器和指令寄存器 9 Flag Register(标志寄存器标志寄存器):EFLAGS,和 8086 的 16 位标志寄存器相比,增加了 4 个控制位,这 20 位控制/标志位的位置如下图所示:相关的控制/标志位含义是:CF(Carry Flag):进位标志位;PF(Parity Flag):奇偶标志位;AF(Assistant Flag):辅助进位标志位;ZF(Zero Flag):零标志位;SF(Singal Flag):符号标志位;IF(Interrupt Flag):中断允许标志位,由 CLI,STI 两条指令来控制;设置 IF 使 CPU可识别外部(可屏蔽)中断请求。复位 IF 则禁止中断。IF 对不可屏蔽外部中断和故障中断的识别没有任何作用。DF(Direction Flag):向量标志位,由 CLD,STD 两条指令来控制;OF(Overflow Flag):溢出标志位;IOPL(I/O Privilege Level):I/O 特权级字段,它的宽度为 2 位,它指定了 I/O 指令的特权级。如果当前的特权级别在数值上小于或等于 IOPL,那么 I/O 指令可执行。否则,将发生一个保护性故障中断。NT(Nested Task):控制中断返回指令 IRET,它宽度为 1 位。若 NT=0,则用堆栈中保存的值恢复 EFLAGS,CS 和 EIP 从而实现中断返回;若 NT=1,则通过任务切换实现中断返回。第第2章章 启动操作系统启动操作系统 读者通过阅读本章的内容并动手实践相关的 6 个 project 实验:proj1:能够切换到保护模式并显示字符的 bootloader proj2/3:可读 ELF 格式文件的 bootloader 和显示字符的 ucore 31317 70 015152323V VM MR RF F0 0N NT TIOIOPLPLO OF FD DF FI IF FT TF FS SF FZ ZF F0 0A AF F0 0P PF F1 1C CF F0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0A A1616-BIT FLAGS REGISTERBIT FLAGS REGISTERVIRTUAL VIRTUAL 8086 8086 MODEMODEX XRESUME FLAGRESUME FLAGX XNESTED TASK FLAGNESTED TASK FLAGX XI I/O PRIVILEGE LEVELO PRIVILEGE LEVELX XOVERFLOWOVERFLOWS SDIRECTION FLAGDIRECTION FLAGC CINTERRUPT ENABLEINTERRUPT ENABLEX XTRAP FLAGTRAP FLAGS SSIGN FLAGSIGN FLAGS SZERO FLAGZERO FLAGS SAUXILIARY CARRYAUXILIARY CARRYS SPARITY FLAGPARITY FLAGS SCARRY FLAGCARRY FLAGS SS S=STATUS FLAGSTATUS FLAG,C C=CONTROL FLAGCONTROL FLAG,X X=SYSTEM FLAG SYSTEM FLAG 0 0 或或 1 1 表示由表示由intelintel保留保留,不要使用不要使用状态寄存器 10 proj3.1:内置监控自身运行状态的 ucore proj4:可管理中断和处理基于中断的键盘/时钟的 ucore proj4.1.1:支持通过中断方式的内核态/用户态切换的 ucore 可以掌握如下知识:与操作系统原理相关 I/O 设备管理:涉及程序循环检测方式和中断启动方式、I/O 地址空间 内存管理:基于分段机制的内存管理 异常处理:涉及中断、故障和陷阱 特权级:内核态和用户态 操作系统原理之外 PC 从加电到加载操作系统内核的整个过程 OS 内核在内存中的布局 并口访问、串口访问、CGA 字符显示、硬盘数据访问、时钟访问 ELF 执行文件格式 栈的实现并实现函数调用栈跟踪函数 调试操作系统 其实这一章的内容与操作系统原理相关的部分较少,与计算机体系结构(特别是 x86)的细节相关的部分较多。但这些内容对写一个操作系统关系较大,要知道操作系统是直接与硬件打交道的软件,所以它需要“知道”需要硬件细节,才能更好地控制硬件。另一方面,部分内容涉及到操作系统的重要抽象-中断类异常,能够充分理解中断类异常为以后进一步了解进程切换、上下文切换等概念会很有帮助。本章的实验内容涉及的是写一个 bootloader 能够启动一个操作系统-ucore。在完成bootloader的过程中,逐渐增加bootloader和ucore的能力,涉及x86处理器的保护模式切换、解析 ELF 执行文件格式等,这对于理解操作系统的加载过程以及在操作系统在内存中的位置、内存管理、用户态与内核态的区别等有帮助。而相关 project 中 bootloader 和操作系统本身的字符显示的 I/O 处理、读硬盘数据的 I/O 处理、键盘/时钟的中断处理等内容,则是操作系统原理中一般在靠后位置提到的设备管理的实际体现。纵观操作系统的发展史,从早期到现在的操作系统主要功能之一就是完成繁琐的 I/O 处理,给上层应用提供比较简洁的 I/O服务,屏蔽硬件处理的复杂性。这也是操作系统的虚拟机功能的体现。另外,本章还介绍了对硬件模拟器的使用,对操作系统的 panic 处理和远程 debug 功能的支持,这样有助于读者能够方便地分析操作系统中的错误和调试操作系统。由于本章涉及的硬件知识较多,无疑增大了读者的阅读难度,需要读者在结合阅读本章并实际动手实验来进行深入理解。3.1 可切换到保护模式并显示字符的可切换到保护模式并显示字符的 bootloader 3.1.1 实验目标 操作系统是一个软件,也需要通过某种机制加载并运行它。在这里我们将通过另外一个更加简单的软件-bootloader 来完成这些工作。为此,我们需要完成一个能够切换到 x86 的保护模式并显示字符的 bootloader,为将来启动操作系统做准备。proj1 提供了一个非常小的bootloader,整个 bootloader 的大小小于 512 个字节,这样才能放到硬盘的主引导扇区中。通过分析和实现这个 bootloader,读者可以了解到:基于分段机制的存储管理 11 设备管理的基本概念 PC 启动 bootloader 的过程 bootloader 的文件组成 编译运行 bootloader 的过程 调试 bootloader 的方法 在汇编级了解栈的结构和处理过程 保护模式切换到保护模式的方法 通过串口/并口/CGA 输出字符的方法 3.1.2 proj1 概述 1.实现描述实现描述 proj1 实现了一个简单的 bootloader,主要完成的功能是初始化寄存器内容,完成实模式到保护模式的转换,在保护模式下通过PIO方式控制串口、并口和 CGA 等进行字符串输出。2.项目组成项目组成 要点(非 OSP):bootloader 的编译生成过程 lab1 中包含的第一个工程小例子是 proj1:一个可以切换到保护模式并显示字符串的bootloader。proj1 的整体目录结构如下所示:proj1/|-boot|-asm.h|-bootasm.S|-bootmain.c|-libs|-types.h|-x86.h|-Makefile-tools|-function.mk|-gdbinit -sign.c 3 directories,9 files 其中一些比较重要的文件说明如下:bootasm.S:定义并实现了 bootloader 最先执行的函数 start,此函数进行了一定的初始化,完成了从实模式到保护模式的转换,并调用 bootmain.c 中的 bootmain函数。bootmain.c:定义并实现了 bootmain 函数实现了通过屏幕、串口和并口显示字符 12 串。asm.h:是 bootasm.S 汇编文件所需要的头文件,主要是一些与 X86 保护模式的段访问方式相关的宏定义。types.h:包含一些无符号整型的缩写定义。x86.h:一些用 GNU C 嵌入式汇编实现的 C 函数(由于使用了 inline 关键字,所以可以理解为宏)。Makefile 和 function.mk:指导 make 完成整个软件项目的编译,清除等工作。sign.c:一个 C 语言小程序,是辅助工具,用于生成一个符合规范的硬盘主引导扇区。gdbinit:用于 gdb 远程调试的初始命令脚本 从中,我们可以看出 bootloader 主要由 bootasm.S 和 bootmain.c 组成,当你完成编译后,你会发现这个 bootloader 只有区区的 3 百多字节。下面是编译运行 bootloader 的过程。【提示】bootloader 是一个超小的系统软件,在功能上与我们一般的应用软件不同,主要用于硬件简单初始化和加载运行操作系统。在编写 bootloader 的时候,需要了解它所处的硬件环境(比如它在内存中的起始地址,它的储存空间的位置和大小限制等)。而这些是编写应用软件不太需要了解的,因为操作系统和编译器帮助应用软件考虑了这些问题。-3.编译运行编译运行【实验 编译运行 bootloader】在 proj1 下执行 make,在 proj1/bin 目录下可生成一个 ucore.img。ucore.img 是一个包含了 bootloader 或 OS 的硬盘镜像,通过执行如下命令可在硬件虚拟环境 qemu 中运行bootloader 或 OS:make /生成 bootloader 和对应的主引导扇区 make qemu /通过 qemu 硬件模拟器来运行 bootloader make clean /清除生成的临时文件,bootloader 和对应的主引导扇区 13-我们除了需要了解 bootloader 的功能外,还需要进一步了解 bootloader 的编译链接和最终执行码的生成过程,从而能够清楚生成的代码是否是我们所期望的。proj1 中的 Makefile 是一个配置脚本,make 软件工具能够通过 Makefile 完成管理 bootloader 的 C/ASM 代码生成执行码的整个过程。Makefile 的内容比较复杂,不过读者在前期只需会执行 make 参数来生成代码和清除代码即可。对于本实验的 make 的执行过程如下所示:-1.gcc-O2-o tools/sign tools/sign.c 2.i386-elf-gcc-fno-builtin-Wall-MD-ggdb-m32-fno-stack-protector-O-nostdinc-Iinclude-Iinclude/x86-c bootloader/bootmain.c-o obj/bootmain.o 3.i386-elf-gcc-fno-builtin-Wall-MD-ggdb-m32-fno-stack-protector-nostdinc-Iinclude-Iinclude/x86-c bootloader/bootasm.S-o obj/bootasm.o 4.i386-elf-ld -N-e start-Ttext 0 x7C00-o obj/bootblock.o obj/bootasm.o obj/bootmain.o 5.i386-elf-objdump-S obj/bootblock.o obj/bootblock.asm 6.i386-elf-objcopy-S-O binary obj/bootblock.o obj/bootblock.out 7.sign.exe obj/bootblock.out obj/bootblock obj/bootblock.out size:380 bytes build 512 bytes boot sector:obj/bootblock success!8.dd if=/dev/zero of=obj/ucore.img count=10000 10000+0 records in 10000+0 records out 5120000 bytes(5.1 MB)copied,0.509 s,10.1 MB/s 9.dd if=obj/bootblock of=obj/ucore.img conv=notrunc 1+0 records in 1+0 records out 512 bytes(512 B)copied,0.011 s,46.5 kB/s-这 9 步的含义是:1.编译生成 sign 执行程序,用于生成一个符合规范的硬盘主引导扇区;2.用 gcc 编译器编译 bootmain.c,生成 ELF 格式的目标文件 bootmain.o;3.用 gas 汇编器(gcc 只是一个包装)编译 bootasm.S,生成 ELF 格式的目标文件 bootasm.o;4.用 ld 链接器把 bootmain.o 和 bootasm.o 链接在一起,形成生成 ELF 格式的执行文件bootblock.o;5.目标文件信息导出工具 objdump 反汇编 bootblock.o,生成 bootblock.asm,通过查看bootlock.asm 内容,可以了解 bootloader 的实际执行代码;14 6.文件格式转换和拷贝工具objcopy把 ELF格式的执行文件 bootblock.o转换成 binary格式的执行文件 bootblock.out;7.通过 sign 执行程序,把 bootblock.out(本身大小需要小于 510 字节)扩展到 512 字节,形成一个符合规范的硬盘主引导扇区 bootblock;8.设备级转换与拷贝工具 dd 生成一个内容都为0的磁盘文件 ucore.img;9.设备级转换与拷贝工具 dd 进一步把 bootblock 覆盖到 ucore.img 的前 512 个字节空间中,这样就可以把 ucore.img 作为一个可启动的硬盘被硬件模拟器 qemu 使用。如果需要了解 Makefile 中的内容,需要进一步看看如下补充材料。3.1.3【背景】【背景】Intel 80386 加电后启动过程加电后启动过程【要点(非 OSP):80836 物理内存地址空间】【要点(非 OSP):80836 加电后的第一条指令位】大家一般都知道 bootloader 负责启动操作系统,但 bootloader 自身是被谁加载并启动的呢?为了追根溯源,我们需要了解当计算机加电启动后,到底发生了什么事情。对于绝大多数计算机系统而言,操作系统和应用软件是存放在磁盘(硬盘/软盘)、光盘、EPROM、ROM、Flash 等可在掉电后继续保存数据的存储介质上。当计算机加电后,一般不直接执行操作系统,而是一开始会到一个特定的地址开始执行指令,这个特定的地址存放了系统初始化软件,通过执行系统初始化软件(可固化在 ROM 或 Flash 中,也称 firmware,固件)完成基本 I/O 初始化和引导加载操作系统的功能。简单地说,系统初始化软件就是在操作系统内核运行之前运行的一段小软件。通过这段小软件的基本 I/O 初始化部分,我们可以初始化硬件设备、建立系统的内存空间映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。最终系统初始化软件的引导加载部分把操作系统内核映像加载到 RAM 中,并将系统控制权传递给它。对于基于 Intel 80386 的计算机而言,其中的系统初始化软件由 BIOS(Basic Input Output System,即基本输入/输出系统,其本质是一个固化在主板 Flash/CMOS 上的软件)和位于软盘/硬盘引导扇区中的 OS Boot Loader(在 ucore 中的 bootasm.S 和 bootmain.c)一起组成。BIOS 实际上是被固化在计算机 ROM(只读存储器)芯片上的一个特殊的软件,为上层软件提供最底层的、最直接的硬件控制与支持。以基于 Intel 80386 的计算机为例,计算机加电后,整个物理地址空间如下图所示:15 图 2-1 基于 Intel 80386 的计算机物理地址空间 处理器处于实模式状态(在 86386 中,段机制一直存在,可进一步参考 2.1.5【背景】理解保护模式和分段机制),从物理地址 0 xFFFFFFF0 开始执行。初始化状态的 CS 和 EIP确定了处理器的初始执行地址,此时 CS 中可见部分-选择子(selector)的值为 0 xF000,而其不可见部分-基地址(base)的值为 0 xFFFF0000;EIP 的值是 0 xFFF0,这样实际的线性地址(由于没有启动也机制,所以线性地址就是物理地址)为 CS.base+EIP=0 xFFFFFFF0。在0 xFFFFFFF0 这里只是存放了一条跳转指令,通过跳转指令跳到 BIOS 例行程序起始点。更详细的解释可以参考文献1的第九章的 9.1 节INITIALIZATION OVERVIEW。另外,我们可以通过硬件模拟器 qemu 来进一步认识上述结果。-实验 2-1:通过 qemu 了解 Intel 80386 启动后的 CS 和 EIP 值,并分析第一条指令的内容 1.启动 qemu 并让其停到执行第一条指令前,这需要增加一个参数-S qemu S 2.这是 qemu 会弹出一个没有任何显示内

    注意事项

    本文(操作系统设计与实现.pdf)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开