内容概述

  • 实验内容的详细介绍
  • X86-32硬件的介绍
  • uCore 的部分编程技巧和数据结构
  • 如何使用工具编写和调试实验 实验主要是使用 C 语言实现的,目前还没有认真动手操作,只是大概了解一下思路。

实验具体内容

略。。。

X86-32硬件简单介绍

  • 运行模式
    • 80386 共有四中运行模式,我们只用到了其中两种
    • 实模式:加电后的默认模式,在BootLoader中就会切换为保护模式
    • 保护模式:一般的模式
  • 寻址方法
    • 逻辑地址:由16位的段选择子和32位的偏移量组成,是应用程序直接使用的地址空间(大概就是程序运行时访问的地址)
    • 线性地址:由逻辑地址的偏移量 + 段基址得到,是虚存管理下每个运行的应用程序能访问的地址空间
    • 物理地址:处理器提交到总线上用于访问计算机系统中内存和外设的最终地址。如果未开启页机制,则物理地址 = 线性地址;否则通过页表和线性地址可得到物理地址
  • 寄存器
    • 通用寄存器
      • EAX : 累加器
      • EBX : 基址寄存器
      • ECX : 计数器
      • EDX : 数据寄存器
      • ESI : 原地址指针寄存器
      • EDI : 目的地址指针寄存器
      • EBP : 基址指针寄存器
      • ESP : 堆栈指针寄存器
    • 段寄存器
      • CS : 代码段 ( Code Segment)
      • DS : 数据段(Data Segment)
      • ES : 附加数据段(Extra Segment)
      • SS : 堆栈段(Stack Segment
      • FS : 附加段
      • GS : 附加段
    • 指令寄存器 EIP : 指令的段内偏移地址
    • 标志寄存器 EFLAGS :
      • TF : 开启单步调试
      • IF : 开启硬件中断
      • IOPL : I/O特权级,CPL <= IOPL 时才能进行 I/O 操作

选择题

略。。。

简答题

你理解的对于类似ucore这样需要进程/虚存/文件系统的操作系统,在硬件设计上至少需要有哪些直接的支持?至少应该提供哪些功能的特权指令?

进程的切换需要硬件支持时钟中断;虚存管理需要地址映射机制,从而需要MMU等硬件;对于文件系统,需要硬件有稳定的存储介质来保证操作系统的持久性。对应的,应当提供中断使能,触发软中断等中断相关的,设置内存寻址模式,设置页表等内存管理相关的,执行 I/O 操作等文件系统相关的特权指令。

对于现代操作系统(每个进程占一个时间片)时钟中断是非常重要的。存储介质当然也是非常重要的。当然,事实上,MMU 没有也行,可以用用户态函数库来实现地址转换,但这样可能就保证不了安全性了。

Intel 手册第 3 卷 2.8 j节 “System Instruction Summary” 中给出了一个系统指令列表。 “系统指令完成的是系统级的功能,包括加载系统寄存器、管理 Cache、管理终端和设置调试寄存器。其中的大部分指令都必须由操作系统或特权级为 0 的进程执行;另一部分可以由任何特权级的进程执行。”

你理解的x86的实模式和保护模式有什么区别?物理地址、线性地址、逻辑地址的含义分别是什么?

保护模式和实模式的根本区别是进程内存是否受保护。(作者的意见是,实模式既是一个历史包袱,又有一定的实际用途。在实模式下,BIOS 自检和加载 BootLoader 的程序可以尽可能简单,因为不需要建立复杂的段映射。但是段机制必须开启这一点也是历史包袱。总之,BootLoader 一开始就开了 A20 ,设置了GDT然后长跳转切换到保护模式了。)实模式将整个内存看成分段的区域,程序代码和数据位于不同的区域,系统程序和用户程序没有区别对待,而且没一个指针都是指向“实在”的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并改变了值,那么对于这个别修改的系统程序或用户程序,其后果可能是灾难性的。为了克服这种低劣的内存管理模式,处理器厂商开发出保护模式。这样,物理内存不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。

  • 物理地址:是处理器提交到总线上用于访问计算机系统中的内存和外设的最终地址。
  • 逻辑地址:在有地址变换功能的计算机中,访问指令给出的地址叫逻辑地址。(一般的定义是段选择子+段内偏移量是逻辑地址。大概)
  • 线性地址:线性地址是逻辑地址和物理地址变换之间的中间层,是处理器通过段(Segment)机制控制下形成的地址空间
  • 虚拟地址:对这个名称的定义总是模糊不清。在这门课中,似乎虚拟地址就是程序内存的地址。