【004 Linux内核】用户空间与内核通信方式有哪些?

对于进程来说,它既有内核空间(与其他进程共享),也有用户空间(进程私有私有)。不管是内核空间还是用户空间,它们都处于虚拟地址空间。

内核空间和用户空间交换数据的方式有很多。用户空间发起的有系统调用、proc、虚拟文件系统等。内核空间主动发起的有get_user/put_user、信号、netlink等。

一、Linux应用程序与内核程序交互主要有以下几种通信方式:

1、系统API

这是最基本的方式,用户空间通过编写系统调用接口来调用内核提供的服务。

● open(),read(),write(), ioctl(), mmap()

● get_user(x,ptr):在内核中被调用,获取用户空间指定地址的数值并保存到内核变量x中

● put_user(x,ptr):在内核中被调用,将内核空间变量x的数值保存到到用户空间指定地址处

● copy_from_user() / copy_to_user():主要应用于设备驱动读写函数中,通过系统调用触发

2、虚拟文件系统 

● proc文件系统 proc文件系统实现用户空间与内核空间的数据通信_proc通信

● sysfs文件系统 linux sysfs文件系统

● debugfs文件系统 debugfs使用指南

很多内核程序细节,如中断等,都在proc/目录下有所体现,虚拟文件系统提供了一种便捷的用户空间和内核空间的交互方式;

3、netlink

netlink socket提供了一组类似于BSD风格的API,用于用户态和内核态的IPC。相比于其他的用户态和内核态IPC机制,netlink有几个好处:1.使用自定义一种协议完成数据交换,不需要添加一个文件等。2.可以支持多点传送。3.支持内核先发起会话。4.异步通信,支持缓存机制。

4、内存映像

mmap共享内存。Linux通过mmap的把内核中特定部分的内存空间映射到用户级程序的内存空间去,从而提供了用户程序对内存直接访问的能力。该方式尤其适合在那些内核和用户空间需要快速大量交互数据的情况下。

5、内核程序使用信号通知应用程序

信号在内核里的用途主要集中在通知用户程序出现重大错误,强行杀死当前进程,这是内核通过发送SIGKILL信号通知进程终止。

信号发送必须要事先知道进程序号(pid),所以要想从内核中通过发信号的方式异步通知用户进程执行某项任务,那么必须事先知道用户进程的进程号才可以(可以让应用程序通过oictl函数,把自己的PID主动告诉驱动程序)。而一般内核运行时搜索特定进程的进程号是个费事的工作,可能要遍历整个进程控制块链表。所以用信号通知特定用户进程的方法很糟糕,一般在内核不会使用。内核中使用信号的情形只出现在通知当前进程(可以从current变量中方便获得pid)做某些通用操作,如终止操作等。因此对内核开发者该方法用处不大。类似情况还有消息操作。

6、文件

应该说这是一种比较笨拙的做法,不过确实可以这样用。当处于内核空间的时候,直接操作文件,
将想要传递的信息写入文件,然后用户空间可以读取这个文件便可以得到想要的数据了。
下面是一
个简单的测试程序,在内核态中,程序会向“/home/melody/str_from_kernel”文件中写入一条字
符串,然后我们在用户态读取这个文件,就可以得到内核态传输过来的数据了。


二、参考内容

Linux用户空间与内核空间交互的几种方式_用户空间和内核空间数据如何传递_艾特号的博客-CSDN博客

https://www.cnblogs.com/still-smile/p/11585509.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kashine

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值