热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linuxkernelanduserspace通信机制,Linux内核与用户空间通信机制研究

摘要:Linux内核采用单内核架构,具有简单、高效、安全的优点。Linux各子系统包含在内核中,而系统配置及管理工具运行于用户空间。开发人

摘要:Linux内核采用单内核架构,具有简单、高效、安全的优点。Linux各子系统包含在内核中,而系统配置及管理工具运行于用户空间。开发人员需要采用一种合适的在内核与用户空间之间通信的方法。该文总结了几种常用的通信方法:设备节点适合于驱动程序开发,但创建过程比较复杂;/proc文件易于创建,但是不支持大量数据的传输;netlink具有高可扩展性,越来越多的系统工具采用这种方式,而其传输速度较慢;内存映射是传输速度最快的方式,使用不当时会对系统造成破坏。

关键词:Linux;驱动程序;proc文件;netlink;内存映射

中图分类号:TP316.8文献标识码:A文章编号:1009-3044(2012)16-3816-02

The Research of Communication Mechanism between Linux Kernel and User-space

LIU Bin, ZHU Cheng-rong

(Computer Science and Technology Department of Tongji University, Shanghai 201804, China)

Abstract: The architecture of Linux is designed as monolithic kernel, this makes Linux simple, efficient, secure. Since all Linux subsystems are contained in its kernel, while most system configuration and management tools are running in user-space, developers have to find a proper way to communicate between kernel and user-space. The author introduces several usual mechanisms: device node is used for driv er development, to create a device driver interface is complicated than other methods; /proc file is easy to create and use, but it can not transfer large message; netlink sockets is a highly extensible message mechanism, more and more system tools use this mechanism, even though its transfer speed is low; memory-mapped I/O is fastest, but its misuse will cause system failure.

Key words: Linux; device driver; proc file; netlink; memory-mapped I/O

Linux是一个开源操作系统,具有良好的平台间可移植性,在嵌入式及服务器操作系统领域所占的份额越来越大。Linux内核,跟许多其他类Unix系统一样,采用单内核架构,即内核运行在一个独立的地址空间中[1]。单内核架构有以下优点:

1)简单。单内核使得内核设计较为简单,内核映像文件更容易存储。

2)高效。所有内核服务运行于同一个内核空间,其间的通信不需涉及状态转换过程,使内核保持较高的工作效率。

3)安全。运行于内核空间的指令具有特权,内核空间独立于用户空间,这使得用户不能随意占用系统资源、对系统修改甚至危害系统的安全,这样内核就具有较高的安全性。

Linux内核子系统运行于内核空间,而对其的配置管理却是通过用户空间的管理工具来完成的。Linux内核需要提供一定的接口,允许用户空间进程获取内核的资源、信息和服务,甚至配置、监控内核的运行。为了完成与用户空间的交互,需要内核提供一组接口。

系统调用是Linux中除异常和陷入外,用户空间访问内核的唯一合法入口。添加新的系统调用的过程比较简单,但是涉及申请系统调用号和重新编译内核等问题,直接在程序中使用新系统调用会对程序的可移植性造成很大的影响。替代方法包括使用设备节点、使用/proc文件系统等方式。这些方式都是通过系统已有的系统调用实现的。

该文介绍了几种用户空间与内核通信机制的使用方法,并对其性能及安全性进行比较。

1设备驱动接口

设备节点位于/dev目录下。字符设备驱动和块设备驱动接口允许用户从特定的设备节点中读取以及向其中写入数据。这些接口允许在内核与用户空间之间传递数据,就像访问文件一样,并且具有较好的可扩展性。但是此类接口通常为内核设备驱动程序保留[2]。因此,Linux内核开发者认为新的内核子系统使用设备节点并不是好的选择。设备节点的复用也是经常遇到的问题。该文以字符设备驱动为例说明数据传递过程。

字符设备驱动函数地址保存在file_operations结构体中。该结构体包含众多成员,此处重点关注字符设备读写处理函数。读处理函数使用copy_from_user从用户空间复制数据,写处理函数使用copy_to_user向用户空间写入数据。在模块初始化过程中,首先生成设备号,将设备号注册到系统中;初始化字符设备,将驱动程序函数与字符设备关联;在/dev目录下建立设备节点。在模块退出函数中,首先删除/dev目录下的设备节点,然后删除字符设备,从系统中注销其设备号。

内核函数copy_from_uer用于从用户空间向内核空间复制数据,执行成功返回0,失败时返回未被复制的字节数。该函数可能睡眠,无法使用在中断上下文中。在开始复制数据前,该函数验证用户空间地址的有效性,检查所复制的内存区域是否超出了用户空间进程大小。通过验证之后才进行数据复制。如果复制过程中遇到非法指针,系统调用页异常处理程序进行后续处理。内核函数copy_to_user用于内核空间向用户空间复制数据,其实现过程与copy_from_user相似,不再复述。



推荐阅读
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
author-avatar
ririye2011
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有