关键字:寄存器、ring0、ring3、内核态、用户态

欢迎关注我的公众号:Hoeller

寄存器是CPU内部重要的组成部分,寄存器内部由N个触发器组成,每个触发器能够保存1位二进制数,所以16位寄存器能够保存16个bit。

CPU内部一般有不同类型的多个寄存器,咱们需求运用CPU对应的机器指令来操作这些寄存器,当然像内存、磁盘这些也是经过机器指令来操作的。

而CPU为了安全性,比方x86的CPU将机器指令分为了一般指令和特权指令,比方操作磁盘的指令便是特权指令,只有CPU处于某种特别状况下才能履行特权指令。

x86 CPU运用内部一个特别寄存器,用来符号此时的CPU能不能履行特权指令,这个特别寄存器中能够存四种状况,ring0、ring1、ring2、ring3。

WindowsLinux操作系统中只用了ring0和ring3两种状况,假如处于ring0,表明CPU能够履行一切指令,包括特权指令,假如处于ring3,表明CPU不能履行特权指令,ring0等级高,ring3等级低。

不管是操作系统还是运转在操作系统之上的软件,都是用高档言语开发出来的,终究都需求翻译为机器指令。

所以本质上来说,咱们自己用c或java开发的软件,只要翻译成了机器指令,也是能够直接操作寄存器的,操作磁盘的。

可是咱们不会这么来做,也肯定不需求每个软件自己去完成这么底层并通用的功用,所以咱们通常会调用操作系统的函数来操作磁盘。

操作系统就相当于一个中间层。

一起操作系统为了维护系统,就规划了内核态和用户态。

当咱们电脑发动时,CPU处于ring0状况,这时一切指令都能够履行,然后发动引导程序,然后发动操作系统,操作系统在发动时,会对内存就行划分,划出一部分内存只能被操作系统自己运用,其他内存能够给应用软件运用。

操作系统发动完了之后,CPU状况就改为ring3,开端运转应用软件。

因为此时cpu处于ring3,所以应用软件想要运转一些特别指令肯定是不可的。

当咱们调用操作系统的提供的函数时,操作系统会来履行特权指令,可是操作系统不也是c言语写的代码吗,要履行特权指令需求ring0,如何把ring3切换成ring0呢?

系统中止,其实便是一条指令,比方int 0x80。

系统中止,cpu会自动切回到ring0状况,然后履行操作系统在系统发动时所设置好的代码,而这段代码能够根据中止之前所履行的代码来持续履行后续逻辑,而且此时cpu现已处于在ring0状况了,能够正常履行了。

而CPU处于ring0状况便是咱们说的内核态,处于ring3状况便是咱们说的用户态。

总结,当咱们自己写的程序要操作磁盘时,因为要履行特权指令,可是CPU处于ring3,无法直接履行特别指令,需求调用操作系统函数,然后会修改CPU处于ring0,然后进去内核态。

用户态时,CPU只能履行一些普通指令,内核态时,CPU能履行一切指令。

今天就聊到这,抛砖引玉,假如有不对的地方,欢迎大佬们指出。