xv6 lec3 OS Organization and System Calls
3.1 上一节课回顾
- 操作系统的基本架构是,os之上时shell,echo,find等用户态程序;中间是os,为用户程序提供服务与管理;os之下时硬件,os为上层应用提供unix风格的接口,使得硬件变成了简单的抽象
3.2 操作系统隔离性(isolation)
- 稻草人提案法(就是头脑风暴找出错误)
- 操作系统提供的虚拟内存,进程切换(进程抽象了CPU,OS不是直接提供CPU给应用程序,而是项应用程序提供进程)提供了隔离性。
- exec抽象了内存,当我们在执行exec系统调用的时候,我们会传入一个文件名,而这个文件名对应了一个应用程序的内存镜像。内存镜像里面包括了程序对应的指令,全局的数据。
- file抽象了磁盘
3.3 操作系统防御性(Defensive)
- os的防御性是指其,能够应对恶意的应用程序
- 通过硬件实现强隔离性,第一是user/kernel mode(kernel mode在RISC-V被称为Supervisor mode),第二是page table/虚拟内存
- 如果需要运行能够支持多个应用程序的操作系统,需要同时支持user/kernel mode和虚拟内存
3.4 硬件对于强隔离的支持
- 在RISC-V还有第三种模式,叫做machine mode
3.5 User/Kernel mode切换
3.6 宏内核 vs 微内核 (Monolithic Kernel vs Micro Kernel)
- 内核是可信任的计算空间(Trusted Computing Base)TCB。
- 宏内核是指所有的操作系统服务都在kernel mode中。宏内核的好处是可以将文件系统,虚拟内存,进程管理等子模块紧密的集成在一起,性能好。但是,庞大的内核由于代码量大,容易出错,如果需要运行大量内核计算程序,适合桌面操作系统,比如windows,服务器操作系统,linux
- 微内核是指将操作系统的大多数部分运行在内核之外。微内核代码量小,bug少,但是性能低,比如这里的IPC通信,需要两次用户/内核态之间的切换,适合minix,cell这种嵌入式操作系统
3.7 编译运行kernel
- 在xv6中,所有的kernel文件夹下的文件会被编译成一个二进制文件,然后这个二进制文件会被运行在kernel mode。user文件夹类似,mkfs是一个文件镜像?
- fs.img磁盘驱动?
3.8 QEMU
- 对于硬件编程(比如对于UART设备),就是对其寄存器完成 memory mapped I/O,之后复用普通的load/store指令去读写硬件设备的控制寄存器,进而去控制设备。
- qemu仿真了RISC-V处理器,它做了三件事:1.读取4字节或者8字节的RISC-V指令 2.解析RISC-V指令 3.软件去执行相应的指令; 对于每一个CPU核,qemu都会去运行一个循环
3.9 XV6 启动过程
- qemu内部有一个gdb server?
- 可以把内核的运行看成一个可执行文件,设置完断点后,执行没有停在断点处?
- kernel.ld定义了内核如何被加载,一开始执行内核代码的时候处于machine mode,没有内存分页,没有隔离性
- userinit函数有点像是胶水代码(胶水代码不实现具体的功能,只是为了适配不同的部分而存在),在userinit函数中分配了第一个进程并执行了一段initcode对应与这段汇编,但是为什么普通的系统调用不需要
la a0, init
与la a1, argv
这段initcode汇编又会去通过exec系统调用执行init程序其中主要就是设置console之类的,之后还会fork子进程,并在子进程中执行shell,shell同样是通过exec系统调用实现的