准备知识
虚拟地址空间
对32位cpu来说,它逻辑上可访问的地址空间是2的32次方Byte,也就是4GB
对64位cpu来说,它逻辑上可访问的地址空间是2的64次方Byte,4G*4GB=16GG=16M*TB
但是,因为其他硬件的限制,cpu并没有那么多的物理地址空间可以访问。以64位cpu为例,家用内存条就8g16g的,或者连接cpu的地址总线长度只有32位只能访问4个g
cpu理论上能访问的地址空间是虚拟地址空间,实际能访问的ram地址空间是物理地址空间。虚拟地址通过MMU翻译成物理地址空间
每个进程都有自己【独立】的虚拟地址空间,示意图如图:

共享内存
当不同进程所在的虚拟地址空间都映射到同一块物理地址空间上,就实现了共享内存,就这么简单。这是linux下进程间通信的最快方式,因为这块共享内存属于用户空间而无需受到内核空间的管理。如图,进程1/2的虚拟空间存在共同指向,指向了同一块Ram内存区

其他方式下如管道/消息队列都在内核空间,应用程序A需要将自己的数据从用户空间的内存区域copy到内核空间的内存区域,然后应用程序B再从内核空间的内存区域将这份数据copy到自己用户空间的内存区域中,非常麻烦
好了,现在引出了用户空间和内核空间的问题
用户空间和内核空间
为了让系统的数据和用户的数据互不干扰,保证系统的稳定性,用户进程不能直接操作内核。于是操作系统将虚拟地址空间划分为两部分,内核空间+用户空间。这样即使你用户的程序崩溃了,我内核还是稳稳的,操作系统还是正常工作的
内核空间 + 用户空间 = 虚拟地址空间
32位的linux操作系统的虚拟地址空间为4G,最高1G(从虚拟地址0xC0000000到0xFFFFFFFF)划供内核使用,内核空间可以执行任意命令,调用系统一切资源;较低的3G(从虚拟地址0x00000000到0xBFFFFFFF),划供各个进程使用,为用户空间
进程的内核态与用户态:
(1)当一个程序执行了系统调用或者触发某个异常(软中断),此时就会陷入内核空间(内核态)。此时处理器处于最高特权级0级。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈
(2)当进程在执行用户自己的代码时,处于用户运行态(用户态)。处理器在特权级最低的(3级)用户代码中运行
其他待后续补充
网友评论