Общее расширение ядра для программирования ядра Mac prinf () не работает

Я следил за Создание универсального расширения ядра с учебником по Xcode.

MyKext.c:

#include <sys/systm.h>
#include <mach/mach_types.h>

kern_return_t MyKext_start (kmod_info_t * ki, void * d)
{
    printf("MyKext has started.\n");
    return KERN_SUCCESS;
}

kern_return_t MyKext_stop (kmod_info_t * ki, void * d)
{
    printf("MyKext has stopped.\n");
    return KERN_SUCCESS;
}

Я также отключил csrutil, что позволяет мне загружать собственный kext.

# csrutil disable

Когда я загружаю свой собственный kext в ядро

$ sudo kextload -v /tmp/MyKext.kext

Результат printf() не записывается в /var/log/system.log.

Я также установил загрузочные аргументы

$ sudo nvram boot-args="original_contents debug=0x4"

Может кто-нибудь мне помочь?


person sleepy_dog    schedule 11.04.2017    source источник
comment
во-первых, вам нужно использовать функции ядра. так что printf() должно быть printk()   -  person user3629249    schedule 11.04.2017
comment
существуют специальные функции для записи в системный журнал. Это: openlog(), syslog(), closelog()   -  person user3629249    schedule 11.04.2017
comment
@user3629249: Что навело вас на эту мысль? printf() должно работать нормально.   -  person l'L'l    schedule 11.04.2017
comment
printf() правильно в расширениях ядра macOS/OS X. IOLog() работает одинаково, но чаще встречается в драйверах устройств. Какая версия ОС у вас работает? Начиная с 10.12, /var/log/system.log больше не является правильным местом для поиска, теперь вам нужно искать в новой службе системного ведения журнала, к которой вы можете получить доступ с помощью команды log. printk() для Linux, syslog() для пользовательского пространства. Отображается ли ваш kext в выводе kextstat? Пожалуйста, не используйте kextload, используйте вместо этого kextutil, у него гораздо лучшая диагностика.   -  person pmdj    schedule 12.04.2017
comment
возможно, вам придется заглянуть в консольное приложение и попробовать ввести имя расширения ядра в текстовое поле поиска. все журналы будут показаны там для вашего приложения.   -  person Vikram Sinha    schedule 22.11.2018


Ответы (2)


По-видимому, начиная с Sierra (10.12), по крайней мере, они реорганизовали способ записи журналов (поддержка iOS?), поэтому вы больше не можете видеть его в system.log. Тем не менее, в вашем консольном приложении на боковой панели есть раздел Devices, где вы можете выбрать свое устройство (обычно систему Mac) и просмотреть журнал в реальном времени, ограниченный «ядром» в поле поиска. Итак, я вижу это при использовании kext load/kextunload:

default 11:58:27.608228 +0200   kernel  MyKext has started.
default 11:58:34.446824 +0200   kernel  MyKext has stopped.
default 11:58:44.803350 +0200   kernel  MyKext has started.

Нет необходимости в изменениях csrutil и nvram.

Важно По какой-то причудливой причине мне нужно было перезапустить консоль, чтобы отразить изменения в моих сообщениях, иначе она показывала те (запуск и остановка) из предыдущей сборки. Действительно очень странно!

Позже Чтобы восстановить старые журналы, попробуйте sudo log collect --last 1d и откройте результат с помощью Console(подробнее здесь).

person Liviu    schedule 25.09.2017
comment
Комментарий о консоли только что решил проблему с моими журналами ..... Все еще не понимаю, почему Apple нигде не упоминает об этом ... спасибо за информацию :) - person J1and1; 04.10.2017

Извините за некропост, но я счел полезным использовать log(1) с одной из его многочисленных команд (как предложил @pmdj в комментариях выше), а не использовать консоль. Из руководства:

log -- доступ к общесистемным сообщениям журнала, созданным os_log, os_trace и другими системами ведения журнала.

Например, можно запустить:

log stream

чтобы увидеть выходные данные системы в реальном времени, включая printf() из расширения ядра MacOS.

person peachykeen    schedule 19.05.2020