linux下怎么实现内核态和用户空间进程共享内存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下怎么实现内核态和用户空间进程共享内存相关的知识,希望对你有一定的参考价值。

参考技术A 简单理解为:内核空间是内核使用,用户空间是应用程序使用;除非编译内核要考虑内核空间,其余情况都可以按照用户空间处理

#2021年底大盘点#内核态和用户态

一、什么是用户态和内核态

Kernel 运行在超级权限模式(Supervisor Mode)下,所以拥有很高的权限。按照权限管理的原则,多数应用程序应该运行在最小权限下。因此,很多操作系统,将内存分成了两个区域:

  • 内核空间(Kernal Space),这个空间只有内核程序可以访问;
  • 用户空间(User Space),这部分内存专门给应用程序使用;

用户态和内核态:

用户空间中的代码被限制了只能使用一个局部的内存空间,我们说这些程序在用户态(User Mode) 执行。

内核空间中的代码可以访问所有内存,我们称这些程序在内核态(Kernal Mode) 执行。


二、三种从“用户态”转换到“内核态”的触发方式 

a.系统调用(用户进程主动发起的):这是用户态进程“主动”要求切换到内核态的一种方式,用户态进程经过“系统调用”身子那个使用操做系统提供的服务城区完成工做!! 

b.异常:当CPU执行运行在用户态下的程序时,发生了某些不可知的异常,这是会触发当前运行进程切换处处理此异常的内核程序中,也就转到了内核态,好比缺页异常!! 

c.外围设备的中断:当外围设备完成用户请求的操做后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,若是先前执行的指令时用户态下的程序,那么这个转换过程天然也就发生了由用户态到内核态的切换。好比硬盘读写操做完成,系统会切换到硬盘读写的中断处理程序中执行后续操做等。

ip

三、系统调用过程

如果用户态程序需要执行系统调用,就需要切换到内核态执行。下面我们来讲讲这个过程的原理。

内核程序执行在内核态(Kernal Mode),用户程序执行在用户态(User Mode)。当发生系统调用时,用户态的程序发起系统调用。因为系统调用中牵扯特权指令,用户态程序权限不足,因此会中断执行,也就是 Trap(Trap 是一种中断)。发生中断后,当前 CPU 执行的程序会中断,跳转到中断处理程序。内核程序开始执行,也就是开始处理系统调用。内核处理完成后,主动触发 Trap,这样会再次发生中断,切换回用户态工作。


四、涉及到“用户态切换到内核态”的步骤: 

1.从当前进程的描述符中提取内核栈的ss0及esp0信息。 

2.使用ss0和esp0指向的内核栈将当前进程的cs、eip、eflags、ss、esp信息保存起来,这个过程也完成了有用户态到内存栈的切换过程,同时保存了被暂停执行的程序的下一条指令。 

3.将先前有中断向量检索获得的中断程序的cs、eip信息装入相应的寄存器,开始执行中断处理程序,这是就转到了内核态的程序执行了。

以上是关于linux下怎么实现内核态和用户空间进程共享内存的主要内容,如果未能解决你的问题,请参考以下文章

Linux - 用户态内存映射 和 内核态内存映射

linux进程为啥有用户栈和内核栈,

linux 学习笔记 20160621

Linux操作系统 进程之间的通信

Linux内核——用户堆栈和内核堆栈

Linux操作系统之进程空间管理的用户态和内核态是如何划分的?