内核态和用户态通信(一)--认识

内核态和⽤户态通信(⼀)--认识
1. Linux中的进程间的通信机制源⾃于Unix平台上的进程通信机制。Unix的两⼤分⽀AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运⾏在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制。同时linux也遵循IEEE 制定的posix IPC标准,在三者的基础上实现以下⼏种主要的IPC机制:管道(Pipe)和命名管道(Name Pipe),信号(Signal),消息队列(Message queue),共享内存(Shared Memory),信号量(Semaphore),套接字(Socket)。通过这些IPC机制,⽤户空间进程之间可以完成互相通信。⽽为了完成内核空间和⽤户空间之间的通信,linux提供了基于socket的Netlink通信机制,可以实现内核与⽤户空间数据的及时交换。
2. linux操作系统中当cpu处于内核状态时,可以分为有⽤户上下⽂的状态和执⾏硬件、软件中断两种。其中当处于有⽤户上下⽂时,由于内核态和⽤户态的内存映射机制不同,不可直接将本地变量传给⽤户态的内存区;处于硬件、软件中断时,⽆法直接向⽤户内存去传递数据,代码执⾏不可中断。
他们都⽆法直接在内核态和⽤户态之间使⽤,原因如下:奥运知识
1. 管道
局限于⽗⼦进程间通信。
2. 消息队列
网络炒汇在软、硬中断中⽆法⽆阻塞地接收数据
3. 信号量
虽然原理⼀样,但内核空间和⽤户空间的信号量是两套完全的系统,所以信号量不能⽤于内核空间和⽤户空间信息交互
4. 内存共享
冗余备份
需要信号量辅助
5. socket套接字
在硬、软中断中⽆法⽆阻塞地接收数据
⽬前linux提供了
3. 解决内核态和⽤户态通信机制sack
处于有⽤户上下⽂时,可以使⽤linux提供的copy_to_user()和copy_from_user()函数完成,但由于这两个函数可能阻塞,因此不能在硬件、软件中断的过程中使⽤。
进⼊内核态的⽅式局限性说明
在进程中通过系统调⽤进⼊内核态,内核态代码与该进程相关内核空间和进程空间的虚拟地址不同,不能直接传递信息该进程的页表基地址依然在页表基地址寄存器(如x86中的CR3)中,内核空间中可以使⽤__user强制使⽤⽤户空间的地址,从⽽进⾏数据交互中
⽂硬件触发中断,或内核中挂接软中断。不与特定的进程相关  a.内核空间和进程空间的虚拟地址不同,不能直接传递信息;b.中断中不能睡眠,不能运⾏引起阻塞的函数由于中断触发的随机性,中断上下⽂内核态不与特定的经常相关处于硬、软件中断时,主要分为两类:
1. 可以通过linux提供的spinlock⾃旋锁实现内核线程和中断过程的同步,由于内核线程运⾏在有上下⽂的进程中,因此可以在内linux 将内存空间分为两部分,将最⾼字节的⼀部分,供内核使⽤,称为“内核空间”,⽽较低字节的⼀部分,则为“⽤户空间”
处理器状态:
a . 内核态,运⾏于进程上下⽂,内核代表进程运⾏于内核空间;
b. 内核态,运⾏于中断上下⽂,包括硬中断和软中断;
c. ⽤户态,运⾏于⽤户空间安。
1. 可以通过linux提供的spinlock⾃旋锁实现内核线程和中断过程的同步,由于内核线程运⾏在有上下⽂的进程中,因此可以在内
核线程中使⽤套接字或消息队列来取得⽤户空间的数据,然后再将数据通过临界区传递给中断过程。联想s96
2. 通过netlink机制实现。netlink套接字的通信依据是⼀个对应于进程的标识,⼀般定为该进程的ID。netlink通信最⼤的特点是对
中断过程的⽀持,它在内核空间接收⽤户空间数据时不再需要⽤户⾃动启动⼀个内核线程,⽽是通过另⼀个软中断调⽤⽤户事先指定的接收函数。通过软中断⽽不是⾃⾏启动内核线程保证了数据传输的及时性。

本文发布于:2024-09-21 03:16:27,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/137331.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:内核   进程   空间   中断   不能   实现   机制
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议