Разбор файлов в общих расширениях ядра - PullRequest
0 голосов
/ 23 октября 2018

Общее расширение ядра XCode требует синтаксического анализа файла.

Например, я хочу прочитать содержимое файла A.txt и сохранить его как переменную.Так же, как вы использовали FILE, fopen, EOF в c

. Как видите, универсальное расширение ядра не может включать 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';

1 Ответ

0 голосов
/ 23 октября 2018

Это, безусловно, возможно .Вам нужно будет сделать следующее:

  1. Открыть файл с помощью vnode_open().Это превратит ваш путь в vnode_t ссылку.Вам понадобится контекст авторизации VFS;вы можете получить контекст текущего потока (т. е. открыть файл как пользователь, в контексте процесса которого ядро ​​работает в данный момент) с помощью vfs_context_create(), если у вас его еще нет.
  2. Выполнить ввод / вывод с помощью vn_rdwr().(Для чтения и записи используется та же функция, просто передайте UIO_READ или UIO_WRITE в качестве второго аргумента.)
  3. Закройте файл и удалите ссылки на vnode с помощью vnode_close().Возможно избавиться от созданного контекста VFS, используя vfs_context_rele().

. Вы захотите взглянуть на документы заголовков для всех этих функций, они определены в <sys/vnode.h> в Kernel.framework,объяснение каждого параметра выходит за рамки SO / вопроса / ответа.

Примечание: Однако, как уже отмечал комментатор, вам нужно убедиться, что открытие файлов действительно то, чтоНужно сделать все, чтобы решить вашу проблему, особенно если вы новичок в программировании ядра.Если вообще не уверены, я предлагаю вам задать вопрос в духе «Я пытаюсь сделать X, действительно ли чтение файла в kext является лучшим способом продвижения вперед?»где X - достаточно высокий уровень, а не «мне нужно содержимое файла в ядре», а почему , и почему именно файл специально?

в различных ядрахВ контексте выполнения файловый ввод-вывод может быть небезопасным (т. е. иногда может зависать система).Если ваш kext загружается рано во время загрузки, возможно, еще не существует файловой системы.Файловый ввод / вывод вызывает в системе lot и может занять очень много времени с точки зрения ядра - особенно если вы рассматриваете сетевые файловые системы (включая среды сетевой загрузки!).Если вы не будете осторожны, вы можете столкнуться с плохим пользовательским интерфейсом, если пользователь пытается извлечь том с файлом, открытым вашим kext: у пользователя нет способа решить эту проблему, ОС может предложить закрыть только определенные приложения,это не может проникнуть глубоко в твой текст.Плюс, есть обычные предупреждения о программировании ядра в целом: только то, что это может быть сделано в ядре, не означает, что это должно быть.Скорее наоборот: только если это нельзя сделать каким-либо другим способом, если это нужно сделать в кексте.

...