操作系统基本概念:内核,系统调用,内核态,用户态

33 阅读4分钟

1. 内核

操作系统本身就是一个c程序,而其最核心的一些功能如进程管理,内存管理,硬盘管理,网络管理等,这些代码就被成为操作系统的内核,内核分为三种概念,一种是微内核,一种是宏内核,还有一种是混合内核,但不管哪种内核,内核本身都是一种抽象思想,下面来了解一下这三种内核的设计思想。

首先,我们要了解进程这个概念,简单来说一个运行的程序就是一个进程,每个进程都有独属于他的内存区域,它可以在这个内存区域内随意进行操作,但是一旦程序想跃出此范围,操作系统便会终止该程序,这是为了安全考虑。简单了解了进程这个机制后,我们便可以解释宏内核和微内核了。

简单来说宏内核就是将所有功能放在内核中,而微内核将一部分核心功能放入内核中,而其他功能则放入内核外,也就是用户区,而混合内核则是将更多的功能放入内核,更少的功能放在用户区,三者各有优劣,宏内核由于在同一进程中,各个功能之间的通信很方便,性能更好,但缺点是一个功能出现问题,所有功能全部崩溃,微内核将所有功能分开,但这样做的后果是两个功能通信受阻,需要特殊手段,非常影响性能,而混合内核则在两者之间。

2. 系统调用

系统调用,顾名思义就是调用操作系统,对于一些高权限操作 (如设备驱动,读写硬件,进程管理,网络管理等等,其实在我的理解下,一切当前程序执行时被划分的进程内存空间以外的东西都是不被允许访问和修改的,一些相关操作都是高权限操作,都需要系统调用,当然这时是我自己的理解,不一定准确,可以不这么记),如果放任程序去进行,将会有很大的隐患。

试想一个,一个软件可以随意的使用cpu进行读写硬盘,内存等操作,那么一旦下载了恶意程序,后果不堪设想,于是为了安全考虑,cpu不允许普通的程序进行高权限操作,只允许操作系统进行高权限操作,而其他程序想要进行类似操作则需要调用操作系统api,这便是系统调用,那么它具体是怎么操作的呢?

首先我们要记住一个事实,那就是这种安全操作的始作俑者是cpu,而不是操作系统,也就是说并不是操作系统防止了普通程序进行高权限操作,而是cpu本身就限制了普通程序进行高权限操作,那么cpu是如何操作的呢?

3. 内核态和用户态

cpu定义了内核态和用户态两中状态,当内核态时,指针指向操作系统将代码推入内核栈执行,而用户态,指针指向普通程序代码被推入用户栈。

上文已经了解了什么是内核,那么这里的概念也不难理解,首先内核态和用户态本质上就是CPU上一个寄存器的值。 当操作系统处于内核态时,本质上就是改变CPU寄存器中的一个值,此时CPU必须执行内核中的代码,而用户态则反之,cpu执行普通程序代码。 而内核栈和用户栈也好理解,就是内核代码执行的栈结构内存,以及用户代码执行的栈结构内存。 执行代码本质上是CPU执行寄存器中指定地址的机器码,所以必须执行内核中的代码,本质上就是CPU存储内核态和用户态信息的寄存器改变为内核态时,CPU中保存机器码的地址,必须是内核的地址。

cpu具体是怎么实现这一点呢?我们这里以x86为例

中断向量表为操作系统初始化的一个寄存器,也就是说中断向量表的内容使操作系统决定的,这也是为什么能通过中断向量表查找到对应代码