linux内核空间和用户空间通信

linux内核空间和用户空间通信

ID:15403734

大小:45.00 KB

页数:3页

时间:2018-08-03

linux内核空间和用户空间通信_第1页
linux内核空间和用户空间通信_第2页
linux内核空间和用户空间通信_第3页
资源描述:

《linux内核空间和用户空间通信》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、linux内核空间和用户空间通信作者:harveywang邮箱:harvey.perfect@gmail.com新浪博客地址:http://blog.sina.com.cn/harveyperfect,有关于减肥和学习英语相关的博文,欢迎交流因网上已有很多介绍各种通信方式的示例代码,所以在本文中只是给出各种内核空间和用户空间通信方式的介绍说明。希望给像我一样的初学者提供一定的指导。因水平有限,欢迎各位批评指点。1概述Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0

2、xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间“)。除了进程之间的通信外,在嵌入式设计中还经常需要进行内核空间和用户空间的信息交互。本文主要讨论内核空间和用户空间信息交互的方法。1.1处理器状态处理器总处于以下状态中的一种:A、内核态,运行于进程上下文,内核代表进程运行于内核空间;B、内核态,运行于中断上下文,包括硬中断和软中断;C、用户态,运行于用户空间。1.2不同状态的限制根据上面的状态分类,内核

3、空间和用户空间之间的信息交互就分为两类,即中断上下文内核态空间与进程空间信息交互;进程上下文内核态空间和进程空间信息交互。内核态环境进入内核态的方式局限性说明进程上下文在进程中通过系统调用进入内核态,内核态代码与该进程相关。内核空间和进程空间的虚拟地址不同,不能直接传递信息。该进程的页表基地址依然在页表基地址寄存器(如X86中的CR3)中,内核空间中可以使用__user强制使用用户空间的地址,从而进行数据交互。中断上下文硬件触发中断,或内核中挂接软中断。不与特定的进程相关。内核空间和进程空间的虚拟地址不同,不能

4、直接传递信息。中断中不能睡眠,不能运行引起阻塞的函数。由于中断触发的随机性,中断上下文内核态不与特定的进程相关。2各种通信方式本节说明各种通信方式是否适合内核空间和用户空间信息交互,以及如何使用。2.1信号在进程中使用函数signal()或sigaction()安装信号时指定了关联的函数。在内核空间相进程发送信号,从内核空间返回进程空间时检查并执行相应的关联函数。在进程中可以使用pause()函数进入睡眠,在有信号产生并执行了相应的关联函数后进程被唤醒,继续执行。可以使用这种方式实现内核空间和用户空间的同步。p

5、ause()会使当前进程挂起,直到捕捉到一个信号,对指定为忽略的信号,pause()不会返回。只有执行了一个信号处理函数,并从其返回,puase()才返回-1,并将errno设为EINTR。2.2信号量虽然原理一样,但内核空间和用户空间的信号量是完全两套系统,所以信号量不能用于内核空间和用户空间信息交互。2.3无名管道无名管道只适用于有关系的进程之间通信。不能用于内核空间和用户空间信息交互。2.4get_user()/put_user()get_user(x,ptr):本函数是在内核中被调用,获取用户空间指定地

6、址的数值(一个字节或字)并保存到内核变量x中,ptr为用户空间的地址。用法举例如下:get_user(val,(int__user*)arg)put_user(x,ptr):在内核中被调用,将内核空间的变量x的数值(一个字节或字)保存到用户空间指定地址处,prt为用户空间地址。用法举例如下:put_user(val,(int__user*)arg)注明:函数用于进程上下文内核态空间,即通常在系统调用函数中使用该函数,如设备驱动中ioctl函数中。2.5copy_from_user()/copy_to_user(

7、)主要应用于设备驱动中读写函数中,通过系统调用触发,在当前进程上下文内核态运行(即当前进程通过系统调用触发)。unsignedlongcopy_to_user(void__user*to,constvoid*from,unsignedlongn)通常用在设备读函数或ioctl中获取参数的函数中:其中“to”是用户空间的buffer地址,在本函数中将内核buffer“from”除的n个字节拷贝到用户空间的“to”buffer。unsignedlongcopy_from_user(void*to,constvoid

8、__user*from,unsignedlongn)通常用在设备写函数或ioctl中设置参数的函数中:“to”是内核空间的buffer指针,要写入的buffer;“from”是用户空间的指针,数据源buffer。注意:中断代码时不能用这两个函数,因为其调用了might_sleep()函数,会导致睡眠,并且这两个函数要求在进程上下文内核态空间中运行。这两个函数不能直接在中断中使用,但是可

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。