linux - Linux 内核:查找所有可通过系统调用访问的驱动程序
问题描述
我将主线 Linux 内核源代码与添加了许多驱动程序的同一源代码的修改副本进行比较。一点背景:修改后的源码是Android内核源码,里面包含了厂商、SoC厂商、谷歌等添加的很多驱动。
我正在尝试识别在修改后的源中添加的所有驱动程序,这些驱动程序可以通过任何系统调用从用户空间访问。我正在寻找一些系统的或理想的自动方法来找到所有这些以避免手动工作。
例如,字符设备驱动程序很有趣,因为如果有相应的设备文件,我可以对它们执行一些openat
、read
、和系统调用。要查找新的字符设备驱动程序,我可以首先在源代码树中找到所有新文件,然后将它们 grep 用于. 但除了 char 驱动程序之外,我还需要寻找什么?write
ioctl
close
struct file_operations
我知道上面提到的系统调用会对与文件关联的相应设备驱动程序进行某种“转发”。但是还有其他系统调用可以进行这种转发吗?我想我必须专注于所有这些系统调用,对吧?
有什么我可以在源文件中使用 grep 来指示系统调用可以引导到那里的东西吗?我应该怎么做才能找到所有这些驱动程序?
更新(缩小范围):
- 我针对的是特定设备(例如华为 P20 Lite),所以我知道相关的架构和硬件。但是为了这个问题,我们可以假设存在任何驱动程序的硬件。在我的情况下,如果我调用了一个驱动程序并且它报告说没有相应的硬件存在,只要我可以调用该驱动程序,这并不重要。
- 我只寻找可通过系统调用直接访问的驱动程序。直接可访问的意思是驱动程序设计为与用户空间有一些系统调用接口。是的,不针对某个驱动程序的系统调用仍可能间接触发该驱动程序中的代码,但这些间接影响可以忽略不计。
- 也许我的目标的一些背景可以澄清:我想使用Syzkaller对找到的驱动程序进行模糊测试。为此,我将创建可用于模糊 Syzkaller 解析的每个驱动程序的系统调用的描述。
解决方案
我很确定没有办法以编程方式执行此操作。任何这样做的尝试都会遇到几个问题:
- 在给定情况下调用的驱动程序取决于硬件。例如,在我的笔记本电脑上,
iwlwifi
驱动程序可以通过网络系统调用访问,但在服务器上,该驱动程序不会被使用。 - 如果硬件存在,几乎任何加载到内核中的代码都可以通过一些系统调用访问。驱动程序与硬件交互,而硬件又与用户、外部设备或网络交互,所有这些操作都可以通过系统调用进行。人们不会编写什么都不做的驱动程序。
- 即使是系统调用无法直接访问的驱动程序也会影响执行。例如,真正 RNG 的驱动程序将能够通过更改系统 PRNG 的行为来影响执行,即使
/dev/hwrng
.
因此,对于可以在给定架构的任何硬件上运行的通用内核,很难将任何驱动程序排除在考虑之外。如果您希望通过某种编程方式跟踪代码的执行而不实际执行它,那么您将需要解决停机问题。
关于这些坏消息我很遗憾。
推荐阅读
- reactjs - redux 状态正在改变,但组件没有重新渲染
- ios - CoreGraphics PDF 记录了一个错误。设置环境变量“CG_PDF_VERBOSE”以了解更多信息
- angular - Angular 问题中的全局消息服务
- simulink - 如何模拟 Sent_Protocl_signal?
- java - 新 Java 9 日志记录与现有日志记录 API 的关系
- isabelle - 如何通过评估简化归纳谓词?
- javascript - 如何为我的排行榜创建两列?
- java - 如何从另一个类调用存储在 applicationScope 中的 ArrayList
- angular - 如何使用 mocha 设置 angular.io 测试
- python - 如何将应用程序附加到原始 IP 和 TCP 层