03 - Hardware Perspective on Operating Systems

03 - 硬件视角的操作系统

1. 内容回顾

复习上节课的内容,正好对于我自己来说(三天没看了),复习了一点...

1.1. 程序 == 状态机

gdb 单步执行 = 状态迁移

1.2. 系统调用

软件与操作系统之间的的接口

1.3. 题外话

南大也接入了 DeepSeek...

讲了一下 load balence 的实际应用(x)...

1.4. GDB 调试

Prompt: 我在命令行中使用 gdb 调试。如果你是一位专业人士,有更好的方法和建议吗?尽可能全面。

在命令行中使用 GDB 调试时,以下是一些专业建议:

  1. 使用 TUI 模式gdb -tuiCtrl+X+A 启用文本用户界面,同时查看源代码和调试信息。

  2. 设置断点

    • break <function> 在函数入口设置断点。

    • break <file>:<line> 在指定文件的某行设置断点。

  1. 条件断点break <location> if <condition> 设置条件断点,仅在满足条件时中断。

  2. 查看变量

    • print <variable> 查看变量值。

    • display <variable> 每次停止时自动显示变量值。

  1. 多线程调试

    • info threads 查看所有线程。

    • thread <id> 切换到指定线程。

  1. 回溯调用栈bt 查看当前调用栈,frame <number> 切换到指定栈帧。

  2. 反汇编disassemble 查看当前函数的汇编代码。

  3. 使用 GDB 脚本: 将常用命令写入 .gdbinit 文件,自动加载配置。

  4. 调试核心转储gdb <executable> <corefile> 分析程序崩溃时的核心转储文件。

  5. 优化调试体验

    • set pagination off 禁用分页。

    • set logging on 记录调试输出到文件。

这些方法可以显著提高调试效率,帮助你更快定位问题。

GDB 学习...

1.5. 提问 和 人类的未来

把 AI 当成一个不厌其烦教你的专业人士...

想和其他人拉开差距的话

  1. 不要卷 GPA...

  2. 使用 prompt: 我在做...。如果你是一位...专业人士,有更好的方法和建议吗?尽可能全面。

  3. 你的学习效率会极大提高

  4. 留给人类的时间不多了...

2. 硬件视角的操作系统

RISC-V 处理器。开源的指令集架构(ISA),基于精简指令集计算(RISC)原则。

2.1. 硬件根本不知道操作系统

只是一个无情的指令执行机器

2.2. CS 抽象

下层不需要知道上面怎么用,只管 “无情地提供服务”

2.3. 计算机系统的状态机模型

状态

内存、寄存器的数值

初始状态

系统设定者规定

状态迁移

从 PC 取指令执行

补充

寄存器、内存

外部世界的态

  • 设备上的寄存器(memory-mapped I/O)

  • Interrupt/Reset Line

    • interrupt line 保证了系统不会陷入死循环

    • reset line 保证系统可以在任何状态恢复初始状态

  • 客观存在的,但计算机系统不能直接访问

3. 计算机系统:初始状态

Reset 按钮

x86-64 的 CPU Reset 状态是怎样的?

  • 曾经:你要去 The Friendly Manual 里大海捞针

    • CPU Reset (Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A/3B)

    • Volume 3A: ~400 页

      • 老师年代学习《操作系统》时的圣经

  • 今天地球人都不再需要了

    • 大海捞针可以让 AI 帮你捞

3.1. CPU Reset 其他体系结构

undefined...

RISC-V:

  • 设计原则:省电路

  • 软件能做的,硬件不会管

4. 计算机系统:状态迁移

执行指令

响应终端

输入输出

4.1. 总结

一句话:硬件根本不知道有没有操作系统

操作系统就是一个普通的二进制程序

5. 固件:硬件和操作系统之间的桥梁

5.1. 遗漏的细节

  • CPU Reset 开始执行

  • 从 Mem[PC] 取指令

    • PC(Program Counter,程序计数器)

    • Mem[PC]:表示从内存中地址为PC的位置取出指令

  • 译码、执行、如此往复

初始的位置一定有一个合法代码

