参考:https://leetcode-cn.com/circle/discuss/zIxrWn/
内核空间和用户空间;为啥要这么区分
其实所有的系统资源管理都是在内核空间中完成的。比如读写磁盘文件,分配回收内存,从网络接口读写数据等等。
其实就是通过一个特殊的指令让进程从用户态进入到内核态(到了内核空间),在内核空间中,CPU 可以执行任何的指令,当然也包括从磁盘上读取数据。具体过程是先把数据读取到内核空间中,然后再把数据拷贝到用户空间并从内核态切换到用户态。
对于一个进程来讲,从用户空间进入内核空间并最终返回到用户空间,这个过程是十分复杂的。举个例子,比如我们经常接触的概念 “堆栈”,其实进程在内核态和用户态各有一个堆栈。
运行在用户空间时进程使用的是用户空间中的堆栈,而运行在内核空间时,进程使用的是内核空间中的堆栈。所以说,Linux 中每个进程有两个栈,分别用于用户态和内核态。
现代的操作系统大都通过内核空间和用户空间的设计来保护操作系统自身的安全性和稳定性。
虚拟地址和物理地址的关系?为什么要这样分?
虚拟内存实际上是操作系统对于内存管理的一种方式,比如说,对每个程序而言,它的内存编址都从0x00到0xff,但是实际上,这些内存对应的物理地址,应用程序本身是无法知道的,在这里就可以理解成操作系统对内存管理的一层抽象。
而且虚拟内存也是一种有效的进程间隔离的方式,极大的提升了进程的安全性和操作系统的稳定性,也就是我一个进程不管做什么,都是在它自己的地址空间里做的,不会影响到其他进程和OS。
而具体怎么把这些虚拟地址对应到物理地址上,这是操作系统做的事情。操作系统对每一个进程有一个进程控制块,叫PCB,Process Control Block,里边存储了每一个进程的进程信息,比如说寄存器,file descriptor,还有我们最关心