65.9K
CodeProject 正在变化。 阅读更多。
Home

调试和构建操作系统

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (25投票s)

2006年11月29日

CPOL

8分钟阅读

viewsIcon

115847

downloadIcon

1261

如何构建和测试你自己的操作系统。

图1 - 在当前操作系统中使用PC模拟器运行其他操作系统。

引言

我认为成为一名真正的专业程序员最重要的途径之一是设计和构建一个操作系统。仅仅阅读操作系统如何工作是不够的,你必须亲手构建一个。

现在,我将列出学习如何开发操作系统你将获得什么

  1. 程序员就像太空中的宇航员,他越了解自己驾驶的宇宙飞船,以及在出现问题时如何修复它,他安全返回地球的可能性就越大。对于程序员来说,他越了解PC操作系统,他的程序就会越可靠、越强大、越快速,并且bug越少。
  2. 学习可执行文件格式(帮助很大)。
  3. 学习汇编语言(每个人都会承认,了解汇编语言是一件很棒的事情)。
  4. 了解幕后发生的事情。
  5. 学习计算机的硬件(CPU架构、PCI、SATA、缓存、网卡、ATA/ATAPI等)。
  6. 学习许多可以在其他编程中帮助你的新技巧
  7. 学习所有这些将大大改进你编写的程序(即使是普通的Win32用户界面编程)。

如果你还不相信,试试看,你就会发现编程操作系统有多么有趣

本文是我上一篇文章的第二部分。

在本文中,我将

  1. 向您展示如何以一种非常简单的方式测试调试您的操作系统。
  2. 构建和测试你自己的主板。
  3. 当使用INT 13h重置驱动器时,将驱动器号移动到寄存器DL。

如何调试和测试操作系统(最好最简单的方法)

图2 – Bochs工作画面(Bochs正在运行我另一篇文章中的引导扇区)。

要调试和测试操作系统,你必须有一个x86模拟器,我们将使用Bochs。

Bochs是一个可移植的开源x86AMD64PC模拟器,主要用C++编写,并根据GNU宽通用公共许可证发布。它支持处理器(包括保护模式)、内存、磁盘、显示器、以太网、BIOSPC的常见硬件外设的模拟。

许多客户机操作系统可以使用该模拟器运行,包括DOS、多个版本的WindowsBSDLinuxBochs可以在许多宿主操作系统上运行,包括Windows、Linux、Mac OS XXbox

Bochs主要用于操作系统开发(当模拟操作系统崩溃时,它不会使宿主操作系统崩溃,因此可以调试模拟操作系统)以及在已经运行的宿主操作系统中运行其他客户机操作系统。有些人用它在不兼容的电脑上运行老式电脑游戏。

要使用Bochs,请按照以下步骤操作

  1. 这里下载Bochs(它是免费的)。
  2. 安装Bochs
  3. 打开安装Bochs的目录。
  4. 寻找bochsdbg.exe(模拟器 + 调试器)、bochs.exe(模拟器)和bximage.exe(磁盘映像创建器)。
  5. 启动bximage.exe并按照说明创建一个虚拟的1.44 MB(1,474,560字节)软盘映像。
  6. 创建一个名为bochsrc.txt的文件(此文件是模拟器的初始化文件),并在其中输入此字符串:floppya: image="MyOS.img", status=inserted。您可以将文件名MyOS.img替换为您想要的任何文件名(它必须是bximage.exe创建的文件(或任何大小合适的文件))。
  7. 现在,你需要一些二进制文件来替换映像(你可以从我的第一篇文章中取出BOOT.bin文件,并将其替换到你创建的映像的前512字节中)。
  8. 现在,运行bochs.exe,它会打开两个窗口:<!--?xml:namespace prefix = st1 /-->a控制台窗口(用于调试)GUI窗口(此窗口模拟被模拟操作系统的屏幕)。
  9. 您可以使用bochsdbg.exe运行您的映像进行调试。
  10. 您可以创建软盘映像、硬盘映像和CD-ROM (*.iso) 映像,并在其中替换任何您想要的操作系统(如WinXP等)并对其进行调试。
  11. 阅读Bochs附带的文档,了解如何设置断点(lb 0x7c00)、转储内存(x /100bx 0x7c00)、单步执行(s 1)、读取寄存器(r)、继续执行(c)、转储所有CPU寄存器(dump_cpu)等。
  12. 尽情享用!

