Разбор файлов в общих расширениях ядра

Общее расширение ядра 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';

person Kimtw    schedule 23.10.2018    source источник
comment
Мне интересно, как сделать файловый ввод-вывод в расширении ядра. Например, он считывает содержимое файла A.txt и распечатывает его.   -  person Kimtw    schedule 23.10.2018
comment
Из любопытства я немного погуглил и нашел, например. Разработка расширения ядра для macOS. Я пришел к выводу, что загрузив файл в KEXT, вы что-то напутали. Если вам нужно ввести данные в KEXT (например, для настройки), то правильным подходом будет либо предоставить эти данные при запуске kern_return_t Kext_start(kmod_info_t* ki, void* d);, либо позволить приложению установить эти данные через взаимодействие между ядром и пользователем (IO). ...   -  person Scheff's Cat    schedule 23.10.2018
comment
Также стоит упомянуть: Когда вы пытаетесь определить, должен ли фрагмент кода быть KEXT, ответ по умолчанию обычно нет. можно найти в Обзор расширения ядра. Я предполагаю, что ваш вопрос касается игрушечного проекта, чтобы узнать, как он работает. Следовательно, я рекомендую прочитать предоставленные ссылки, чтобы сначала узнать, для чего KEXT подходит (а для чего нет). ИМХО, он читает содержимое файла A.txt и распечатывает его. не для того, для чего предназначены KEXT.   -  person Scheff's Cat    schedule 23.10.2018


Ответы (1)


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

  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 загружается рано во время загрузки, возможно, файловой системы еще нет. Файловый ввод-вывод вызывает множество событий в системе и может занять очень много времени с точки зрения ядра, особенно если вы рассматриваете сетевые файловые системы (включая среду сетевой загрузки!). Если вы не будете осторожны, вы можете создать плохой пользовательский опыт, если пользователь попытается извлечь том с файлом, открытым вашим kext: у пользователя нет возможности решить эту проблему, ОС может только предложить закрыть определенные приложения, он не может проникнуть глубоко в ваш кекст. Кроме того, есть обычные предупреждения о программировании ядра в целом: то, что это можно сделать в ядре, не означает, что так должно быть. Скорее наоборот: только если это невозможно сделать другим способом, это можно сделать в кексте.

person pmdj    schedule 23.10.2018
comment
Когда вы говорите, что Kernel.framework содержит файл sys/vnode.h, на что мне смотреть? Это в корневой файловой системе? или в исходном репозитории xnu? - person ruach; 26.04.2021
comment
@ruach Полный путь будет чем-то вроде /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Kernel.framework/Headers/sys/vnode.h, но вы можете получить его гораздо проще из Xcode, щелкнув ⌘ директиву #include <sys/vnode.h> в вашем источнике kext и выбрав Перейти к определению - person pmdj; 26.04.2021