背景

由于Linux 系统分为了用户态和内核态,用户态在设计初衷就是运行与硬件无关的应用程序,与硬件相关的操作大部分都集中在内核态处理。所以用户态如果需要获取硬件信息,或者操作硬件,必须要通过某种方式与内核态进行通信才能得到信息,或者将配置真正下发到硬件上。

本文只描述3种常见的交互方式基本原理和优缺点,并不会详细描述每种方式的具体实现做详细描述,详细的描述开发者可以自行搜索,网上资料不少。

Netlink

Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是应用程序与内核通信的最常用的接口方式之一。

优势:

1、 基于套接字方式,对于熟悉网络编程的开发者来说相对简单,内核态代码也只需要做简单初始化就能完成通信。

2、 用户态可以使用epoll 形式,不过多占用CPU资源

限制:

1、Netlink 目前只支持32个通道,其中内核自己就用了20个通道左右,也就是剩余通道数有限,不能复用。

2、对于网络编程不熟悉的开发者,如果这个通信过程中出问题,或者出现丢包,但是应用中不允许出现丢包问题时,比较难定位

3、仅限于通信,如果需要操作硬件还需要在内核态代码中增加相应处理

UIO

UIO主要包含两个功能:一是映射物理内存空间到用户态,使用户态程序能直接操作硬件寄存器或者部分内核申请的内存;另一个是通过设备状态的变化通知用户态程序有中断产生。

优势:

1、 用户态程序能感知到中断状态

2、 用户态程序可以直接操作内存或者寄存器

3、 可以通过直接操作内存进行交互,少了拷贝的动作,效率较高

劣势:

1、相对于netlink来说内核代码稍微复杂一些,涉及到一些中断处理以及设备创建

2、一个UIO设备只能映射4个地址,如果设备的寄存器多且地址分散,可能需要开多个UIO设备才能满足操作需求。

3、如果通过内存方式交互,竞争处理方式比较复杂,需要开发者用户态和内核态程序操作同一份内存,而不会相互覆盖与竞争。

IOCTL

Ioctl 是内核比较早的一种用户态内核态的交互方式,用户态程序通过命令的方式调用ioctl函数,然后内核态分发到对应驱动处理,最后将处理结果返回到用户态。

优势:

1、IOCTL支持的版本较多,资料非常详细

2、用户态编码简单

劣势:

1、 IOCTL由于支持的版本较老,新内核有可能不再支持

2、 IOCTL内核态是根据传入的cmd命令字来解析,如果涉及到多个命令需要编写多个函数,代码量相对较多

3、 相对于内存交互,IOCTL需要解析命令字,才能跳转对应处理函数,同时也有拷贝动作

效率较低

其他自定义方式

目前笔者想到的一种简单的交互方式跟UIO的MEM交互基本一致,需要开发者设计一套内存交互机制,但UIO相对较复杂,需要内核支持,如果只需要MEM交互,只需要自己创建一个设备,在用户态映射这个设备空间就能达到效果。

优势:

1、不需要内核支持UIO,只需要驱动自己创建设备

2、 通过直接操作内存进行交互,少了拷贝的动作,效率较高

3、自己设计,可以自行定义自己的DFX,方便调试

劣势:

1、用户态不能感知中断

2、开发者需要设计一套内存交互机制,而不会相互覆盖与竞争,比较复杂。