代码 - 引导程序(Bootloader)来自系统厂商。

  • 把一个特殊的存储器 memory-map 到 CPU Reset 后的代码

    • 这段代码“出生”后就有机器完成的控制权

    • 会接管整个系统的控制权。它负责初始化硬件设备、设置内存管理、加载操作系统等。

  • 合法代码:在复位向量的地址处,必须有一个有效的指令序列。否则,CPU将无法正常启动。

5.2. Firmware

5.3. “固件”

早期固件是 ROM,更新需要换芯片。现在则是软件更新

5.4. Firmware 功能

  • 运行程序前的计算机系统配置

    • CPU 电压、内存时序、接口

  • “加载操作系统”

5.5. Firmware 就是一段代码

一个小操作系统

Legacy BIOS (Basic I/O System)

5.6. Firmware 也是需要更新的

...写保护平时会关闭,在厂商进行软件更新时会打开...

允许写入

但写保护一开始很好破解...

5.7. 如何预防?

现在只允许写入信任的固件更新

  • 数字签名机制

    • 公钥加密(Diffie-Hellman/RSA)

    • 感谢今天的 SSL/TLS(HTTPS)

为什么现在电脑病毒越来越少?

  • 更安全的操作系统

  • AppStore 机制

  • 云端备份

6. 加载操作系统

6.1. 从硬件到操作系统

6.2. IBM PC

MBR 磁盘分区...Master Boot Record,主引导记录

6.3. 如果 Firmware 也是代码

计算机系统从 CPU Reset 开始

  • CPU Reset 之后 0x7c00 应该是啥也没有的

  • Firmware 的代码扫描了磁盘、加载了它

6.4. Firmware 和系统程序员的第一个接口

Grub

  1. 扫描磁盘,找到附近的 ELF 文件头,加载到内存

ELF(Executable and Linkable Format)是一种常见的可执行文件格式,广泛用于Linux和其他Unix-like系统。GRUB会寻找包含ELF文件头的文件,这些文件通常是操作系统的引导程序或内核文件。

  1. 这个 ELF 文件时 Grub,弹出选择系统的窗口

  2. 加载 Linux Kernel

  • SSD(Solid State Drive,固态硬盘)一种基于半导体存储技术的存储设备,它使用闪存(Flash Memory)芯片来存储数据,而不是传统的机械硬盘(HDD)中使用的旋转磁盘。

  • /mnt 是一个临时挂载点,用于将外部存储设备(如USB驱动器、硬盘分区、光盘等)或网络文件系统挂载到Linux文件系统中,使得这些设备或文件系统中的数据可以被访问和操作。

  • WSL 常用的 /mnt

6.5. RISC-V: 固件与操作系统引导

只需要提问 & 追问就行了

  1. RISC-V 系统是如何复位、执行什么固件、如何加载操作系统的?

复位后,系统依次执行ZSBL、FSBL、OpenSBI等固件阶段,最终加载并启动操作系统。

  1. OpenSBI 的入口位于什么地方?

通常位于 0x80000000 ,由FSBL加载并跳转执行。

  1. _start 开始的 _try_lottery 是做什么的?

在多核系统中选择主核并进行核心同步,确保系统启动的有序性。

6.6. 编译 OpenSBI

Everything is a State Machine

  • Makefile 也是程序;他也是状态机

  • 程序不好读?我们可以调试它!

    • 计算机系统公里:你能想到的就一定有人做到

    • “总有人会去发明轮子”

OpenSBI(Open Source Supervisor Binary Interface)是 RISC-V 架构中一个非常重要的组件,它是 RISC-V Supervisor Binary Interface(SBI)规范的一个开源实现。

安装工具链:安装适合 RISC-V 的交叉编译工具链

  1. RISC-V GNU 工具链

  2. 配置和构建工具链

    1. ...这一步好麻烦啊!!!

    2. 这一步就要 make 很多的东西...很多文件夹...

    3. 最后发现好像不用这么麻烦啊!

    4. 好像有一个 apt install binutils-riscv64-linux-gnu就好了...kimi还让我去克隆了一个工具链

    5. ...虽然不知道有无用

  3. 将工具链路径添加到环境变量

  4. 验证工具链是否安装成功

    1. 这一步应该是成功了

