Linux内核:查找可通过系统调用访问的所有驱动程序



我将主流Linux内核源代码与添加了许多驱动程序的同一源代码的修改副本进行比较。一点背景:修改后的源代码是Android内核源代码,它包含许多由供应商、SoC制造商、谷歌等添加的驱动程序。

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

例如,char设备驱动程序很有意思,因为如果有相应的设备文件,我可以对它们执行一些openatreadwriteioctlclose系统调用。要查找新的字符设备驱动程序,我可以首先在源树中查找所有新文件,然后为struct file_operations对它们进行grep。但除了字符驱动程序,我还需要寻找什么?

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

我是否可以在源文件中用grep查找某些内容,以表明系统调用可以导致这种情况?我该如何找到所有这些司机?


更新(缩小范围(:

  • 我的目标是特定的设备(例如华为P20 Lite(,所以我了解相关的架构和硬件。但为了这个问题,我们可以假设硬件适用于任何驱动程序。在我的情况下,如果我调用了一个驱动程序,并且它报告没有相应的硬件,只要我能调用驱动程序,这并不重要
  • 我只寻找可以通过系统调用直接访问的驱动程序。我所说的"直接可达"是指设计为与用户空间具有某种系统调用接口的驱动程序。是的,不针对某个驱动程序的系统调用仍然可能间接触发该驱动程序中的代码,但这些间接影响可以忽略
  • 也许我的目标有一些背景说明:我想使用Syzkaller对找到的驱动程序进行模糊测试。为此,我将创建可用于模糊Syzkaller解析的每个驱动程序的系统调用的描述

我确信没有办法通过编程实现这一点。任何这样做的尝试都会遇到几个问题:

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

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

很抱歉听到这个坏消息。

最新更新