图3 – Bochs文件夹和一个简单的配置文件。

更高级的Bochs使用

图4 – 典型主板。

所有这些你都可以通过Bochs仅需编写一个简单的文本配置文件来构建。这就是Bochs如此奇妙的原因

您可以配置和构建一台完整的PC,您所需要做的就是将PC配置写入某个文本文件(例如,bochsrc.txt)并将其放置在Bochs文件夹中。这是一个高级配置文件的示例

#=======================================================================
# ROM-IMAGE:
#=======================================================================
romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000
#=======================================================================
# CPU:
#=======================================================================
cpu: count=1, ips=10000000, reset_on_triple_fault=1
#=======================================================================
# Amount of RAM in MB
#=======================================================================
megs: 32
#=======================================================================
# VGA ROM IMAGE
#=======================================================================
vgaromimage: file= $BXSHARE/VGABIOS-lgpl-latest
#=======================================================================
# VGA:
#=======================================================================
vga: extension= vbe
#=======================================================================
# FLOPPY:
#=======================================================================
floppya: 1_44= "MyImg.img" , status=inserted
#=======================================================================
# ATA0, ATA1, ATA2, ATA3 (Set up Hard disk and CD-ROM IRQ's and I/O address)
#=======================================================================
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11
ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9

#=======================================================================
# ATA[0-3]-MASTER, ATA[0-3]-SLAVE
#=======================================================================
ata0-master: type=disk, path="MyOS\c.img" , mode=flat, 
             cylinders=20, heads=16, spt=63, translation=none
ata1-master: type=disk, path="MyOS\d.img" , mode=flat, 
             cylinders=2, heads=16, spt=63, translation=none
ata0-slave: type=cdrom, path=MyOS\cdrom.iso, status=inserted
ata1-slave: type=cdrom, path=MyOS\E.iso, status=inserted 
#=======================================================================
# BOOT from:
#=======================================================================
boot: disk
#=======================================================================
# COM1, COM2, COM3, COM4:
#=======================================================================
 Com1: enabled=1,  dev="COM1"
#=======================================================================
# Parallel ports
#=======================================================================
parport1: enabled=1, file="LPT1"
#=======================================================================
# SB16:
# This defines the SB16 sound emulation.
#=======================================================================

sb16: midimode=1, midi=/dev/midi00, wavemode=1, wave=/dev/dsp, 
      loglevel=2, log=sb16.log, dmatimer=600000

#=======================================================================
# VGA_UPDATE_INTERVAL:
#=======================================================================
vga_update_interval: 300000

#=======================================================================
# MOUSE: support:
#=======================================================================
mouse: enabled=0
#=======================================================================
# ne2k: NE2000 compatible ethernet adapter 
#      (Now you can connect to the Internet):
#=======================================================================
ne2k: ioaddr=0x240, irq=9, mac=b0:c4:20:00:00:01, 
      ethmod=vnet, ethdev="c:/temp"

#=======================================================================
# I440FXSUPPORT: PCI-Controller:
#=======================================================================
i440fxsupport: enabled=1

#=======================================================================
# USB1:
#=======================================================================
usb1: enabled=1

#=======================================================================
# CMOSIMAGE:
#=======================================================================
#cmosimage: file=cmos.img, rtc_init=time0

#-------------------------
# PCI host device mapping (Inserting a PCI device).
#-------------------------
pcidev: vendor=0x1234, device=0x5678

#=======================================================================
# GDBSTUB: (GDB debugger)
#=======================================================================
#gdbstub: enabled=0, port=1234, text_base=0, data_base=0, bss_base=0
#=======================================================================
# IPS: (Instruction Per seconds)
#=======================================================================
ips: 10000000

#=======================================================================
# FOR MORE INFORMATION !!!!!
#=======================================================================
#For more information see the Bches Documentation 
#and "bochsrc-sample.txt" (this is in the Bochs directory).

你曾知道构建一台PC有多么容易吗?你只需写几行代码,然后运行Bochs,你就有了一台属于自己的PC。

以下是一些非常有用的调试命令

  1. c(继续执行)。
  2. s [count](执行count条指令,默认为1) - 例如,s
  3. Ctrl+C(停止执行,并返回命令行提示符)。
  4. lb addr(设置线性地址指令断点) - 例如,lb 0x7C00
  5. d n(删除断点) - 例如,d 1
  6. x /nuf addr(转储物理地址的内存) - 例如,X /100bx 0x7C00(转储100字节(b)并以十六进制格式(X)显示在地址0x7c00处)。
  7. r(CPU寄存器及其内容的列表)。
  8. info tab(显示分页地址转换)。
  9. dump_cpu(转储完整的CPU状态)。
  10. set reg = expr(将CPU寄存器更改为表达式的值) - 例如,set esi = 2*eax+ebx

