【Linux系统】CPU指令集 和 Linux系统权限 ring 0 / ring 3
CPU
指令集
-
CPU
指令集:是CPU
实现软件指挥硬件执行的媒介,具体来说每一条汇编语句都对应了一条CPU指令,而非常非常多的CPU
指令在一起,可以组成一个、甚至多个集合,指令的集合叫CPU指令集。 -
CPU
指令集有权限分级,大家试想,CPU
指令集可以直接操作硬件的,要是因为指令操作的不规范,造成的错误会影响整个计算机系统的。好比你写程序,因为对硬件操作不熟悉,导致操作系统内核、及其他所有正在运行的程序,都可能会因为操作失误而受到不可挽回的错误,最后只能重启计算机才行。
对开发人员来说是个艰巨的任务,还会增加负担,同时开发人员在这方面也不被信任,所以操作系统内核直接屏蔽开发人员对硬件操作的可能,都不让你碰到这些 CPU
指令集。
CPU
指令集权限
针对上面的需求,硬件设备商直接提供硬件级别的支持,做法就是对 CPU
指令集设置了权限,不同级别权限能使用的 CPU
指令集是有限的,以 Inter
的 CPU
为例, Inter
把CPU 指令集操作的权限由高到低划为4级:
ring
0:权限最高,可以使用所有CPU指令集ring
1ring
2ring
3:权限最低,仅能使用常规CPU指令集,不能使用操作硬件资源的CPU指令集,比如I/O读写、网卡访问、申请内存都不行
Linux
系统权限
要知道的是, Linux
系统仅采用 ring
0 和 ring
3 这2个权限。 CPU
中有一个标志字段,标志着线程的运行状态,用户态为3,内核态为0。
ring
0 被叫做内核态,完全在操作系统内核中运行- 执行内核空间的代码,具有
ring
0 保护级别,有对硬件的所有操作权限,可以执行所有CPU指令集,访问任意地址的内存,在内核模式下的任何异常都是灾难性的,将会导致整台机器停机
- 执行内核空间的代码,具有
ring
3 被叫做用户态,在应用程序中运行- 在用户模式下,具有
ring
3 保护级别,代码没有对硬件的直接控制权限,也不能直接访问地址的内存,程序是通过调用系统接口(System
Call
APIs
)来达到访问硬件和内存,在这种保护模式下,即时程序发生崩溃也是可以恢复的,在电脑上大部分程序都是在,用户模式下运行的
- 在用户模式下,具有
低权限的资源范围较小,高权限的资源范围更大,所以用户态与内核态的概念就是CPU指令集权限的区别。
我们通过指令集权限区分用户态和内核态,还限制了内存资源的使用,操作系统为用户态与内核态划分了两块内存空间,给它们对应的指令集使用。
在内存资源上的使用,操作系统对用户态与内核态也做了限制,每个进程创建都会分配虚拟空间地址,以 Linux32
位操作系统为例,它的寻址空间范围是 4G( 2 的 32 次方),而操作系统会把虚拟控制地址划分为两部分,一部分为内核空间,另一部分为用户空间,高位的 1G(从虚拟地址 0xC0000000
到 0xFFFFFFFF
)由内核使用,而低位的 3G(从虚拟地址 0x00000000
到 0xBFFFFFFF
)由各个进程使用。