linux用户空间、内核空间

一、进程理解

进程:资源分配的最小单元,程序在操作系统中运行的实例

线程:最小调度单元

一个进程至少有一个线程或多个线程,一个线程只能属于一个进程,因为进程是最小的资源分配单元,所以线程不存在独立的地址空间,而是多个线程共享进程的独立运行空间,但是线程有自己的栈空间

二、进程空间理解

32位linux的虚拟空间有4G,分为内核空间和用户空间,其中最开始的(3G)0x00000000-0xBFFFFFFF为各个进程使用,也叫用户空间,最高处的(1G)0xC0000000-0xFFFFFFFF作为内核空间供内核使用,Linux内核空间由系统内的所有进程共享。

用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。只有用户进程进行系统调用(代表用户进程在内核态执行)等时刻可以访问到内核空间。

用户空间对应进程,所以每当进程切换,用户空间就会跟着变化

内核空间是由内核负责映射,它并不会跟着进程变化,是固定的

内核空间地址有自己对应的页表,用户进程各自有不同的页表

从用户态进入到内核态有三种方式:系统调用、软中断和硬件中断

三、用户态内核态的由来

在 CPU 的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。如果允许所有的程序都可以使用这些指令,那么系统崩溃的概率将大大增加。
所以,CPU 将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通应用程序只能使用那些不会造成灾难的指令。比如 Intel 的 CPU 将特权等级分为 4 个级别:Ring0~Ring3。

其实 Linux 系统只使用了 Ring0 和 Ring3 两个运行级别(Windows 系统也是一样的)。当进程运行在 Ring3 级别时被称为运行在用户态,而运行在 Ring0 级别时被称为运行在内核态。

当进程运行在内核空间时就处于内核态,而进程运行在用户空间时则处于用户态。
在内核态下,进程运行在内核地址空间中,此时 CPU 可以执行任何指令。运行的代码也不受任何的限制,可以自由地访问任何有效地址,也可以直接进行端口的访问。
在用户态下,进程运行在用户地址空间中,被执行的代码要受到 CPU 的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中 I/O 许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问。

通过区分内核空间和用户空间的设计,隔离了操作系统代码与应用程序代码,即便是单个应用程序出现错误也不会影响到操作系统的稳定性,这样其它的程序还可以正常的运行。区分内核空间和用户空间本质上是要提高操作系统的稳定性及可用性。

你可能感兴趣的:(linux学习,linux,运维,服务器)