ioctrl原形 linux_Linux常见的几种用户态与内核态交互方式优缺点相关推荐

  1. Linux用户态与内核态通信的几种方式(待完善)

    文章目录 1. 内核启动参数 2.模块参数与sysfs 3.sysctl 4.系统调用 5.netlink 6. procfs(/proc) 7.seq_file 8.debugfs 9.relayf ...

  2. linux内核态用户态交互,Linux用户态和内核态交互的几种方式

    创建于 2013-04-13 迁移自本人的百度空间 -------------------------------- 1/内核态->用户态 在kernel module中调用printk是最简单 ...

  3. linux 用户态与内核态通信方式简介

    我们平常在写代码时,一般是在用户空间,通过系统调用函数来访问内核空间,这是最常用的一种用户态和内核态通信的方式.(关于 Linux 用户态和内核态可以参考 xx) 除此之外,还有以下四种方式: pro ...

  4. 操作系统(概述、组成)、用户态、内核态

    1. 概述 1.1 基本特征 1.1.1 并发 并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令. 并行需要硬件支持,如多流水线或者多处理器. 操作系统通过引入进程和线程 ...

  5. JVM内存划分、Linux用户态、内核态简介

    JVM内存划分 1.在Java运行的时候 JVM虚拟机拿到自己能支配的内存 将内存进行分割2.本地方法栈存储是C++ native方法3.程序计数器指向程序当前运行的位置4.方法区存储元数据信息在jd ...

  6. 操作系统基础知识用户态和内核态的区别

    这节课给你带来了一道非常经典的面试题目:用户态线程和内核态线程有什么区别? 这是一个组合型的问题,由很多小问题组装而成,比如: 用户态和内核态是什么? 用户级线程和内核级线程是一个怎样的对应关系? 内 ...

  7. 用户态和内核态:用户态线程和内核态线程有什么区别?

    转载 文章来源于 拉钩教育 重学操作系统 林䭽 用户态和内核态:用户态线程和内核态线程有什么区别? 什么是用户态和内核态 Kernel 运行在超级权限模式(Supervisor Mode)下,所以拥有 ...

  8. java运行在用户态_理解Linux用户态和内核态

    Linux整体架构图 我们先来看一张Linux整体架构图. 系统调用 ​ 系统调用时操作系统的最小功能单位.根据不同的应用场景,不同的Linux发行版本提供的系统调用数量也不尽相同,大致在240-35 ...

  9. 4-15 OS(线程,用户态,内核态,页) 数据库(原子性,日志) JAVA(I/O)

    在internet services课上老师说到Capriccio 是用户模式下的thread library,OS课里第2个project也是实现一个用户模式下的线程库.之前用过POSIX库,我知道 ...

最新文章

  1. htc820+android+l,首款高通64位八核 HTC Desire 820评测
  2. mysql表收缩时从库也收缩么_收缩数据库 - SQL Server | Microsoft Docs
  3. 现代密码学4.1--消息完整性
  4. python比较列表所有项是否有相同的部分_检查列表中的所有元素是否相同
  5. 【C语言简单说】十一:switch 补
  6. 接口中定义的成员变量是( )。_抽象与接口
  7. 剑指Offer - 面试题12. 矩阵中的路径(DFS回溯)
  8. rabbitMQ消息中间件五种模式
  9. linux php mysql 中文_Linux下PHP+MySQL+CoreSeek中文检索引擎配置 | 系统运维
  10. 威纶通触摸屏的自由口通讯
  11. 电子基础元器件——电阻器
  12. 2015最好用的PHP开源建站系统
  13. 个人所得综合税年度汇算,个税计算公式,个税计算案例
  14. python画图配色_科研作图有哪些「赏心悦目」的绘图主题和配色方案?
  15. Java学习 --- HTML
  16. 瑞吉外卖(27)-查看购物车信息、清空购物车功能开发
  17. android分屏模式_Android分屏显示总结
  18. 教你怎么批量查询快递单号,一学就会
  19. 自动连接 无法连接网络连接服务器,微信提示无法连接到服务器怎么办?微信无法连接服务器怎么解决?...
  20. pfx文件解析私钥和公钥

热门文章

  1. 【LeetCode】【队列】剑指 Offer 59 - I. 滑动窗口的最大值 思路解析和代码
  2. 系统重构的未来:重构工具 Coca 一周年
  3. 赌你无法坚持看完的nginx配置文件解析
  4. ES--深分页Scroll
  5. 移动端浏览器调起百度地图、高德地图
  6. 网线线序(直通线与交叉线)
  7. mongodb根据_id进行查询
  8. 企业短期偿债能力评估-流动比率、速动比率、现金比率、现金流量比率
  9. 防黑运营版在线客服系统源码/多商户机器人/自助注册客服系统源码/im即时通讯聊天系统源码
  10. 妙赞大讲糖:降糖为何要动“刀”