linux内核态与用户态通讯方式-guolele

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

内核态与用户态通讯方式

主要有几种:

1、procfs

2、系统调用(syscall)

3、netlink

4、mmap

5、驱动文件,统一API

proc 文件系统

特点:虚拟文件系统,提供一种便捷的用户和内核间的交互方式,一般用于调试日志以及配置参数

缺点:不够实时,无法传输大数据量

使用:创建proc文件驱动,然后像操作文件一样操作,驱动负责解析应用层的read write 请求

mmap

特点:直接用户空间与内核空间映射,直接操作,无需拷贝,可传输数据量大,实时性好。缺点:没有专门同步机制,需要配合别的操作使用,简单数据量不使用此方法,过于复杂使用:字符或者块设备驱动将内核空间地址提供mmap映射,此内核空间可在uboot中预留大空间,也可使用kmalloc(转小,连续物理内存) vmalloc(较大,连续虚拟内存,物理不连续)创建

在Linux内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数, "if (unlikely(order >= MAX_ORDER)) return NULL;"), page的大小一般是4K bytes, MAX_ORDER缺省定义为11, 所以如果不修改内核, kmalloc能够分配的最大连续内存一般是4M bytes.vmalloc 一般用于将非连续物理内存映射成连续虚拟内存空间以便普通使用,也有预留于超大内存>8GB,使用内核参数vmalloc=xxxM来将超大的空间用起来,64bit不存在这个问题了。

内核启动参数传递"mem="参数, 如"mem=80M", 预留部分内存; 然后通过request_mem_region和ioremap_nocache将预留的内存映射到模块中. 需要修改内核启动参数, 无需重新编译内核. 但这种方法不支持x86架构, 只支持ARM, PowerPC等非x86架构. request_mem_region只为了显示在/proc/iomem,只为了显示,不用也能正常用。ioremap 实现已知物理地址到虚拟地址的映射适用于物理地址已知的场合

举个例子:

首先mem=xx预留了20M,驱动就应该

先在初始化时,ioremap,将物理地址映射到内核的虚拟地址,

然后在mmap中,提供页(virt_to_page)将内核虚拟地址映射到页表,然后赋值VMA

然后用户层就可以直接操作内存,其中通知通过netlink或者read ioctl等来操作。

系统调用(syscall)

修改内核以及应用,新增加系统调用来完成一些

特点:非标准化,难破解

缺点:过于复杂,还得修改内核

使用:不推荐

驱动文件,统一API

特点:通过字符,块设备驱动,通过read write ioctl,再通过Copy_from_user()/copy_to_user()等来直接从用户空间拷贝到内核空间。此方法简单,不用额外写驱动

缺点:需要拷贝,效率不高,无法传输大数据。ioctl作为同步使用需要不断轮循,不够实时,read,write 可以阻塞,但语义不够明确

使用:简单场景需求小数据量使用

netlink

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

缺点:无法传输大数据量,例如视频数据。

使用:用于进程间通讯,配合mmap来做同步信息传递等,传输中等数据量数据

相关文档
最新文档