硬件视角的操作系统

本讲内容:计算机硬件的状态机模型;回答以下问题:

  • 什么是计算机硬件?
  • 计算机硬件和程序员之间是如何约定的?
  • 听说操作系统也是程序。那到底是鸡生蛋还是蛋生鸡?

硬件与程序员的约定

Bare-metal 与程序员的约定

Bare-metal 是指在没有操作系统或者其他软件支持的情况下直接运行硬件的情况。

  • Bare-metal 与厂商的约定

    • CPU Reset 后的状态 (寄存器值)

Reset 后处理器都从固定地址 (Reset Vector) 启动
- 厂商自由处理这个地址上的值
- Memory-mapped I/O

  • 厂商为操作系统开发者提供 Firmware

    • 管理硬件和系统配置
    • 把存储设备上的代码加载到内存
      • 例如存储介质上的第二级 loader (加载器)
      • 或者直接加载操作系统 (嵌入式系统)
  • Firmware 负责加载操作系统: BIOS vs UEFI
    Legacy BIOS 把第一个可引导设备的第一个 512 字节加载到物理内存的 7c00 位置
    此时处理器处于 16-bit 模式。

  • 我们构造一个 512 字节的 “Master Boot Record” 作为磁盘镜像装在在模拟器上,并且用 gdb 观察指令在处理器上的执行。

如何验证这一点?
计算机系统公理:你想到的就一定有人做到

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
#define SECT_SIZE  512

.code16 // 16-bit assembly

// Entry of the code
.globl _start
_start:
lea (msg), %si // R[si] = &msg;

again:
movb (%si), %al // R[al] = *R[si]; <--+
incw %si // R[si]++; |
orb %al, %al // if (!R[al]) |
jz done // goto done; --+ |
movb $0x0e, %ah // R[ah] = 0x0e; | |
movb $0x00, %bh // R[bh] = 0x00; | |
int $0x10 // bios_call(); | |
jmp again // goto again; ---+---+
// |
done: // |
jmp . // goto done; <---+

// Data: const char msg[] = "...";
msg:
.asciz "This is a baby step towards operating systems!\r\n"

// Magic number for bootable device
.org SECT_SIZE - 2
.byte 0x55, 0xAA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
mbr.img: mbr.S
gcc -ggdb -c $<
ld mbr.o -Ttext 0x7c00
objcopy -S -O binary -j .text a.out $@

run: mbr.img
qemu-system-x86_64 $<

debug: mbr.img
qemu-system-x86_64 -s -S $< & # Run QEMU in background
gdb -x init.gdb # RTFM: gdb (1)

clean:
rm -f *.img *.o a.out
1
2
3
4
5
6
7
8
9
10
11
# Kill process (QEMU) on gdb exits
define hook-quit
kill
end

# Connect to remote
target remote localhost:1234
file a.out
break *0x7c00
layout src
continue

前三行命令定义了一个名为 hook-quit 的 GDB 钩子。当用户在 GDB 中执行 quit 命令时,GDB 将自动执行 hook-quit 钩子中定义的命令。在这个例子中,hook-quit 钩子中只有一条命令 kill,它的作用是在用户退出 GDB 时杀死正在被调试的进程。这样可以确保在退出 GDB 后,被调试的进程也会被终止,避免出现进程僵死等问题。

  • 如何用 gdb 调试 qemu
    1
    qemu-system-x86_64 -s -S mbr.img
    -S: 把CPU暂停下来
    -s: shorthand for -gdb tcp::1234 监听1234的端口

所以我们可以启动一个 gdb

1
2
gdb
target remote localhost::1234

这样就可以在gdb中调试这个qemu模拟器了。


硬件视角的操作系统
http://example.com/2023/08/02/操作系统/jyy操作系统/硬件视角的操作系统/
作者
LiuZhaocheng
发布于
2023年8月2日
许可协议