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 调试时,以下是一些专业建议:
使用 TUI 模式:
gdb -tui
或Ctrl+X+A
启用文本用户界面,同时查看源代码和调试信息。设置断点:
break <function>
在函数入口设置断点。break <file>:<line>
在指定文件的某行设置断点。
条件断点:
break <location> if <condition>
设置条件断点,仅在满足条件时中断。查看变量:
print <variable>
查看变量值。display <variable>
每次停止时自动显示变量值。
多线程调试:
info threads
查看所有线程。thread <id>
切换到指定线程。
回溯调用栈:
bt
查看当前调用栈,frame <number>
切换到指定栈帧。反汇编:
disassemble
查看当前函数的汇编代码。使用 GDB 脚本: 将常用命令写入
.gdbinit
文件,自动加载配置。调试核心转储:
gdb <executable> <corefile>
分析程序崩溃时的核心转储文件。优化调试体验:
set pagination off
禁用分页。set logging on
记录调试输出到文件。
这些方法可以显著提高调试效率,帮助你更快定位问题。
GDB 学习...
1.5. 提问 和 人类的未来
把 AI 当成一个不厌其烦教你的专业人士...
想和其他人拉开差距的话
不要卷 GPA...
使用 prompt: 我在做...。如果你是一位...专业人士,有更好的方法和建议吗?尽可能全面。
你的学习效率会极大提高
留给人类的时间不多了...
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
扫描磁盘,找到附近的 ELF 文件头,加载到内存
ELF(Executable and Linkable Format)是一种常见的可执行文件格式,广泛用于Linux和其他Unix-like系统。GRUB会寻找包含ELF文件头的文件,这些文件通常是操作系统的引导程序或内核文件。
这个 ELF 文件时 Grub,弹出选择系统的窗口
加载 Linux Kernel
SSD(Solid State Drive,固态硬盘)一种基于半导体存储技术的存储设备,它使用闪存(Flash Memory)芯片来存储数据,而不是传统的机械硬盘(HDD)中使用的旋转磁盘。
/mnt 是一个临时挂载点,用于将外部存储设备(如USB驱动器、硬盘分区、光盘等)或网络文件系统挂载到Linux文件系统中,使得这些设备或文件系统中的数据可以被访问和操作。
WSL 常用的 /mnt
6.5. RISC-V: 固件与操作系统引导
只需要提问 & 追问就行了
RISC-V 系统是如何复位、执行什么固件、如何加载操作系统的?
复位后,系统依次执行ZSBL、FSBL、OpenSBI等固件阶段,最终加载并启动操作系统。
OpenSBI 的入口位于什么地方?
通常位于 0x80000000 ,由FSBL加载并跳转执行。
_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 的交叉编译工具链
RISC-V GNU 工具链
配置和构建工具链
...这一步好麻烦啊!!!
这一步就要 make 很多的东西...很多文件夹...
最后发现好像不用这么麻烦啊!
好像有一个
apt install binutils-riscv64-linux-gnu
就好了...kimi还让我去克隆了一个工具链...虽然不知道有无用
将工具链路径添加到环境变量
验证工具链是否安装成功
这一步应该是成功了
编译!
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),能够模拟多种不同的硬件架构。它广泛用于开发、测试和运行各种操作系统和应用程序,尤其是在嵌入式系统和虚拟化领域。
硬件模拟:模拟多种硬件平台,包括本次使用的 RISC-V
虚拟化
网络模拟
存储设备模拟
图形界面
调试支持
QEMU 的工作模式
KVM 模式:结合 KVM(Kernel-based Virtual Machine),提供硬件加速的虚拟化支持,提高虚拟机的性能。
Prompt:我在刚刚编译的opensbi文件中 qemu的作用是什么
AI:在你刚刚编译的 OpenSBI 文件中,QEMU 的作用是模拟一个 RISC-V 架构的硬件环境,以便运行和测试 OpenSBI 固件。
对于功利性强大的我...没好处的事我不会干的
理解 RISC-V 架构
RISC-V 是一种开源的指令集架构(ISA),具有简洁、模块化和可扩展的特点。
OpenSBI 是 RISC-V 架构中的一个关键组件,用于在 M 模式(Machine Mode)和 S 模式(Supervisor Mode)之间进行通信。
学习启动过程
启动过程是操作系统运行的基础。
OpenSBI 负责初始化硬件并加载操作系统。
固件在启动过程中的角色,以及如何与操作系统交互
硬件抽象层(HAL)
OpenSBI 提供了硬件抽象层(HAL)使得操作系统可以独立于硬件平台运行。
掌握平台无关性:理解如何设计和实现平台无关的代码,提高代码的可移植性。
中断和异常处理
中断和异常处理是操作系统中的关键功能。
OpenSBI 提供了中断和异常处理机制,使得操作系统可以安全地运行。
多操作系统支持
OpenSBI 支持在同一个硬件平台上运行多个操作系统。
掌握隔离机制:了解如何通过硬件和软件机制实现不同操作系统之间的隔离。
虚拟化支持
OpenSBI 为虚拟化提供了基础支持,使得虚拟机可以安全地运行在 RISC-V 硬件上。
掌握虚拟化实现:理解如何在 RISC-V 架构上实现虚拟化,以及如何通过固件支持虚拟化功能。
嵌入式系统开发
OpenSBI 广泛应用于嵌入式系统中,用于初始化硬件并加载操作系统。
7. 配置自己的 AG!
今天我有我自己的舞台,我一直认为我很独特!我一定会有自己的天地的!!!
7.1. Deepseek-r1-7b
建议版本的AG,能够进行一些简易的交流...
主要是笔记本有点垃了,跑不了满血版本的...
Last updated