回顾 “什么是操作系统”
进程 = 状态机
理解一个真正的 “操作系统” 上的进程是什么样的
进程 = 状态机
操作系统
RV64 基础
int main() {
printf("Hello, World\n");
}
0000000000000560 <main>:
560: 1141 addi sp,sp,-16
562: 00000517 auipc a0,0x0
566: 13e50513 addi a0,a0,318
56a: e406 sd ra,8(sp)
56c: fe5ff0ef jal ra,550 <puts@plt>
570: 60a2 ld ra,8(sp)
572: 4501 li a0,0
574: 0141 addi sp,sp,16
576: 8082 ret
int f(int a, int b) {
return printf("%d + %d = %d\n", a, b, a + b);
}
000000000000064a <f>:
64a: 00b506bb addw a3,a0,a1
64e: 862e mv a2,a1
650: 85aa mv a1,a0
652: 00000517 auipc a0,0x0
656: 06650513 addi a0,a0,102
65a: bddd j 550 <printf@plt>
xv6-riscv/user: 大量的用户程序
QEMU: 我就是大部分的 Firmware
0x80000000
0x1000
开始执行TFSC; TFM
qemu -kernel
loads the kernel at 0x80000000
and causes each CPU to jump therekernel.ld
causes the following code to be placed at 0x80000000
Privilege levels
Control and Status Register (CSR)
熟悉的 OSLab 味道来了
一系列系统初始化 (不用怕)
w_mepc(main)
mret
- M-Mode return 带权限切换的跳转main
开始执行就像你们 OSLab0 里的弹球 int x, y;
xv6 中的一些对象
userinit()
user/initcode.S
exec("/init", ["/init", NULL]);
想调试它?
本次课内容与目标
Take-away messages