解析通用内核扩展中的文件

Parsing files in generic kernel extensions

Xcode 的通用内核扩展需要文件解析。

比如我想读取A.txt文件的内容,并保存为一个变量。就像你在 c

中使用 FILE, fopen, EOF

如您所见,通用内核扩展无法包含 stdio.h,导致使用未声明标识符的错误。

我想知道是否有一种方法可以在通用内核扩展中解析文件,例如 c。 (以下代码可在内核扩展中使用)

FILE *f;
char c;
int index = 0;
f = fopen(filepath, "rt");
while((c = fgetc(f)) != EOF){
    fileContent[index] = c;
    index++;
}
fileContent[index] = '[=10=]';

当然可能。您需要执行以下操作:

  1. vnode_open() 打开文件。这会将您的路径变成 vnode_t 参考。您需要一个 VFS 授权上下文;您可以使用 vfs_context_create() 获取当前线程的上下文(即,以内核当前在其进程上下文中的用户身份打开文件 运行)如果您还没有的话。
  2. vn_rdwr() 执行 I/O。 (读取和写入使用相同的函数,只需传递 UIO_READUIO_WRITE 作为第二个参数。)
  3. 关闭文件并删除对 vnode_close() 的 vnode 的引用。可能使用 vfs_context_rele().
  4. 处理创建的 VFS 上下文

您需要查看所有这些函数的标题文档,它们在 Kernel.framework 中的 <sys/vnode.h> 中定义,并解释每个参数都超出了 SO 的范围 question/answer.

注意: 正如评论者已经指出的那样,您需要确保打开文件确实是解决您的问题所需要的,特别是如果您是内核编程的新手。如果完全不确定,我建议你 post 按照 "I'm trying to do X, is reading the file in a kext really the best way forward?" 的思路提问,其中 X 足够高,不是 "I need the contents of a file in the kernel",而是 为什么 ,以及为什么 文件 具体?

在各种内核执行上下文中,文件 I/O 可能不安全(即有时可能会挂起系统)。如果您的 kext 在引导过程中提前加载,则可能还没有文件系统。文件 I/O 导致系统中发生 lot,并且在内核方面可能需要很长时间 - 特别是如果您考虑网络文件系统(包括网络引导环境!)。如果你不小心,如果用户试图用你的 kext 打开的文件弹出一个卷,你可能会导致糟糕的用户体验:用户无法解决这个问题,OS 只能建议具体的应用程序关闭,它无法深入您的 kext。此外,还有关于内核编程的常见警告:仅仅因为它可以在内核中完成,并不意味着它应该如此。恰恰相反:只有当它不能以任何其他方式完成时才应该在 kext 中完成。