《MIT 6.828 Lab1: Booting a PC》实验报告

实验内容

  1. 熟悉x86汇编语言、QEMU x86仿真器、PC开机引导流程
  2. 测试6.828 内核的启动加载器(boot loader)
  3. 研究6.828 内核的初始化模板(JOS)

实验题目

Exercise 1:阅读汇编语言资料

Exercise 1. Familiarize yourself with the assembly language materials available on the 6.828 reference page. You don‘t have to read them now, but you‘ll almost certainly want to refer to some of this material when reading and writing x86 assembly.

We do recommend reading the section "The Syntax" in Brennan‘s Guide to Inline Assembly. It gives a good (and quite brief) description of the AT&T assembly syntax we‘ll be using with the GNU assembler in JOS.

解答

  1. 读完《PC Assembly Language》,并输出学习笔记
  2. 读完《Brennan‘s Guide to Inline Assembly》,并输出学习笔记

备注

  1. PC Assembly Language Book是一本学习x86汇编语言的好书,不过要注意此书的例子是为NASM汇编器而设计,而我们课程使用的是GNU汇编器。
  2. NASM汇编器使用Intel语法,而GNU汇编器使用AT&T语法。两者的语法差异可以参考Brennan‘s Guide to Inline Assembly

Exercise 2:使用GDB命令跟踪BIOS做了哪些事情

Exercise 2. Use GDB‘s si (Step Instruction) command to trace into the ROM BIOS for a few more instructions, and try to guess what it might be doing. You might want to look at Phil Storrs I/O Ports Description, as well as other materials on the 6.828 reference materials page. No need to figure out all the details - just the general idea of what the BIOS is doing first.

解答

使用si命令得到的前22条汇编指令如下。虽然能看懂每条指令的字面意思,但看不懂具体实现的功能,后来参考myk的6.828 Lab1大致理解了基本功能:设置ss和esp寄存器的值,打开A20门(为了兼容老芯片而留下的历史包袱)、进入保护模式(需要设置cr0寄存器的PE标志)。

[f000:fff0]    0xffff0: ljmp   $0xf000,$0xe05b
[f000:e05b]    0xfe05b: cmpl   $0x0,%cs:0x6ac8
[f000:e062]    0xfe062: jne    0xfd2e1
[f000:e066]    0xfe066: xor    %dx,%dx
[f000:e068]    0xfe068: mov    %dx,%ss
[f000:e06a]    0xfe06a: mov    $0x7000,%esp
[f000:e070]    0xfe070: mov    $0xf34c2,%edx
[f000:e076]    0xfe076: jmp    0xfd15c
[f000:d15c]    0xfd15c: mov    %eax,%ecx
[f000:d15f]    0xfd15f: cli
[f000:d160]    0xfd160: cld
[f000:d161]    0xfd161: mov    $0x8f,%eax
[f000:d167]    0xfd167: out    %al,$0x70
[f000:d169]    0xfd169: in     $0x71,%al
[f000:d16b]    0xfd16b: in     $0x92,%al
[f000:d16d]    0xfd16d: or     $0x2,%al
[f000:d16f]    0xfd16f: out    %al,$0x92
[f000:d171]    0xfd171: lidtw  %cs:0x6ab8
[f000:d177]    0xfd177: lgdtw  %cs:0x6a74
[f000:d17d]    0xfd17d: mov    %cr0,%eax
[f000:d180]    0xfd180: or     $0x1,%eax
[f000:d184]    0xfd184: mov    %eax,%cr0
[f000:d187]    0xfd187: ljmpl  $0x8,$0xfd18f

