计算机组成
计算机由软件和硬件组成,软件包括CPU、内存等,硬件包括主板,磁盘,IO设备(网卡、鼠标、键盘等)、电源按钮。
内核程序加载过程
当接通电源的时候
1、BIOS就会把它的一段代码放入了内存当中,即内存中出现的第一个程序是blos,
它里面有一些最基本的引导程序,假设跳过其他的引导
2、直接从磁盘中引导,磁盘中的第一个起始位置有一个分区表MBR
(记录了磁盘分了几个区),BIOS会从磁盘的MBR中加载一段数据,
从中找到C盘可引导分区,这个引导分区是被格式化的,
文件格式有可能是FAT、FAT32、NTFS或其他的文件系统
3、这个分区前面埋了一个线性地址,比如linux的GRUD程序,GRUD程序会被BIOS
加载入内存,grud程序中有一个驱动(代码),
这个驱动可以识别文件格式,就可以读取文件系统
4、在文件系统中就会读取到第一个文件叫kernel(操作系统内核程序),
kernel会通过引导程序被引导进入内存,这个时候kernel就占领了内存
5、给cpu发reset指令,让cpu从kernel这个空间的第一个位置开始加载指令,
此时kernel就接管了操作系统,然后开始完成操作系统的初始化,
比如启动ssh、bash、网络服务程序、tomcat等都是由kernel把程序一个一个启动起来。
内核是程序和硬件之间的中间层,内核对硬件进行统一的资源控制,程序通过内核完成对硬件的使用。
-
内核的保护模式
CPU可以访问整个内存的任何地址,但禁止用户空间程序访问内核空间中的数据和指令。
内核会把内核所在的地址空间即内核空间设置为绝对安全,然后将剩余空间划分为用户空间。
用户空间程序中的指令不能访问内核空间中的地址。
内核管理着硬件资源,比如硬盘、网卡和鼠标、键盘等一些外设,用户空间的程序只能通过内核访问这些硬件资源,又因为内核的保护模式不能让用户空间的程序直接访问内核空间的地址,所以这时候就出现了中断的概念,一个常见的中断叫时钟中断。
时钟中断
cpu有一个时间分片的概念,比如在一个cpu的情况下,执行下内核里面的程序,再切换执行下用户空间中的程序,看起来很多程序在同时运行,其实是有先后顺序的。那怎么让程序让出cpu去执行别的程序呢?通过时钟中断。
比如老式电子手表背面电路板上有一个小圆柱,有2条腿,一条腿插进了一个电源,湿手摸直流电的电源线的话,就一直麻,会以一个非常规律的哒哒哒的方式产出。
每震荡一下,就会给cpu产生一个时钟中断,比如cpu正忙着读取某一个进程的指令执行呢,1/1000秒的时候,震荡了一下,这时候cpu会把这个程序的寄存器的值更新下,记录下此时执行的状态,即保护现场,然后从中断向量表中找到这个中断号对应的回调函数,这个回调函数是在内核启动的时候注册的,切换到另外一个进程之后,读取寄存器中的数据,即恢复现场,然后继续执行。
所以时钟中断会让cpu切换程序执行,但会有保护现场和恢复现场的性能损耗,程序越多,单位时间内cpu浪费在内核调度上的时间会越多,那程序内部执行的时间会越短。
比如用户空间的程序系统调用内核中的函数读写网卡中的数据,系统调用就是通过中断实现的,完成从用户态到内核态的切换过程。
这里不是时钟片段,而是在一个时间片里通过中断的方式完成系统调用。
在编译器编译的时候,会把系统调用的内核函数名称修改成INT 80,并把内核的函数名称存放在寄存器中,当CPU读取到INT 80指令的时候,然后保护现场,再去中断向量表中找到对应的回调函数,切换到内核态之后,再恢复现场,得到寄存器中存储的函数名,再调用具体的函数。