Songqian Li's Blog

去历史上留点故事

第 0 章:一些你可能正感到迷惑的问题

摘记

0.28 MBR、EBR、DBR 和 OBR 各是什么

image.png
MBR 位于整个硬盘最开始的块, EBR 位于每个子扩展分区,各子扩展分区中只有一个逻辑分区。 MBR 和 EBR 位于分区之外的扇区,而 OBR 则属于主分区和逻辑分区最开始的扇区,每个主分区和逻辑分区中都有 OBR 引导扇区。

操作系统时如何被启动的?

计算机在接电后运行的是 BIOS,BIOS 进行一些简单的检测和初始化工作后,将存在0盘0道1扇区的主引导记录 MBR 加载到内存固定位置0x7c00,此时 BIOS 就把 CPU 使用权交给了 MBR。
MBR 扇区中除了引导程序外,还有 64 字节大小的分区表,分区表中每个分区表项占 16 字节,因此 MBR 分区表中可容纳 4 个分区。MBR 要从各分区表项中最开始的 1 字节寻找值为0x80的分区,此分区中存在操作系统。找到该分区后 MBR 就将 CPU 使用权交给操作系统引导记录 OBR。
每个分区的起始扇区称为 OBR 引导扇区,在 OBR 扇区的前 3 个字节存放了跳转指令,该跳转指令将 CPU 带入操作系统引导程序,至此 MBR 完成了他的工作。
需要注意的是,OBR 中的跳转指令跳往的目标地址并不固定,这是由所创建的文件系统决定的,对于 FAT32 文件系统来说,此跳转指令会跳转到本扇区便宜 0x5A 字节的操作系统引导程序处。当然不管跳转目标地址是多少,总之那里通常是操作系统的内核加载器。

第 1 章:部署工作环境

软件安装

1
2
3
sudo apt install gcc
sudo apt install nasm
sudo apt install bochs*

Bochs 配置

切到/usr/share/bochs 目录,将配置文件/etc/bochs-init/bochsrc复制过来改名为bochsrc.disk,我的配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
config_interface: textconfig
display_library: sdl2
romimage: file=/usr/share/bochs/BIOS-bochs-latest
megs: 32
vgaromimage: file=/usr/share/vgabios/vgabios.bin
floppya: 1_44=/dev/fd0, status=inserted
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata1: enabled=0, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11
ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9
#ata0-master: type=disk, path="", mode=flat, cylinders=1024, heads=16, spt=63
ata0-slave: type=cdrom, path="/dev/cdrom", status=inserted

boot: disk

#ips: 1000000
floppy_bootsig_check: disabled=0
# log: /dev/stdout
log: bochs.out
panic: action=ask
error: action=report
info: action=report
debug: action=ignore
debugger_log: -
com1: enabled=1, dev=/dev/ttyS0
parport1: enabled=1, file="/dev/lp0"
sb16: midimode=1, midi=/dev/midi00, wavemode=1, wave=/dev/dsp, loglevel=2, log=/dev/stdout, dmatimer=600000
#vga_update_interval: 300000
#keyboard_serial_delay: 250
#keyboard_paste_delay: 100000
#floppy_command_delay: 500
mouse: enabled=0
private_colormap: enabled=0
#ne2k: ioaddr=0x240, irq=9, mac=b0:c4:20:00:00:00, ethmod=linux, ethdev=eth0
#keyboard_mapping: enabled=0, map=/usr/share/bochs/keymaps/x11-pc-de.map
#keyboard_type: mf
#user_shortcut: keys=ctrlaltdel
#magic_break: enabled=1
#cmosimage: cmos.img
#load32bitOSImage: os=nullkernel, path=../kernel.img, iolog=../vga_io.log
#load32bitOSImage: os=linux, path=../linux.img, iolog=../vga_io.log, initrd=../initrd.img
#i440fxsupport: enabled=1
#usb1: enabled=1, ioaddr=0xFF80, irq=10
#text_snapshot_check: enable

#keyboard: keymap=/usr/share/bochs/keymaps/x11-pc-us.map
# gdbstub: enabled=1, port=1234, text_base=0, data_base=0, bss_base=0

输入bochs -f boshsrc.disk启动 bochs,如果有 PANIC 报错,可以按照文末附 1 进行解决,也可以直接注释掉该行。
当命令行出现<bochs: 1>且弹出窗口无报错时,表示虚拟机成功运行。

创建硬盘

输入命令:bximage
按照书中的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
========================================================================
bximage
Disk Image Creation / Conversion / Resize and Commit Tool for Bochs
$Id: bximage.cc 13481 2018-03-30 21:04:04Z vruppert $
========================================================================

1. Create new floppy or hard disk image
2. Convert hard disk image to other format (mode)
3. Resize hard disk image
4. Commit 'undoable' redolog to base image
5. Disk image info

0. Quit

Please choose one [0] 1

Create image

Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd]

What kind of image should I create?
Please type flat, sparse, growing, vpc or vmware4. [flat]

Choose the size of hard disk sectors.
Please type 512, 1024 or 4096. [512]

Enter the hard disk size in megabytes, between 10 and 8257535
[10] 60

What should be the name of the image?
[c.img] hd60M.img

