【UCB操作系统CS162项目】Pintos Lab0:项目上手 (Getting Real)

本文详细介绍了UCB CS162课程中Pintos操作系统的入门任务,包括Bootloader启动流程、BIOS中断调用、Kernel寻找与加载,以及如何在Kernel中实现交互式终端(Kernel Monitor)。通过GDB调试技巧实践了关键代码段的跟踪和理解。

前言

Stanford 的 CS144 计网完成后让我们继续挑战一项更难的课程项目:UCB 操作系统 CS162 的 Pintos,这个也是多个 CS 顶校都在用的项目。老规矩讲课部分因为本科基本都学过就略过了。

继续安利 CS自学指南,和博主同届甚至就住在楼下的大佬的自学网站,汇总了很多国内外高校 CS 相关的高质量公开课。

项目内容为理解一个微型操作系统 Pintos 的原理并为其添加几方面的重要功能,有自动化测试样例。可以跟着北大操作系统实验班整理的文档做:PintosBook

我的实现(更新至Lab 2):Altair-Alpha/pintos

准备工作

环境配置

跟着实验手册的 Environment Setup 做即可,博主用的是 Docker 部署,未出现问题。开发环境 VSCode + 开两个 PoweShell 窗口一个运行一个调试就很舒服了。

预备知识

  • C 语言基础。
  • 大体过一遍实验手册的 Getting Started 和 Appendix 部分,如果有整块没接触过的知识可以补一补。每个 Lab 中会提示需要详细阅读的部分。
  • 如果没有学过汇编,可以读 PCASM 这本书,不需要记住所有汇编指令的具体细节,大概能看懂程序意思即可。
  • GDB 调试。本课程是一次非常好的学习和锻炼调试程序的机会,本节 Lab 0 主要就是一个利用调试观察系统启动流程的热身,请仔细阅读手册中的 Debugging 部分,也可以参考 C 语言中文网上的 GDB 调试教程

Task 1: Booting Pintos

成功启动 Pintos 即可。下面游戏正式开始。

Task 2: Debugging

Exercise 2.1

  • What is the first instruction that gets executed?
  • At which physical address is this instruction located?

按照 Debugging 部分说明运行 GDB 绑定 Pintos 后得到以下输出,即机器启动运行的第一条指令:

[f000:fff0]    0xffff0: ljmp   $0x3630,$0xf000e05b

该指令为 ljmp(长转移),位于 0xffff0,属于 BIOS 区内,是硬编码的第一条指令位置。

Exercise 2.2

0x7c00 处设置断点并运行到该位置,此时控制权已由 BIOS 移交给 Bootloader,运行的指令与 loader.S 文件相对应。

  • How does the bootloader read disk sectors? In particular, what BIOS interrupt is used?

第 55 行,指令为 call read_sector,调用的函数位于 230 行:

在这里插入图片描述
读取硬盘扇区需要借助 BIOS 提供的功能,具体来说就如题面所述是触发一个 BIOS 中断,该指令位于 242 行(图中红框),维基百科 BIOS interrupt call 条目下有完整的中断表可供查询:

在这里插入图片描述

结合 240 行对 AH = 0x42 的设置可知使用的是 Extended Read Sectors 功能。

  • How does the bootloader decide whether it successfully finds the Pintos kernel?

继续向下看,目前我们已经读取了第一个磁盘扇区的内容,该扇区应该为主引导记录(Master Boot Record, MBR)扇区,包含了磁盘的分区信息,其特征是以 0x55AA 标志位结束(位于 0x01FE - 0x01FF,即 510,511 字节处)。67 行进行该检查,如果不相等,说明当前磁盘未正常分区,跳过并读取下一个磁盘。接下来跳转到 MBR 中第一个分区记录的位置(offset=446),如果读取结果为 0,说明当前分区未使用,使 si+=16 读取下一个分区记录,如果达到结束位置(510)仍未找到有效分区,则跳转至下一个磁盘。然后根据注释使用了值 0x20 来检查是否为 Pintos Kernel,这里我没有在文档中找到相应说明。最后,检查分区记录中第一个字节的值,该值如果为 0x80 则标识着当前分区是 Bootable 的。

在这里插入图片描述

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值