Lec 3: OS organization and system calls
- Ref: https://github.com/huihongxiao/MIT6.S081/tree/master/lec03-os-organization-and-system-calls
- Preparation: xv6 book Chapter 2
Topic
- Isolation 隔离性
- Kernel/User mode 内核/用户模式
- System Call 系统调用
- xv6 实现
Isolation 隔离性
Unix Interface - 实现复用和物理内存隔离:
- abstract the HW resource 抽象硬件资源
- process: instead CPU 进程:应用程序通过进程与 CPU 交换, 抽象了 CPU
- exec: instead of memory 加载镜像, 内存隔离
- files: instead of disk block 文件系统: 抽象了磁盘块
Defensive 防御性
App cannot crash the OS
App cannot break out of its isolation
通过硬件实现强隔离性 Strong Isolation between apps + OS
typical: HW support:
- user/kernel mode
- virtual memory
user/kernel mode
user: unprivileged instructions - ADD, SUB, JRC, BRANCH
kernel: privileged instructions - setup page table设置页表寄存器, 关闭时钟中断
virtual memory
page table: virtual addr -> physical addr
process has own page table
memory isolation
User/Kernel mode Switch
RISC-V: ECALL 指令: 控制权由用户转移至内核
每个应用程序发起系统调用通过 syscall
函数
Kernel = Trusted Computing Base(TCB) 内核被称为可被信任的计算空间
- Kernel must have no bugs
- Kernel must treat processes as malicious
Monolithic Kernel vs Micro Kernel 宏内核 vs 微内核
- 宏内核: 所有操作系统服务都在内核态
- 缺点: 内核中有大量代码, Bug 隐患
- 有点: 子模块在同一程序, 性能好
- 微内核: 内核仅有较少模块
- 优点: 较少的 Bug
- 缺点: 用户态内核态切换的性能损耗; 共享困难
xv6: 宏内核
内核编译
- Makefile 读取 C 文件, 调用 gcc 编译器 生成 .s 的 RISC-V 汇编语言文件
- 调用汇编解释器生成 .o 的二进制文件
- 所有内核 C 文件重复 1, 2 的操作
- 系统加载器(Loader)收集所有 .o 文件, 链接在一起生成内核文件
传给QEMU的几个参数:
- kernel:这里传递的是内核文件(kernel目录下的kernel文件),这是将在QEMU中运行的程序文件。
- m:这里传递的是RISC-V虚拟机将会使用的内存数量
- smp:这里传递的是虚拟机可以使用的CPU核数
- drive:传递的是虚拟机使用的磁盘驱动,这里传入的是fs.img文件
XV6 启动过程
kernel/entry.S
-> kernel/start.c
-start()
-> kernel/main.c
-main()
-> kernel/proc.c
-userinit()
第一个用户进程, 用于与操作系统交互
userinit()
中会执行 initcode
代码, 其中会执行系统调用 SYS_exec
, 并执行用户态的 init
程序(user/init.c
), 最终将 shell 运行起来.