【问题标题】:Parsing files in generic kernel extensions在通用内核扩展中解析文件
【发布时间】:2019-03-27 04:25:23
【问题描述】:

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] = '\0';

【问题讨论】:

  • 我想知道如何在内核扩展中做文件I/O。例如,它读取 A.txt 文件的内容并打印出来。
  • 出于好奇,我用谷歌搜索了一下,发现例如Kernel Extension development for macOS。我得出的结论是“在 KEXT 中加载文件”,你搞错了。如果您需要将数据带入 KEXT(例如用于配置),那么正确的方法似乎是在开始时提供此数据 kern_return_t Kext_start(kmod_info_t* ki, void* d); 或让应用程序通过 内核用户交互 (IO) 设置该数据我>...
  • 另外值得一提的是:当您试图确定一段代码是否应该是 KEXT 时,默认答案通常是 noKernel Extension Overview 中找到。我想,你的问题是关于一个玩具项目来了解它是如何工作的。因此,我建议阅读提供的链接,以首先了解 KEXT 有什么好处(以及没有什么好处)。恕我直言,它会读取 A.txt 文件的内容并将其打印出来。 不适合 KEXT 的用途。

标签: c xcode macos file-io kernel-extension


【解决方案1】:

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

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

您需要查看所有这些函数的 headerdocs,它们在 Kernel.framework 的 <sys/vnode.h> 中定义,并且解释每个参数超出了 SO 问题/答案的范围。

注意:然而,正如评论者已经指出的那样,您需要确保打开文件确实是解决您的问题所需要的,特别是如果您是对内核编程很陌生。如果完全不确定,我建议您发布一个问题,类似于“我正在尝试做 X,以 kext 读取文件真的是最好的前进方式吗?”其中 X 的级别足够高,不是“我需要内核中文件的内容”而是为什么,以及为什么要专门使用 file

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

【讨论】:

  • 当您说包含 sys/vnode.h 文件的 Kernel.framework 时,我应该看哪里?它在根文件系统中吗?还是在 xnu 源代码库中?
  • @ruach 完整路径类似于/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Kernel.framework/Headers/sys/vnode.h,但您可以通过⌘-单击kext 源代码中的#include <sys/vnode.h> 指令并选择“跳转到”更轻松地从Xcode 中到达那里定义"
猜你喜欢
  • 1970-01-01
  • 2018-07-08
  • 2019-02-03
  • 1970-01-01
  • 2012-05-27
  • 2017-09-06
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
相关资源
最近更新 更多