欲了解更多信息,请查阅Bochs附带的文档。

结论

现在我相信你感觉自己就像在某个主板公司工作的PC工程师。这种配置非常棒,因为你可以构建任何你想要的PC,并在上面测试你的操作系统。

Bochs的另一个非常好的地方是它附带了源代码,所以就像从OS开发者的角度拥有了所有硬件规范一样。此外,它对调试你的OS也有很大帮助,因为从源代码你可以确切地知道哪里出了问题。

这是一份您可能不熟悉术语的列表

  1. ATA(用于r的协议读取和写入硬盘)。
  2. ATAPI(用于r的协议读取和写入CD-ROM)。
  3. CMOS(主板上的一个由电池供电的RAM芯片,此RAM保存您在进入BIOS设置时看到的所有PC设置(当您启动计算机时按Delete键显示的内容)——这实际上称为CMOS设置)。
  4. ROM映像(只读内存,用于存放您的BIOS和永久硬件设置)。
  5. IPS(CPU每秒可以执行的指令数)。
  6. VGA(视频图形适配器)。
  7. VGA更新间隔
  8. GDB(用于从不同计算机调试其他操作系统的调试器)。
  9. PCI(外围组件互连 - 这是一种标准,描述了如何以结构化和受控的方式将系统的外围组件连接在一起)。

关注点

您可以获取 Bochs 的源代码(也包括使用 MSVC 6 编译的)。我需要做一些修改才能让 Bochs 在 MSVC 6 和 MSVS 2005 下编译。如果您已经编译过,您是如何编译成功的?如果您更改了某些 `#define` 标识符的值,例如 `#define BX_DEBUGGER 1`(在 `Config.h` 中),发生了什么?您成功编译了吗?

另一个不错的PC模拟器(但它无法调试操作系统)是Microsoft PC Emulator(您可以从Microsoft网站下载)。

如果您有任何问题或需要帮助,请随时给我发电子邮件。如果您有任何主题或观点希望我撰写,请在论坛中注明(这将对未来的文章大有帮助)。

这里您可以下载我第一篇文章中引导扇区程序的新源代码。

这是我在引导扇区中做的一些修复

  1. 当它完成读取一个磁道时,它会切换到另一面。
  2. 我添加了BIOS参数块,使软盘(或硬盘)成为一个有效的FAT软盘。
  3. 当使用INT 13h重置驱动器时,将驱动器号移动到寄存器DL

如果这篇文章能引起大家的兴趣,我将继续写作。

本系列文章的下一篇将深入探讨开发您自己的操作系统的细节,例如,操作系统设计、文件系统编程、EXE格式、保护模式设置、切换到保护模式、中断处理、PIC编程、编写ATA/ATAPI驱动程序、编写软盘驱动程序、DMA、使用BIOS32(一个特殊的保护模式BIOS接口)、使用MSVC编写您的内核、图形显示驱动程序、操作系统加载的第一阶段和第二阶段等。

你需要这些工具

  1. 一个好的十六进制编辑器(我正在使用Hex workshop(但它不是免费的))。我相信你会在互联网上很容易找到一个免费的十六进制编辑器。
  2. MASM (v7-v8)(很容易找到可以下载它的网站)。
  3. MSVC 6 (或 v7-v8) (Microsoft C++ 编译器)
  4. OllyDbg(一个很好的Win32调试器)。
  5. Bochs.
  6. Tasm(Borland turbo汇编器,(用于16位OS加载器))——如果你找不到,请给我发电子邮件。
  7. TC(Borland Turbo C++,(用于16位操作系统加载器))——如果你找不到,请给我发电子邮件。

将对您帮助很大的链接

  1. OS-Dev这个网站是我见过的OS开发最好的资源。
  2. 这些是OS-Dev的论坛
  3. Linux内核的源代码能帮到你很多(另一个Linux源代码链接:www.kernel.org)。
  4. 有关Linux内核的帮助和信息也能帮到很多。
调试和构建操作系统 - CodeProject - 代码之家
© . All rights reserved.