编译!

make PLATFORM=generic FW_TYPE=FW_DYNAMIC

输出!

最终生成的文件在你的输出中,最后一条信息表明最终的固件文件已经生成:OBJCOPY platform/generic/firmware/fw_payload.bin

  • OBJCOPY :这是一个工具,用于从目标文件中提取特定的内容并生成最终的二进制文件。

  • fw_payload.bin :这是最终生成的固件文件,包含了 OpenSBI 的二进制代码。

  • 下面用 QEMU 来看看启动的信息!

QEMU

qemu-system-riscv64 -machine virt -kernel build/platform/generic/firmware/fw_payload.bin -nographic

root@LAPTOP-GT06V0GS:/mnt/d/CSLab/osCourse/lec3/opensbi# qemu-system-riscv64 -machine virt -kernel build/platform/generic/firmware/fw_payload.bin -nographic

# OpenSBI 版本和平台信息
OpenSBI v1.3	# 显示当前运行的 OpenSBI 版本(1.3)。
   ____                    _____ ____ _____
  / __ \                  / ____|  _ \_   _|
 | |  | |_ __   ___ _ __ | (___ | |_) || |
 | |  | | '_ \ / _ \ '_ \ \___ \|  _ < | |
 | |__| | |_) |  __/ | | |____) | |_) || |_
  \____/| .__/ \___|_| |_|_____/|___/_____|
        | |
        |_|

# 平台名称:  riscv-virtio,qemu  ,表示这是一个在 QEMU 上运行的虚拟 RISC-V 平台。
Platform Name             : riscv-virtio,qemu

# 平台特性:  medeleg  ,表示支持将机器模式的异常委托给监督模式。
Platform Features         : medeleg

# HART 计数:1,表示只有一个硬件线程(HART)。
Platform HART Count       : 1

# IPI 设备:  aclint-mswi  ,表示使用 ACLINT MSI(Message Signaled Interrupt)作为 IPI 设备。
Platform IPI Device       : aclint-mswi

# 定时器设备:  aclint-mtimer  ,运行频率为 10 MHz。
Platform Timer Device     : aclint-mtimer @ 10000000Hz

# 控制台设备:  uart8250  ,表示使用 UART 8250 作为控制台设备。
Platform Console Device   : uart8250

# 其他设备:显示了其他设备的状态(如 HSM、PMU、重启、关机、挂起和 CPPC 设备)。
Platform HSM Device       : ---
Platform PMU Device       : ---
Platform Reboot Device    : sifive_test
Platform Shutdown Device  : sifive_test
Platform Suspend Device   : ---
Platform CPPC Device      : ---

# 固件信息
# 固件基地址:  0x80000000  ,表示固件加载的起始地址。
Firmware Base             : 0x80000000
# 固件大小:322 KB,表示固件的总大小。
Firmware Size             : 322 KB

# 固件读写区域:  0x40000  ,大小为 66 KB。
Firmware RW Offset        : 0x40000
Firmware RW Size          : 66 KB

# 固件堆区域:  0x48000  ,总大小为 34 KB,其中 2 KB 被保留,9 KB 被使用,22 KB 空闲。
Firmware Heap Offset      : 0x48000
Firmware Heap Size        : 34 KB (total), 2 KB (reserved), 9 KB (used), 22 KB (free)

# 固件暂存区:总大小为 4096 字节,其中 760 字节被使用,3336 字节空闲。
Firmware Scratch Size     : 4096 B (total), 760 B (used), 3336 B (free)

# 运行时 SBI 版本:1.0,表示运行时 SBI 的版本。
Runtime SBI Version       : 1.0


# 域信息
Domain0 Name              : root
Domain0 Boot HART         : 0
Domain0 HARTs             : 0*
Domain0 Region00          : 0x0000000002000000-0x000000000200ffff M: (I,R,W) S/U: ()
Domain0 Region01          : 0x0000000080040000-0x000000008005ffff M: (R,W) S/U: ()
Domain0 Region02          : 0x0000000080000000-0x000000008003ffff M: (R,X) S/U: ()
Domain0 Region03          : 0x0000000000000000-0xffffffffffffffff M: (R,W,X) S/U: (R,W,X)
Domain0 Next Address      : 0x0000000080200000
Domain0 Next Arg1         : 0x0000000087e00000
Domain0 Next Mode         : S-mode
Domain0 SysReset          : yes
Domain0 SysSuspend        : yes

