内核是操作系统中很重要的概念,尤其是对Linux系统来说,但是内核两个字又很抽象,此外还有内核态、用户态等等概念,这篇文章来盘一下。
1.什么是内核?
一句话的回答:
“内核是操作系统常驻存储器的部分” ——援引自《深入理解计算机系统》P504
详细一点点:
内核是为应用程序提供对硬件安全访问的软件,具有管理进程、管理内存、管理硬件设备IO等能力。
2.什么是内核态、内核模式 | 用户态、用户模式?
内核态 = 内核模式
用户态 = 用户模式
在处理器中用了某寄存器的一个bit来描述应用程序当前享有的权力,这个bit叫做方式位(mode bit),方式位置位时进行就进入内核模式。
运行在内核模式的进程可以执行指令集中的任何指令,可以访问系统中存储器的任何地址。
相应的,如果没有设置方式位时应用程序就运行在用户模式,默认也是在用户模式下。
运行在用户模式的进程,不允许执行特权指令(发起I/O),也不允许直接引用地址内核区中的代码和数据。
/*********
如果程序默认运行在用户模式的话,那就不具备使用硬件设备的能力,那应该怎么去使用硬件IO呢——进入到内核模式。
那怎么进入到内核模式呢——通过系统调用。
那系统调用是啥——见4,但是先盘一下异常。
/*********
3.什么是异常?
这里的异常不是编程语言里的try、catch、throw异常,而是操作系统中的异常,好像有点陌生有熟悉,其实具体到实例就一目了然了,盘一下:
异常有4种,分别是中断、陷阱、故障、终止。
其中,中断比较熟悉,计算机组成原理课上讲过,另外几个看汉字认识,放到计算机场景里可能稍微有点懵。其实都是平常编程中遇到过的,例如常见的有:
中断:硬件I/O(网卡收发socket、磁盘读写文件、定时器芯片)
陷阱:系统调用(read函数、fork函数、exec函数、exit函数)
故障:缺页异常、分母为0、算术溢出、非法访问的内存地址
终止:硬件错误
回顾2中提出的问题,怎么从用户模式进入内核模式,通过系统调用即可,也是异常之一。
4.什么是系统调用?
一句话概括:
系统调用就是从用户模式到内核模式的桥梁。
从程序员的角度来看,系统调用看起来和普通的函数一样,直接使用就行了。实际上执行的原理有很大区别。
普通函数的过程:
(1)函数的参数入栈
(2)保存调用函数的下一条指令地址
(3)调用函数
(4)返回保存的指令地址
(5)返回值出栈[如果有的话]
系统调用的过程:
(1)根据异常号[系统调用为80]与异常表寄存器找到对应的异常表表项
(2)根据表项里记录的异常处理程序地址调用对应的异常处理程序
(3)处理完之后将控制返回给被中断的程序
5.什么是内核空间、用户空间?
内核空间:存放操作系统的数据、代码,具体就是前四分之一的内存空间
用户空间:存放用户进程的数据、代码
处于用户态的程序只能访问用户空间,
而处于内核态的程序可以访问用户空间和内核空间。
参考文献
- 《深入理解计算机系统》8.1~8.2
- 内核态(内核空间)和用户态(用户空间)的区别和联系
- linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间
- 函数调用过程