Linux用户态和内核态交互的几种方式

Linux用户态和内核态交互的几种方式 #

img

Linux分为内核态Kernel Mode和用户态User Mode其通信方式主要有

  • 系统调用System Call:最常见的用户态和内核态之间的通信方式。通过系统调用接口(openreadwritefork等)请求内核执行特定的动作。
  • 中断Interrupts:中断包括软中断和硬中断,每当中断到来的时候,CPU会暂停当前执行的用户态代码,切换到内核态来处理中断。
  • 信号Signal:内核通过Signal通知用户态进程发生了某些事件,用户态注册信号处理函数,来响应特定的信号事件。如 SIGTERMSIGINT 等。
  • 共享内存Share Memory:允许多个进程在它们的地址空间中共享一块内存区域,从而实现用户态和内核态之间的高效通信。这种方式避免了用户态和内核态之间频繁切换的问题,但是也需要考虑到数据的同步问题,保证数据一致性。

 

img

用户态User Mode访问内核态Kernel Mode数据交互的方式有

  • procfs进程文件系统:一个伪文件系统,因为其不占用外部存储空间,只占有少量的内存,挂载在/proc目录下

  • sysctl:它也是一个Linux命令,主要用来修改内核的运行时参数,也就是在内核运行时,动态修改内核参数。

    procfs 的区别在于:procfs 主要是输出只读数据,而 sysctl 输出的大部分信息是可写的。

  • sysfs虚拟文件系统:通过/sys来完成用户态和内核的通信,和 procfs 不同的是,sysfs 是将一些原本在 procfs 中的,关于设备和驱动的部分,独立出来,以 “设备树” 的形式呈现给用户。

  • netlink 接口:也是最常用的一种方式,本质是socket接口,使用netlink用于网络相关的内核和用户进程之间的消息传递。

  • 共享内存Share Memory:允许多个进程在它们的地址空间中共享一块内存区域,从而实现用户态和内核态之间的高效数据传输。

欢迎关注【嵌入式艺术】,董哥原创!
img