了解什么是用户态,什么是内核态。首先需要去了解虚拟地址映射,mmu和mmap。
虚拟内存映射MMU
为什么需要虚拟内存映射呢。因为我们电脑的实际内存空间是有限的,有的是2GB,有的是4GBB,有的是8GB,有的是16GB。但是我们会发现,电脑中一次性可以运行很多软件,事实上这些运行的软件所需要的内存加起来肯定远远超过了我们计算机的实际内存。如果把软件运行所需要的内存映射在实际内存中,势必会导致内存不够。那么os就对此现象做了优化。在每一个软件程序运行的时候,就“告诉”软件,你可以分配足够大的内存空间,甚至把内存地址都给你,软件自己分配。
我们知道CPU的执行情况,在每一个核心都是以时间片轮转去执行的,也就是一下执行这个线程一下执行那个线程,在快速的切换。所以在一个程序拿到CPU权限的时候,os会把传进去的虚拟地址转化为实际在内存上的地址,让CPU执行指令。当指令执行完毕,这一块实际的物理内存就会空出来,以便下次分配。这样就解决了每个软件自己分配虚拟内存的问题。
内核所需内存
每个os系统运行的时候都是需要一部分内存的,这其中有一部分内存是所有程序共享的,例如一些os级别的共享函数。在每个程序自己分配虚拟内存的时候,内核函数所需内存的虚拟地址是一样的。
内核态用户态切换
当程序调用了os内核的函数,CPU需要通过寄存器器来保存现在执行的状态(类似java的程序计数器,保存当前执行到哪一样代码)。然后CPU的执行权限会进行升级,升级到最高权限,去执行os函数,进入内核态,执行完os内核函数的时候,CPU切换回程序,通过寄存器保存的状态继续执行程序,切换回用户态。这也被称为CPU上下文切换。
