Linux用户态和内核态交互的几种方式 #
Linux分为内核态Kernel Mode和用户态User Mode,其通信方式主要有:
- 系统调用
System Call:最常见的用户态和内核态之间的通信方式。通过系统调用接口(open、read、write、fork等)请求内核执行特定的动作。 - 中断
Interrupts:中断包括软中断和硬中断,每当中断到来的时候,CPU会暂停当前执行的用户态代码,切换到内核态来处理中断。 - 信号
Signal:内核通过Signal通知用户态进程发生了某些事件,用户态注册信号处理函数,来响应特定的信号事件。如SIGTERM、SIGINT等。 - 共享内存
Share Memory:允许多个进程在它们的地址空间中共享一块内存区域,从而实现用户态和内核态之间的高效通信。这种方式避免了用户态和内核态之间频繁切换的问题,但是也需要考虑到数据的同步问题,保证数据一致性。
用户态User Mode访问内核态Kernel Mode的数据交互的方式有:
procfs进程文件系统:一个伪文件系统,因为其不占用外部存储空间,只占有少量的内存,挂载在/proc目录下sysctl:它也是一个Linux命令,主要用来修改内核的运行时参数,也就是在内核运行时,动态修改内核参数。和
procfs的区别在于:procfs主要是输出只读数据,而sysctl输出的大部分信息是可写的。sysfs虚拟文件系统:通过/sys来完成用户态和内核的通信,和 procfs 不同的是,sysfs 是将一些原本在 procfs 中的,关于设备和驱动的部分,独立出来,以 “设备树” 的形式呈现给用户。netlink接口:也是最常用的一种方式,本质是socket接口,使用netlink用于网络相关的内核和用户进程之间的消息传递。共享内存
Share Memory:允许多个进程在它们的地址空间中共享一块内存区域,从而实现用户态和内核态之间的高效数据传输。