# 启动 HART 信息
Boot HART ID              : 0
Boot HART Domain          : root
Boot HART Priv Version    : v1.12
Boot HART Base ISA        : rv64imafdch
Boot HART ISA Extensions  : time,sstc
Boot HART PMP Count       : 16
Boot HART PMP Granularity : 4
Boot HART PMP Address Bits: 54
Boot HART MHPM Count      : 16
Boot HART MIDELEG         : 0x0000000000001666
Boot HART MEDELEG         : 0x0000000000f0b509

看不懂,让AI解释一下...加上注释,这个学习就到此结束了...

中间多次想放弃编译OpenSBI的...但还是听老师的话坚持下来了...主要靠AI...进一步了解了一些内容...

最终成功编译,而且成功使用 QEMU(此前一直不知道是什么) 来对.bin 的硬件进行查看

QEMU(Quick Emulator)是一个开源的模拟器和虚拟机监控器(Hypervisor),能够模拟多种不同的硬件架构。它广泛用于开发、测试和运行各种操作系统和应用程序,尤其是在嵌入式系统和虚拟化领域。

  1. 硬件模拟:模拟多种硬件平台,包括本次使用的 RISC-V

  2. 虚拟化

  3. 网络模拟

  4. 存储设备模拟

  5. 图形界面

  6. 调试支持

QEMU 的工作模式

  • KVM 模式:结合 KVM(Kernel-based Virtual Machine),提供硬件加速的虚拟化支持,提高虚拟机的性能。

Prompt:我在刚刚编译的opensbi文件中 qemu的作用是什么

AI:在你刚刚编译的 OpenSBI 文件中,QEMU 的作用是模拟一个 RISC-V 架构的硬件环境,以便运行和测试 OpenSBI 固件。

对于功利性强大的我...没好处的事我不会干的

  1. 理解 RISC-V 架构

    1. RISC-V 是一种开源的指令集架构(ISA),具有简洁、模块化和可扩展的特点。

    2. OpenSBI 是 RISC-V 架构中的一个关键组件,用于在 M 模式(Machine Mode)和 S 模式(Supervisor Mode)之间进行通信。

  2. 学习启动过程

    1. 启动过程是操作系统运行的基础。

    2. OpenSBI 负责初始化硬件并加载操作系统。

    3. 固件在启动过程中的角色,以及如何与操作系统交互

  3. 硬件抽象层(HAL)

    1. OpenSBI 提供了硬件抽象层(HAL)使得操作系统可以独立于硬件平台运行。

    2. 掌握平台无关性:理解如何设计和实现平台无关的代码,提高代码的可移植性。

  4. 中断和异常处理

    1. 中断和异常处理是操作系统中的关键功能。

    2. OpenSBI 提供了中断和异常处理机制,使得操作系统可以安全地运行。

  5. 多操作系统支持

    1. OpenSBI 支持在同一个硬件平台上运行多个操作系统。

    2. 掌握隔离机制:了解如何通过硬件和软件机制实现不同操作系统之间的隔离。

  6. 虚拟化支持

    1. OpenSBI 为虚拟化提供了基础支持,使得虚拟机可以安全地运行在 RISC-V 硬件上。

    2. 掌握虚拟化实现:理解如何在 RISC-V 架构上实现虚拟化,以及如何通过固件支持虚拟化功能。

  7. 嵌入式系统开发

    1. OpenSBI 广泛应用于嵌入式系统中,用于初始化硬件并加载操作系统。

7. 配置自己的 AG!

今天我有我自己的舞台,我一直认为我很独特!我一定会有自己的天地的!!!

7.1. Deepseek-r1-7b

建议版本的AG,能够进行一些简易的交流...

主要是笔记本有点垃了,跑不了满血版本的...

Last updated