Creating hard disk image 'hd60M.img' with CHS=121/16/63 (sector size = 512)

The following line should appear in your bochsrc:
ata0-master: type=disk, path="hd60M.img", mode=flat

将最后一行添加到bochsrc.disk配置中,至此,第一章工作完成。

附 1:Bochs 启动问题排查

display library ‘sdl’ not available

  1. 安装 sdl:sudo apt install bochs-sdl
  2. 修改配置文件中:display: sdl为:display: sdl2

dlopen failed for module ‘ips’ (libbx_ips.so): file not found:

注释掉 ips;

‘keyboard_mapping’ is deprecated - use ‘keyboard’ option instead.

keybord_mapping: enabled=1,map=/usr/share...改为keybord: keymap=/usr/share...

Message: ROM: System BIOS must end at 0xfffff

问题原因:
在 2.3.5 以前的 bochs 使用的 BIOS-bochs-latest 是 64k 的,那个时候需要加上
romimage: file=BIOS-bochs-latest,address=0xf0000
在 2.3.5 中的 BIOS-bochs-latest 更新了,变成了 128k 的,这个时候配置需要改为
romimage: file=$BXSHARE/BIOS-bochs-latest
解决方法:去掉romimage项中的address

参考文章

  1. 操作系统真象还原 读书笔记 01–环境配置
相关文章
评论
分享
  • 《操作系统真象还原》:第八章 内存管理系统

    8.1 makefile 简介 这部分可参考阮一峰的讲解:https://www.ruanyifeng.com/blog/2015/02/make.html 8.1.1 makefile 是什么 makefile 是 Linu...

    《操作系统真象还原》:第八章 内存管理系统
  • 《操作系统真象还原》:第七章 中断

    7.1 中断是什么,为什么要有中断 运用中断能够显著提升并发,从而大幅提升效率。 7.2 操作系统是中断驱动的 略 7.3 中断分类 把中断按事件来源分类,来自 CPU 外部的中断就称为外部中断,来自 CPU 内部的中断称为内部...

    《操作系统真象还原》:第七章 中断
  • 《操作系统真象还原》:第六章 完善内核

    6.1 函数调用约定简介 咱们实验使用cdecl。这里提一下stdcall,cdecl与stdcall的区别在于由谁来回收栈空间。 stdcall是被调用者清理参数所占的栈空间。 举例来说: 12int subtract(int ...

    《操作系统真象还原》:第六章 完善内核
  • 《操作系统真象还原》:第五章 保护模式进阶——加载内核

    5.3 加载内核 5.3.1 用 C 语言写内核 第一个 C 语言代码: 1234int main(void) { while(1); return 0;} 这个内核文件什么都没做,通过while(1)这个死循...

    《操作系统真象还原》:第五章 保护模式进阶——加载内核
  • 《操作系统真象还原》:第五章 保护模式进阶——内存分页机制

    从这一刻起,我们才算开始了真正的操作系统学习之旅 5.1 获取物理内存容量 5.1.1 Linux 获取内存的方法 在 Linux 2.6 内核总是用detect_memory函数来获取内存容量的。其函数本质上是通过调用 BI...

    《操作系统真象还原》:第五章 保护模式进阶——内存分页机制
  • 《操作系统真象还原》:第四章 保护模式入门

    4.1 保护模式概述 在本章大家会见到全局描述符表、中断描述符表、各种门结构,这是 CPU 提供给应用的,咱们用好就行。 保护模式强调的是“保护”,它是在 Intel 80286 CPU 中首次出现,这是继 8086 之后,Inte...

    《操作系统真象还原》:第四章 保护模式入门
  • 《操作系统真象还原》:第三章 完善MBR——I/O接口

    3.3 让我们对显示器说点什么吧 3.3.1 CPU 如何与外设通信——IO 接口 IO 接口功能: 设置数据缓冲,解决 CPU 与外设的速度不匹配 设置信号电平转换电路 设置数据格式转换 设置时序控制电路来同步 CPU 和外部...

    《操作系统真象还原》:第三章 完善MBR——I/O接口
  • 《操作系统真象还原》:第三章 完善MBR——CPU的实模式

    针对汇编 几个知识点: 第 1 行和第 4 行的 mov 操作,机器码第 1 个宇节都是B8,而另外第 2、3 行同样是 mov 指令,机器码却有天壤之别,似乎找不到共性。原因是机器码是由很多部分组成的,比如指令前缀、主操作码字...

    《操作系统真象还原》:第三章 完善MBR——CPU的实模式
  • 《操作系统真象还原》:第二章 编写 MBR

    先了解 CPU 的两种工作模式:实模式和保护模式 实模式(英语:Real mode)是 Intel 80286 和之后的 x86 兼容 CPU 的操作模式。实模式的特性是一个 20 比特的区段存储器地址空间(意思为只有 1MB 的存...

    《操作系统真象还原》:第二章 编写 MBR
  • 6月阅读总结

    “零拷贝”技术 Sogou C++ Workflow:搜狗公司的 C++服务器引擎,支持 500k QPS Reducing CPU scheduler latency in Linux:CPU 调度算法 BMQ 和 CFS 的对比...

    6月阅读总结