备注

  1. CS(CodeSegment)和IP(Instruction Pointer)寄存器一起用于确定下一条指令的地址。
  2. CLI:Clear Interupt,禁止中断发生。STL:Set Interupt,允许中断发生。CLI和STI是用来屏蔽中断和恢复中断用的,如设置栈基址SS和偏移地址SP时,需要CLI,因为如果这两条指令被分开了,那么很有可能SS被修改了,但由于中断,而代码跳去其它地方执行了,SP还没来得及修改,就有可能出错。
  3. CLD: Clear Director。STD:Set Director。在字行块传送时使用的,它们决定了块传送的方向。CLD使得传送方向从低地址到高地址,而STD则相反。
  4. 汇编语言中,CPU对外设的操作通过专门的端口读写指令来完成,读端口用IN指令,写端口用OUT指令。
  5. LIDT: 加载中断描述符。LGDT:加载全局描述符。
  6. 第一条指令:[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b
    • PC开始运行时,CS = 0xf000,IP = 0xfff0,对应物理地址为0xffff0。(计算公式: physical address = 16 * segment + offset)
    • 第一条指令做了jmp操作,跳到物理地址为0xfe05b的位置。
  7. 控制寄存器:控制寄存器(CR0~CR3)用于控制和确定处理器的操作模式以及当前执行任务的特性。CR0中含有控制处理器操作模式和状态的系统控制标志;CR1保留不用;CR2含有导致页错误的线性地址;CR3中含有页目录表物理内存基地址,因此该寄存器也被称为页目录基地址寄存器PDBR(Page-Directory Base address Register)。
    • CR0的4个位:扩展类型位ET、任务切换位TS、仿真位EM和数学存在位MP用于控制80x86浮点(数学)协处理器的操作。
    • CR0的位0是PE(Protection Enable)标志。当设置该位时即开启了保护模式;当复位时即进入实地址模式。这个标志仅开启段级保护,而并没有启用分页机制。若要启用分页机制,那么PE和PG标志都要置位。
    • CR0的位31是PG(Paging,分页)标志。当设置该位时即开启了分页机制;当复位时则禁止分页机制,此时所有线性地址等同于物理地址。在开启这个标志之前必须已经或者同时开启PE标志。即若要启用分页机制,那么PE和PG标志都要置位。

实验笔记

环境部署

安装编译工具链

参考Tools Used in 6.828: Compiler Toolchain。根据objdump -igcc -m32 -print-libgcc-file-name命令的输出结果,可以确认我的Ubuntu环境已经支持6.828所需的工具链,因此跳过这一环节。

安装QEMU仿真器

参考Tools Used in 6.828: QEMU Emulator以及Xin Qiu: MIT 6.828 Lab 1

Part 1: PC Bootstrap

模拟x86

  1. make命令

    • make:编译最小的6.828启动加载器和内核
    • make qemu:运行QEMU。控制台输出会同时打印在QEMU虚拟VGA显示和虚拟PC的虚拟串口
    • make qemu-nox:运行QEMU。控制台输出只会打印在虚拟串口

PC物理地址空间

  1. 早期基于8088处理器的PC只支持1MB的物理地址寻址

    • 0x00000000 ~ 0x000A0000:640KB,Low Memory,早期PC能够使用的RAM地址。
    • 0x000A0000 ~ 0x000FFFFF:384KB,预留给硬件使用,比如视频显示缓存、存储固件等。
      • 0x000A0000 ~ 0x000C0000: 128KB,VGA显示
      • 0x000C0000 ~ 0x000F0000: 192KB,16-bit devices, expansion ROMs
      • 0x000F0000 ~ 0x00100000: 64KB,BIOS RAM
  2. 后来80286和80386处理器出现,能够支持16MB乃至4GB的物理地址空间,但仍然预留最低的1MB物理地址空间,以便后向兼容已有软件。因此现代PC在0x000A0000和0x00100000这段内存空间中存在hole,把RAM划分成“low memory”(或“conventional memory”,最低的640KB内存)和“extend memory”(其他内存)两部分。

Part 2: The Boot loader

  1. 当BIOS发现一个可启动的硬盘时,会将512字节的启动扇区加载到地址为0x7c00到0x7dff的内存中,然后使用jmp指令将CS:IP设置为0000:7c00,从而将控制权交给boot loader。
  2. 6.828的boot loader由boot/boot.Sboot/main.c两个文件组成。
  3. boot loader主要完成两个任务:
    • 将处理器由实模式切换到虚模式。
    • 从硬盘中读取内核(通过直接访问IDE磁盘设备寄存器)

问题汇总

  1. Q:make qemu进入QEMU界面后如何退出?目前我只能通过关闭终端来退出。
  2. Q:make qemu-gdb进入QEMU界面,然后通过关闭终端退出,再次make qemu-gdb时报错:“qemu-system-i386: -gdb tcp::25000: Failed to bind socket: Address already in use”,怎么解决?

    A: 发生这种问题是由于端口被程序绑定而没有释放造成。可以使用netstat -lp命令查询当前处于连接的程序以及对应的进程信息。然后用ps pid察看对应的进程,并使用kill pid关闭该进程即可。

原文地址:https://www.cnblogs.com/wuhualong/p/mit_6-828_lab1.html

时间: 2024-08-02 15:01:00

《MIT 6.828 Lab1: Booting a PC》实验报告的相关文章

MIT 6.828 学习笔记6 Lab4实验报告

Lab4实验报告 开始之前,为了弄懂 mpconfig 与 lapic,可能需要阅读 Intel processor manual 和 MP Specification,相关资源可以在课程中找到 Execrise 1 Implement mmio_map_region in kern/pmap.c. // mmio_map_region() uintptr_t ret = base; size = ROUNDUP(size, PGSIZE); base = base + size; if (ba

MIT 6.828 学习笔记5 Lab3实验报告

Lab3 实验报告 Exercise 1 Modify mem_init() in kern/pmap.c to allocate and map the envs array. // mem_int() // 第一处 envs = (struct Env *) boot_alloc(NENV * sizeof(struct Env)); memset(pages, 0, NENV * sizeof(struct Env)); // 第二处 boot_map_region(kern_pgdir,

MIT 6.828 JOS学习笔记2. Lab 1 Part 1.2: The kernel

Lab 1 Part 1: PC bootstrap 我们继续~ PC机的物理地址空间 这一节我们将深入的探究到底PC是如何启动的.首先我们看一下通常一个PC的物理地址空间是如何布局的:                           这张图仅仅展示了内存空间的一部分. 第一代PC处理器是16位字长的Intel 8088处理器,这类处理器只能访问1MB的地址空间,即0x00000000~0x000FFFFF.但是这1MB也不是用户都能利用到的,只有低640KB(0x00000000~0x00

操作系统ucore lab1实验报告

操作系统lab1实验报告 [练习1] 理解通过 make 生成执行文件的过程.(要求在报告中写出对下述问题的回答) 在此练习中,大家需要通过阅读代码来了解: 1. 操作系统镜像文件 ucore.img 是如何一步一步生成的?(需要比较详细地解释 Makefile 中 每一条相关命令和命令参数的含义,以及说明命令导致的结果) 2. 一个被系统认为是符合规范的硬盘主引导扇区的特征是什么? [练习1.1] 1.生成ucore.img需要kernel和bootblock 生成ucore.img的代码如下

PC平台逆向破解实验报告(待补充)

PC平台逆向破解实验报告(待补充) 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShell,会返回一个可用Shell.正常情况下这个代码是不会被运行的.我们实践的目标就是想办法运行这个代码片段.我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode. 实践内容 手工修改可执行文件,改变程序执行流程,直接跳转到getShell

ST:Lab1实验报告(测试判断三角形边长)

Lab 1 实验报告 一.   实验任务 下载Junit(4.12), Hamcrest(1.3),并在Eclipse上添加这来那个jar包 在Eclipse上安装Eclemma,用来显示测试的覆盖率. 写一个java程序,来判断三角形的形状,并且Junit来对这个程序进行测试. a)       判断三角形问题的描述: 判断三角形的函数传入三个形参int a, int b, int c 来代表三角形的三个边.并且计算并判断三角形是等边三角形.等腰三角形以及三边都不等的三角形. 二.   实验过

二次实验报告:使用Packet Tracer分析应用层协议

个人信息 郑兰艳 201821121064 计算1813 1 实验目的 熟练使用Packet Tracer工具.分析抓到的应用层协议数据包,深入理解应用层协议,包括语法.语义.时序. 2 实验内容 使用Packet Tracer,正确配置网络参数,抓取应用层协议的数据包并分析,协议包含DNS.FTP, DHCP, stmp, pop3.步骤包含: 建立网络拓扑结构 配置参数 抓包 分析数据包 3. 实验报告 (1)建立网络拓扑结构 说明:将一台PC主机与一台服务器连接在一起,建立网络拓扑结构 3

第四次实验报告

北京电子科技学院(BESTI) 实验报告 课程:信息安全系统设计基础   班级:1353 姓名:王剑桥.李雪琦           学号:20135316.20135309 成绩: 指导教师:娄嘉鹏  实验日期:2015.12.01 实验密级:   预习程度:  实验时间:15:30~18:00 仪器组次:  必修/选修:  实验序号:4 实验名称:外设驱动程序设计 实验目的与要求: 1.掌握实时系统应用和驱动程序的编写2.选择某个接口电路 实验仪器: 名称 型号 数量 嵌入式开发平台 UP-N

java第二次实验报告

课程:Java实验   班级:201352     姓名:黄坤  学号:2015226 成绩:           指导教师:娄佳鹏     实验日期:15.05.05 实验密级:         预习程度:       实验时间: 仪器组次:         必修/选修:选修    实验序号:2 实验名称:java面向对象程序设计 实验目的与要求: 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5.