• 售前

  • 售后

热门帖子
入门百科

详解Linux用户态与内核态通讯的几种方式

[复制链接]
一品菊花茶酪 显示全部楼层 发表于 2021-10-26 12:44:57 |阅读模式 打印 上一主题 下一主题
Linux 用户态和内核态由于 CPU 权限的限定,通讯并不像想象中的使用历程间通讯方式那么简朴,今天这篇文章就来看看 Linux 用户态和内核态毕竟有哪些通讯方式。
我们平常在写代码时,一样平常是在用户空间,通过系统调用函数来访问内核空间,这是最常用的一种用户态和内核态通讯的方式。(关于 Linux 用户态和内核态可以参考 xx)
除此之外,还有以下四种方式:
      
  • procfs(/proc)  
  • sysctl(/proc/sys)  
  • sysfs(/sys)  
  • netlink 套接口
procfs(/proc)
  1. procfs
复制代码
是 历程文件系统 的缩写,它本质上是一个伪文件系统,为什么说是 伪 文件系统呢?因为它不占用外部存储空间,只是占用少量的内存,通常是挂载在
  1. /proc
复制代码
目录下。
我们在该目录下看到的一个文件,实际上是一个内核变量。内核就是通过这个目录,以文件的形式展现自己的内部信息,相当于
  1. /proc
复制代码
目录为用户态和内核态之间的交互搭建了一个桥梁,用户态读写
  1. /proc
复制代码
下的文件,就是读写内核相干的设置参数。
好比常见的
  1. /proc/cpuinfo
复制代码
  1. /proc/meminfo
复制代码
  1. /proc/net
复制代码
就分别提供了 CPU、内存、网络的相干参数。除此之外,还有很多的参数,如下所示:
  1. root@ubuntu:~# ls /proc/
  2. 1   1143 1345 1447 2   2292 29  331  393 44  63  70  76  acpi    diskstats  irq     locks     sched_debug  sysvipc      zoneinfo
  3. 10  1145 1357 148  20  23  290 332  396 442  64  7019 77  asound   dma     kallsyms   mdstat    schedstat   thread-self
  4. 1042 1149 1361 149  2084 2425 291 34  398 45  65  7029 8  buddyinfo driver    kcore    meminfo    scsi      timer_list
  5. 1044 1150 1363 15  2087 25  3  3455 413 46  66  7079 83  bus    execdomains keys     misc     self      timer_stats
  6. 1046 1151 1371 16  2090 256  30  35  418 47  6600 7080 884 cgroups  fb      key-users  modules    slabinfo    tty
  7. 1048 1153 1372 17  21  26  302 36  419 5   67  71  9  cmdline  filesystems kmsg     mounts    softirqs    uptime
  8. 11  1190 1390 18  22  27  31  37  420 518  6749 72  96  consoles  fs      kpagecgroup mtrr     stat      version
  9. 1126 12  143  182  2214 28  32  373  421 524  68  73  97  cpuinfo  interrupts  kpagecount  net      swaps     version_signature
  10. 1137 1252 1434 184  2215 280  327 38  422 525  69  74  98  crypto   iomem    kpageflags  pagetypeinfo sys      vmallocinfo
  11. 1141 13  144  190  2262 281  33  39  425 5940 7   75  985 devices  ioports   loadavg   partitions  sysrq-trigger vmstat
复制代码
可以看到,这内里有很多的数字表现的文件,这些实在是当前系统运行的历程文件,数字表现历程号(PID),每个文件包罗该历程全部的设置信息,包括历程状态、文件形貌符、内存映射等等,我们可以看下:
  1. root@ubuntu:~# ls /proc/1/
  2. attr/      cmdline     environ     io        mem       ns/       pagemap     schedstat    stat       timers
  3. autogroup    comm       exe       limits      mountinfo    numa_maps    personality   sessionid    statm      uid_map
  4. auxv       coredump_filter fd/       loginuid     mounts      oom_adj     projid_map    setgroups    status      wchan
  5. cgroup      cpuset      fdinfo/     map_files/    mountstats    oom_score    root/      smaps      syscall     
  6. clear_refs    cwd/       gid_map     maps       net/       oom_score_adj  sched      stack      task/
复制代码
综上,内核通过一个个的文件来袒露自己的系统设置信息,这些文件,有些是只读的,有些是可写的,有些是动态变化的,好比历程文件,当应用步调读取某个
  1. /proc/
复制代码
文件时,内核才会去注册这个文件,然后再调用一组内核函数来处置惩罚,将相应的内核参数拷贝到用户态空间,这样用户读这个文件就可以获取到内核的信息。一个大概的图示如下所示:

sysctl
我们认识的 sysctl 是一个 Linux 下令,
  1. man sysctl
复制代码
可以看到它的功能和用法。它重要是被用来修改内核的运行时参数,换句话说,它可以在内核运行过程中,动态修改内核参数。
它本质上照旧用到了文件的读写利用,来完成用户态和内核态的通讯。它使用的是
  1. /proc
复制代码
的一个子目录
  1. /proc/sys
复制代码
。和 procfs 的区别在于:
procfs 重要是输出只读数据,而 sysctl 输出的大部分信息是可写的。
比方,我们比力常见的是通过
  1. cat /proc/sys/net/ipv4/ip_forward
复制代码
来获取内核网络层是否允许转发 IP 数据包,通过
  1. echo 1 > /proc/sys/net/ipv4/ip_forward
复制代码
或者
  1. sysctl -w net.ipv4.ip_forward=1
复制代码
来设置内核网络层允许转发 IP 数据包。
同样的利用,Linux 也提供了文件
  1. /etc/sysctl.conf
复制代码
来让你举行批量修改。
sysfs
sysfs 是 Linux 2.6 才引入的一种捏造文件系统,它的做法也是通过文件
  1. /sys
复制代码
来完成用户态和内核的通讯。和 procfs 差别的是,sysfs 是将一些本来在 procfs 中的,关于设备和驱动的部分,独立出来,以 “设备树” 的形式出现给用户。
sysfs 不仅可以从内核空间读取设备和驱动步调的信息,也可以对设备和驱动举行设置。
我们看下
  1. /sys
复制代码
下有什么:
  1. # ls /sys
  2. block bus class dev devices firmware fs hypervisor kernel module power
复制代码
可以看到这些文件根本上都跟盘算机的设备和驱动等息息相干的。更多关于这些文件的解释各人可以自行相识,这里就不外多睁开了。
netlink
netlink 是 Linux 用户态与内核态通讯最常用的一种方式。Linux kernel 2.6.14 版本才开始支持。它本质上是一种 socket,通例 socket 使用的标准 API,在它身上同样实用。好比创建一个 netlink socket,可以调用如下的 socket 函数:
  1. #include <asm/types.h>
  2. #include <sys/socket.h>
  3. #include <linux/netlink.h>
  4. netlink_socket = socket(AF_NETLINK, socket_type, netlink_family);
复制代码
netlink 这种灵活的方式,使得它可以用于内核与多种用户历程之间的消息转达系统,好比路由子系统,防火墙(Netfilter),ipsec 安全战略等等。
引申:
  1. net-tools
复制代码
工具通过 procfs(/proc) 和 ioctl 系统调用去访问和改变内核网络参数设置,而
  1. iproute2
复制代码
则通过 netlink 套接字接口与内核通讯,前者已经被镌汰了,后者渐渐成为标准。
总结
Linux 用户态和内核态通讯重要的四种方式,其中 netlink 和 procfs 是最常见的方式。
以上就是本文的全部内容,盼望对各人的学习有所帮助,也盼望各人多多支持草根技能分享。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作