首页 > 解决方案 > Linux 内核:查找所有可通过系统调用访问的驱动程序

问题描述

我将主线 Linux 内核源代码与添加了许多驱动程序的同一源代码的修改副本进行比较。一点背景:修改后的源码是Android内核源码,里面包含了厂商、SoC厂商、谷歌等添加的很多驱动。

我正在尝试识别在修改后的源中添加的所有驱动程序,这些驱动程序可以通过任何系统调用从用户空间访问。我正在寻找一些系统的或理想的自动方法来找到所有这些以避免手动工作。

例如,字符设备驱动程序很有趣,因为如果有相应的设备文件,我可以对它们执行一些openatread、和系统调用。要查找新的字符设备驱动程序,我可以首先在源代码树中找到所有新文件,然后将它们 grep 用于. 但除了 char 驱动程序之外,我还需要寻找什么?writeioctlclosestruct file_operations

我知道上面提到的系统调用会对与文件关联的相应设备驱动程序进行某种“转发”。但是还有其他系统调用可以进行这种转发吗?我想我必须专注于所有这些系统调用,对吧?

有什么我可以在源文件中使用 grep 来指示系统调用可以引导到那里的东西吗?我应该怎么做才能找到所有这些驱动程序?


更新(缩小范围):

标签: linuxlinux-kernellinux-device-driversystem-callsandroid-kernel

解决方案


我很确定没有办法以编程方式执行此操作。任何这样做的尝试都会遇到几个问题:

  • 在给定情况下调用的驱动程序取决于硬件。例如,在我的笔记本电脑上,iwlwifi驱动程序可以通过网络系统调用访问,但在服务器上,该驱动程序不会被使用。
  • 如果硬件存在,几乎任何加载到内核中的代码都可以通过一些系统调用访问。驱动程序与硬件交互,而硬件又与用户、外部设备或网络交互,所有这些操作都可以通过系统调用进行。人们不会编写什么都不做的驱动程序。
  • 即使是系统调用无法直接访问的驱动程序也会影响执行。例如,真正 RNG 的驱动程序将能够通过更改系统 PRNG 的行为来影响执行,即使/dev/hwrng.

因此,对于可以在给定架构的任何硬件上运行的通用内核,很难将任何驱动程序排除在考虑之外。如果您希望通过某种编程方式跟踪代码的执行而不实际执行它,那么您将需要解决停机问题

关于这些坏消息我很遗憾。


推荐阅读