【问题标题】:Understanding buffering for Mac OS block devices and IOFilterScheme KEXTs了解 Mac OS 块设备和 IOFilterScheme KEXT 的缓冲
【发布时间】:2019-01-14 17:00:43
【问题描述】:

我正在尝试了解 IOFilterScheme KEXT 是如何工作的,以便最终自己开发一个。我已经尝试了一些示例程序并获得了基本的加密功能,例如使用this sample。

但是,当我添加 printf() 语句并查看控制台日志时,我看到了一些令人困惑的行为。具体来说,我几乎从来没有看到 read() 调用,除了我配置东西时的一些进程(如 mount_hfs 和 fsck_hfs)。

例如,如果我从某个应用程序(例如:vim)在卷(从已安装的磁盘映像)上写入一个新文件,那么我将在控制台日志中看到相应的 write(),其正确的 PID 为'vim'。我在使用其他应用程序时也会看到这一点。

但是,如果我尝试从另一个应用程序(例如 Sublime Text 编辑器)读取同一个文件,该文件可以正常打开,但我在控制台日志中从未看到任何相应的 read() 条目。

虽然我可以通过查看 DMG 文件来判断示例加密正在工作,但我看到的行为有两个问题:

1) 我很难理解在读写方面发生了什么。

2) 最终,我想编写一个 KEXT,其行为因正在读取或写入的应用程序而异。为此,我需要每个尝试访问该文件的应用程序(至少是该应用程序第一次访问该文件)的实际 read()。

经过一些研究,Mac OS 上的块设备似乎有某种缓冲,但我无法找到太多细节。实验上,我尝试在 read() 和 write() 调用中执行这一行,但没有效果

super::IOStorage::synchronize(client, 0, 0);

如果有人能告诉我如何更好地控制缓冲以便我可以看到实际的 read() 调用,那就太好了。如果那是不可能的,那么我可能不得不在不同的级别编写我的加密驱动程序。然而,一个 IOFilterScheme KEXT 看起来(除了这一点)它真的很适合我的用例,所以我希望我可以让它工作。

【问题讨论】:

    标签: macos kernel storage kernel-extension


    【解决方案1】:

    缓存主要发生在文件级别,在统一缓冲区缓存 (UBC) 中。文件系统本身可以进行任何类型的缓存,尤其是元数据(内部树结构等)。这是 IOKit 之上的许多层,因此您无法从 IOStorage 驱动程序中影响任何这些。

    2) 最终,我想编写一个 KEXT,其行为因正在读取或写入的应用程序而异。为此,我需要每个尝试访问该文件的应用程序(至少是该应用程序第一次访问该文件)的实际 read()。

    尝试在块 I/O kext 中执行此操作可能是愚蠢的差事。现代文件系统是复杂的野兽,因此您不能期望文件 I/O 和块 I/O 之间存在任何类型的 1:1 对应关系。如果你想要应用程序/文件级别的粒度,你需要在 VFS 层工作,或者通过你自己的文件系统,或者根据你想要做什么,使用 kauth。如果您不害怕使用 Apple 明确表示不要使用的 API(例如内部使用/学习),您还可以使用 MAC 框架 kext API,它比 kauth 给您更多的控制权。

    【讨论】:

      猜你喜欢
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 2014-06-01
      • 1970-01-01
      相关资源
      最近更新 更多