全部博文(1493)
分类: LINUX
2013-01-31 17:20:48
原文地址: linux内存保护机制及进程间通信原理 作者:zimang
Linux的虚拟存储器使得每个进程有着统一的、一致的4G地址空间。能支持该功能的主要本质是因为当页面不在物理内存时,由于缺页异常,将导致异常处理程序从交换空间中把数据换入物理内存,然后重新执行导致该异常的指令,而此时就可以正常的访问,进程本身完全不用去关心该过程。
进程地址空间的低3G是用户空间即用户态,所需的CPU权限为3;而高1G即为内核态,所需的CPU权限为1。Linux通过这两个权限值来达到隔离用户态与内核态目的。而两者的通信方式只能通过得到系统确认的系统调用方式来进行通信,即当要访问内核态的数据的时候,必须通过系统调用来访问,而系统调用的最主要的一个过程就是修改一个寄存器的状态标志——CPU特权值,此时就可以访问内核态下的数据了。
Linux的内存保护除了有两个不同的态外,还有就是每个进程是相互隔离的,即不同进程之间是看不到对方的空间的,每个进程有着自己的地址空间,并且任何时候只有一个进程地址空间有效,这也是为什么任何时候只有一个进程在运行(单CPU)。当进程进行切换的时候会相应的修改页表基地址寄存器,通过修改该寄存器来达到地址空间的切换。这也是为什么进程访问不到其它进程地址空间的原因——当它在运行的时候使用的页表基地址寄存器一定是它的,那么映射出来的地址也绝对是属于它自己的,这样就可以防止它破坏别的进程。而进程间的通信,其本质大多数是利用在内核态里开辟一些空间,通过这些空间来进行数据传输(多次拷贝,将内核态缓冲区的数据拷贝到用户态缓冲区copy_to_user)。而通常常见的如mmap及共享内存则是通过另外两种不同的方式进行的;其中共享内存是通过在一个进程的地址空间中创建一个新的段(共享内存区域),然后把该区域挂载到另一个进程(要与之通信的进程),此时两者的虚拟地址不一定一样,但是它们的物理地址却是一样的,所以它们在内存中只保存一份,他们的访问直接通过挂载后的虚拟地址进行访问,不再需要内核空间的copy,这也是为什么共享内存是进程间通信最快的原因。而mmap则是利用文件来做为中转站,达到数据通信的目的,其本质与共享内存有点相似。