全部学习汇总:GreyZhang/g_unix: some basic learning about unix operating system. (github.com)
这一次整理一下操作系统组织相关的知识,主要还是xv6教学操作系统相关的知识。当然,很多知识在这类技术领域是通用的。
1. 操作系统的主要功能在上一个章节中其实是已经总结出来了,这里算是再次说明:硬件的抽象以及复用、进程之间的隔离、进程之间的交互。
2. 这里从另一个方面介绍了RTOS的设计实现,恰恰可以让人感受到其实xv6是一个非实时性的操作系统。
1. exec的调用是创建分配进程存储空间的方式。
2. 隔离设计的实现其实是需要依赖于硬件功能的,这里依赖的硬件功能主要是存储映射,实现虚拟地址与物理地址之间的映射转换。
1. 错误权限下的访问会导致失败,之后OS会对这个异常的进程进行清理。
2. 内核是在内核空间中运行的软件,在SV的权限下执行。
3. 宏内核的整个操作系统都在内核空间内。
4. 宏内核的两个优点:第一,设计的过程中无需考虑各种权限的设计;第二,内核之间的接口依赖实现较为简单。
5. 宏内核很大的一个缺点:内核的错误可能会导致整个系统的重启。
6. 微内核设计中,操作系统的很多功能是在用户层设计的,这样的内核简单。
1. vx6是宏内核,大部分的UNIX都是。我疑问Linux是什么,其实在后面的内容中明确说了是宏内核。宏内核的系统,在内核中实现了所有操作系统的功能。
2. 从进程的角度看,进程可以理解为自己是独占了整个计算机硬件的。至少从设计时候的逻辑存储角度考虑是如此。
3. 这里提到的页表是一个很重要的功能,它主要实现了虚拟地址到物理地址的转换。
1. 这里的这个图给出来了一个进程角度能够看到的存储的分布。
2. 进程有一个叫做proc的结构体存储了进程相关的信息。每一个进程有两个堆栈,用户的以及内核的。其实,正是由于这种内核堆栈的存在,可以让内核管理下的硬件能够实现高度复用。
1. 这里给出了进程可能的几种状态:已经分配、就绪可以运行、运行中、等待中、退出中。
2. 页表信息也记录了进程分配的实际的物理地址信息。
3. 为什么运行的地址选择了0x100000,其实是为了避开跟硬件的冲突。我把这个跟之前做测试的时候看到的一个问题弄混了,两个地址其实是相差了16倍。下面是我之前产生疑惑的代码的部分:
1. 关于内核的启动过程,后面还得结合代码以及调试追踪环境来逐步理解一下。
2. 这里看到了另一个说明点,那就是进程的PID分配。这个分配其实是在allocproc调用的时候分配出来的。
1. 这里看到一个比较有意思的地方,最早执行的一段代码居然是一段汇编程序。
2. 这部分的内容涉及到了太多的其他章节的知识,读的时候也有点迷糊,后面不行再回读一下。
操作系统提供的进程隔离主要是通过了独立的进程堆栈空间以及存储映射技术来实现的,自然,堆栈空间其实还是可以继续细分为两种的。
很多UNIX系统是宏内核,这里明确说明了Linux其实也是宏内核。不过,QNX是一个微内核。
这样,这个章节的内容算是简单看了一下,接触到了一些全新的知识,但是理解不是很深刻。