Linux中用户空间与内核空间的数据交换方式
Linux中用户空间与内核空间的数据交换方式
水海云 发表于3个月前
Linux中用户空间与内核空间的数据交换方式
  • 发表于 3个月前
  • 阅读 16
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: Linux系统中userspace和kernelspace之间的数据交换方式主要有:内核启动参数、模块参数与sysfs、sysctl、系统调用、netlink、procfs这几种,本文简要介绍一下它们。
  1. 内核启动参数

    Linux 提供了一种通过 bootloader/BIOS向其传输启动参数的功能,内核开发者可以通过配置bootargs之类的选项来向内核传输数据,从而控制内核启动行为。

  2. 模块参数与sysfs系统

    内核子系统或设备驱动可以直接编译到内核,也可以编译成模块,如果编译到内核,可以使用前一节介绍的方法通过内核启动参数来向它们传递参数,如果编译成模块,则可以通过命令insmod 在插入模块时传递参数,或者在运行时通sysfs来设置或读取模块数据。

    Sysfs是一个基于内存的文件系统,实际上它基于ramfs,sysfs提供了一种把内核数据结构,它们的属性以及属性与数据结构的联系开放给用户态的方式,它与kobject子系统紧密地结合在一起,因此内核开发者不需要直接使用它,而是内核的各个子系统使用它。

  3. sysctl命令工具

    Sysctl是一种用户应用来设置和获得运行时内核的配置参数的一种有效方式,通过这种方式,用户应用可以在内核运行的任何时刻来改变内核的配置参数,也可以在任何时候获得内核的配置参数,通常内核的这些配置参数也出现在proc文件系统的/proc/sys目录下,用户应用可以直接通过这个目录下的文件来实现内核配置的读写操作。

  4. 系统调用

    系统调用是内核提供给应用程序的接口,应用对底层硬件的操作大部分都是通过调用系统调用来完成的,例如得到和设置系统时间,就需要分别调用gettimeofday 和 settimeofday 来实现。事实上所有的系统调用都涉及到内核与应用之间的数据交换,如文件系统操作函数read 和 write,设置和读取网络协议栈的 setsockopt 和getsockopt。

    一般地,用户可以建立一个伪设备来作为应用与内核之间进行数据交换的渠道,最通常的做法是使用伪字符设备,然后通过ioctl等通用系统调用来操作设备数据。

  5. netlink机制

    Netlink 是一种特殊的 socket,它是 Linux 所特有的,类似于 BSD 中的AF_ROUTE但又远比它的功能强大,目前在Linux 内核中使用netlink 进行应用与内核通信的应用很多,包括:路由daemon(NETLINK_ROUTE),1-wire 子系统(NETLINK_W1),用户态 socket协议(NETLINK_USERSOCK),防火墙(NETLINK_FIREWALL)等。

    Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 netlink。

    netlink是一种异步通信机制,在内核与用户态应用之间传递的消息保存在socket缓存队列中,发送消息只是把消息保存在接收者的socket的接收队列,而不需要等待接收者收到消息,但系统调用与 ioctl 则是同步通信机制,如果传递的数据太长,将影响调度粒度。

  6. proc文件系统

    procfs文件系统与sysfs类似也是一种基于内存的文件系统,是一种最早的内核与用户态数据交互的方式之一。在Linux系统的/proc目录中挂载了procfs,目录下包含了内核系统相关的参数配置信息以及运行状态信息,还有所有的进程运行数据状态等。可以对/proc目录下的一些文件使用简单的echo命令进行参数的配置来调整系统的行为。

共有 人打赏支持
粉丝 49
博文 109
码字总数 92537
×
水海云
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: