Это, безусловно, возможно .Вам нужно будет сделать следующее:
- Открыть файл с помощью
vnode_open()
.Это превратит ваш путь в vnode_t
ссылку.Вам понадобится контекст авторизации VFS;вы можете получить контекст текущего потока (т. е. открыть файл как пользователь, в контексте процесса которого ядро работает в данный момент) с помощью vfs_context_create()
, если у вас его еще нет. - Выполнить ввод / вывод с помощью
vn_rdwr()
.(Для чтения и записи используется та же функция, просто передайте UIO_READ
или UIO_WRITE
в качестве второго аргумента.) - Закройте файл и удалите ссылки на vnode с помощью
vnode_close()
.Возможно избавиться от созданного контекста VFS, используя vfs_context_rele()
.
. Вы захотите взглянуть на документы заголовков для всех этих функций, они определены в <sys/vnode.h>
в Kernel.framework,объяснение каждого параметра выходит за рамки SO / вопроса / ответа.
Примечание: Однако, как уже отмечал комментатор, вам нужно убедиться, что открытие файлов действительно то, чтоНужно сделать все, чтобы решить вашу проблему, особенно если вы новичок в программировании ядра.Если вообще не уверены, я предлагаю вам задать вопрос в духе «Я пытаюсь сделать X, действительно ли чтение файла в kext является лучшим способом продвижения вперед?»где X - достаточно высокий уровень, а не «мне нужно содержимое файла в ядре», а почему , и почему именно файл специально?
в различных ядрахВ контексте выполнения файловый ввод-вывод может быть небезопасным (т. е. иногда может зависать система).Если ваш kext загружается рано во время загрузки, возможно, еще не существует файловой системы.Файловый ввод / вывод вызывает в системе lot и может занять очень много времени с точки зрения ядра - особенно если вы рассматриваете сетевые файловые системы (включая среды сетевой загрузки!).Если вы не будете осторожны, вы можете столкнуться с плохим пользовательским интерфейсом, если пользователь пытается извлечь том с файлом, открытым вашим kext: у пользователя нет способа решить эту проблему, ОС может предложить закрыть только определенные приложения,это не может проникнуть глубоко в твой текст.Плюс, есть обычные предупреждения о программировании ядра в целом: только то, что это может быть сделано в ядре, не означает, что это должно быть.Скорее наоборот: только если это нельзя сделать каким-либо другим способом, если это нужно сделать в кексте.