操作系统的核心功能在内核中
对于与硬件关联程度的程序
由于进程管理,存储器管理,设备管理这些工作与硬件联系较少,有时候不会把它们放到内核中。
所以有的操作系统不把这些功能放到内核中,只保留与硬件接触最紧密的部分
所以此时就有两种内核设计方法
属于内核的功能需要运行在内核态,不属于内核的功能运行在用户态
采用微内核时,进程管理,存储管理,设备管理都涉及到需要请求内核的工作,此时需要变态
而大内核只需要两次变态
每层只会下一层的接口
从底层开始调试,从而保证上一层关于底一层方面的接口没有问题,从而只需关注本层的相关调试
扩充方便,只需要提供对于层与层之间的接口即可
有时候底层可能需要高层的功能,此时就与高层只能调用底层这个规定不同了,所以说难以合理定义各层的边界
不能跨层调用,此时需要一层一层往下传递
模块调用多,所以接口的定义实现有时不够完善从而使得每个模块都正好满足
都能相互调用,此时如果某个模块出现问题,可能出现的问题是调用的模块的问题,也有可能是自身模块的问题
确定接口就可以并行开发就是说确定好接口后就可以同时准备各个接口的代码实现
内核中每个模块之间的依赖性很强,所以当内核中某个模块出现问题,可能会导致整个系统出现问题
Exokernel
外核分配回收未经抽象(没有虚拟化或者说物理地址)的硬件资源
程序通过库函数调用普通内核的一些内核功能,也可以调用外核的一些功能
在普通操作系统中,进程申请内存空间时得到的时虚拟的地址空间(连续的),此时虚拟页面对应到实际的物理页框中,这些物理页框在内存中其实是离散的。给进程(一般是存文件)分配的外存空间也是虚拟的地址空间(连续),对应物理磁盘的存储空间也可能是离散的
外核给用户进程直接分配未经抽象的硬件资源,当用户进程经常要随机访问自己所分配到的虚拟外存空间时,此时由于实际对应的物理空间是离散的,在随机访问各个位置时可能需要大量的移动磁头。而如果采用外核分配,直接得到一块连续的物理外存空间,当随机访问各个地址时,磁头移动的距离减少,性能从而提升
外核也能申请连续物理内存空间,此时用户看到就是实实在在的物理内存地址空间。
外核需要保证硬件资源使用安全,即本进程不能访问其他进程的空间,其他进程也不能访问本进程的空间
一致性:每个进程申请的地址类型不同(物理地址和虚拟地址),这样对后续的管理需要有不同的处理,所以也会更复杂
虚拟地址分配时,进程访问访问自己地址空间时,此时需要查页表,将虚拟地址转换为实际物理地址