Ядро, Расширения ядра и Информация о версии Набора I/O для Snow Leopard OS X

Функции OS X Snow Leopard 64-разрядное ядро и переписанная инфраструктура для расширений ядра (kexts), с улучшениями, покрывающими много аспектов kext разработки, от компоновщика до инструментов командной строки. Базовая kext архитектура была полностью перепроектирована для лучшей производительности и гибкости, а также поддержки 64-разрядного kexts. В процессе обновления ядра и kext среды, однако, изменения должны были быть внесены в интерфейсы программирования ядра, которые могут потребовать некоторой работы портирования для 32-разрядного kexts, а также 64-разрядного kexts.

Важный: нет никаких гарантий двоичной или совместимости во время выполнения между семенами. Обязательно восстановите весь Ваш Snow Leopard kexts на этом семени прежде, чем загрузить их.

Содержание:

Информация о версии в течение Конца апреля 2009

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

Расширения ядра с двоичным файлом Info.plist файлы не распознаны за загрузку из пространства пользователя на Snow Leopard OS X; весь kext plists должен теперь быть XML. На предшествующих выпусках kexts с двоичным файлом plists никогда не распознавались футболистом или ядром, но, оказалось, были загружаемыми от пространства пользователя вследствие использования Базовой Основы plist синтаксический анализатор. Это вызвало некоторую загрузку и отладку проблем с XML, который kernel/IOKit XML синтаксический анализатор не мог обработать, поэтому теперь, все kext plists обрабатываются с тем же синтаксическим анализатором и в ядре и в пространстве пользователя.

Аутентификация Kext теперь игнорирует .DS_Store файлы. .DS_Store файлы не доступны для загрузки ресурса через OSKextRequestResource().

Информация о версии на апрель 2009

На Snow Leopard OS X вывод журналирования ядра сохраняется к файлу /var/log/kernel.log вместо /var/log/system.log. Обязательно проверьте оба файла журнала на соответствующие сообщения при отладке загрузки расширения ядра и расширений ядра.

kauth_cred_self() был неправильно перечислен в новых таблицах KPI. Корректное имя kauth_cred_get(). Таблицы KPI были обновлены для отражения этого.

Информация о версии на март 2009

Загрузка Kexts от кода C; некорневая загрузка

kextload(8) теперь отправляет запрос загрузки RPC к kextd(8). Можно загрузить kexts из кода C с помощью этих RPCs также. Контроль <IOKit/kext/KextManager.h> для KextManagerLoadKextWithIdentifier() и KextManagerLoadKextWithURL().

Далее, kextload(8) и эти RPCs могут быть вызваны как некорневой пользователь для kexts:

  • Это определяет булевскую переменную OSBundleAllowUserLoad свойство с a true значение. (Обратите внимание на то, что в именовании страницы справочника существует опечатка OSKextAllowUserLoad.)

  • Это установлено где угодно под /System/.

  • Чьи зависимости, прямые и косвенные, также делают оба из вышеупомянутых. System.kext и его плагины уже определяют OSBundleAllowUserLoad, но никакие семьи еще не делают — и так как драйверы Набора I/O загружаются kextd(8) по требованию от ядра, маловероятно, что они добавят OSBundleAllowUserLoad.

Включите некорневую загрузку для своего kexts с некоторой осторожностью и только если необходимый для обращения проблем безопасности (таких как предотвращение setuid двоичного файла в системе).

kextunload(8) и kextutil(8) все еще должны быть выполнены как корень, для проблем безопасности и потому что они связываются непосредственно с ядром.

Авторазгрузите для BSD Kexts

BSD kexts может теперь включить и управлять, авторазгружаются для себя через подсчет ссылок; посмотрите платформу Ядра <libkern/OSKextLib.h> для функций OSKextRetainKextWithLoadTag() и OSKextReleaseKextWithLoadTag(). Например, если у Вас есть файловая система kext, она может сохранить себя на каждом, монтируются и выпускают себя на каждом размонтировании.

Как отмечено в другом месте, BSD kexts может теперь безопасно использовать классы C++ Libkern без непреднамеренного инициирования, авторазгружаются (как имел место на каждом предшествующем выпуске OS X). Авторазгрузитесь используемый, чтобы быть включенными на загрузке для любого kext, определившего подкласс OSObject; это теперь включено только, когда kext определяет подкласс IOService. При определении каких-либо подклассов IOService kext все еще подвергается для авторазгружений; необходимо или удостовериться, что экземпляр одного из тех подклассов существует, или используйте kext, сохраняют/выпускают механизм, как надлежащий.

Загрузки файла ресурсов

Совершенно новый в этом семени встроенное средство для kexts для получения файлов ресурсов от их пакетов при выполнении в ядре. См. <libkern/OSKextLib.h> для OSKextRequestResource() и связанные функции. Намерение состоит в том, чтобы позволить драйверам Набора I/O вытаскивать микропрограммные блобы из своих лиц, таким образом, они не сидят без дела, используя соединенную проводом память ядра все время. Обратите внимание на то, что загрузки ресурса выполняются kextd(8), таким образом, любые запросы, выполненные во время ранней начальной загрузки, не будут fulfulled до kextd(8) запускается.

Разработчик, Загружающийся с kextutil

Как детализировано ниже kextload(8) больше не принимает опции разработки. Использовать kextutil(8) для всей загрузки разработки, генерации символа и другого тестирования.

Заключительные классы

Snow Leopard kext компоновщик теперь поддерживает заключительные классы — классы, которые не могут быть разделены на подклассы другим kext (можно все еще разделить их на подклассы в том же kext). Для объявления финала класса используйте макросы OSDeclareFinalStructors() и OSDefineMetaClassAndFinalStructors() от платформы Ядра <libkern/c++/OSMetaClass.h>.

Изменение класса для использования заключительного объявления повреждает совместимость на уровне двоичных кодов, не делайте в настоящее время поставляющий финал классов kext’s библиотеки, если Вы ожидаете, что другая поставка kexts соединится против него.

Kext-связанные коды ошибки Маха

Коды ошибки Маха для новой kext системы в ядре теперь имеют mach_error_string значения установлены.

Многословное входящее в систему пространство пользователя и ядра

Журналирование kext механизма было восстановленным completey, таким образом, kext вывод инструмента, надо надеяться, менее переполнен несоответствующим сообщением, но они действительно распечатывают к терминальной информации, обычно только регистрировавшейся от ядра прямо к консоли. Это, объединенное с новым mach_error_string значения, должен сделать причины отказа в ядре более очевидными.

Если работа успешно выполняется, kext инструменты теперь ничего не регистрируют по умолчанию. Используя -v включает дополнительное журналирование, но сообщения журнала об определенном kexts только распечатаны, если сам kext имеет OSBundleEnableKextLogging свойство (см. ниже при переопределении). -v уровни были скорректированы несколько, но каждый все еще включает каждый предыдущий уровень:

  • 0: Ошибки только (= 0xff1 ниже)

  • - (-v не указанный): уровень по умолчанию включает предупреждения и ошибки (= 0xff2 ниже)

  • 1: Основной результат (= 0xff3 ниже)

  • 2: Прогресс работы (= 0xff4 ниже)

  • 3: Отдельные шаги (обычно каждый kext) (= 0xff5 ниже)

  • 4: Подробные данные (= 0xff6 ниже)

  • 5: Информация об отладке (= 0xff7 ниже)

  • 6: Информация об отладке для всего kexts (независимо от OSBundleEnableKextLogging) (= 0xfff ниже)

Можно также указать журналирование к очень мелким деталям с помощью 32-разрядной шестнадцатеричной спецификации журналирования. Короче говоря, нижнее откусывание, последняя шестнадцатеричная цифра от 0–7, является (внутренним) уровнем журнала, который обычно равняется 2 больше, чем ненулевой эквивалент -v уровень из списка выше. Установка высокого бита этого откусывания заставляет сообщения для всего kexts быть зарегистрированными как подходящая для уровня, независимо от OSBundleEnableKextLogging. Все биты выше нижнего откусывания являются флагами для различных видов действия. Нижняя часть 2 откусывания флагов для типичных вещей, важных для разработчика, как операции загрузки, IPC и создание архива / обработка. Откусывание высшего порядка является для операций большим количеством relevent к внутренностям kext библиотеки. Для наблюдения абсолютно многословного журналирования попробовать -v 0xffffffff.

Можно установить журналирование для ядра также с помощью kextlog boot-arg/sysctl и шестнадцатеричной спецификации. Эти команды включают ядро kext регистрирующий для следующего перезапуска, или сразу:

sudo nvram boot-args="-v kextlog=0xff4"
sudo sysctl -w debug.kextlog=0xff4

Информация о версии на ноябрь 2008

64-разрядное ядро и расширения ядра

Начало моделей 2008 года Mac Pro, 20-дюймовой и 24-дюймовой iMac, 15-дюймового и 17-дюймового MacBook Pro и Xserve может использоваться для 64-разрядной разработки ядра. Аудио и AirPort теперь включены на них тестирующих configurations. В Snow Leopard 64-разрядное ядро используется по умолчанию на Xserve. Mac Pro и системы MacBook Pro могут быть загружены в 64-разрядное ядро одним из двух способов:

  • Временно начальная загрузка в 64-разрядное ядро удержанием «6» и «4» при включении машины.

  • Выполненный sudo nvram boot-args="arch=x86_64" чтобы установить 64-разрядное ядро как, Ваше ядро по умолчанию и добавить любую другую отладку flags Вы, возможно, понадобится, такой как debug=0x144. Для возвращения назад к 32-разрядному ядру как значение по умолчанию можно работать sudo nvram -d boot-args очистить начальную загрузку args или установить boot-args без arch=x86_64.

Это семя содержит необходимую поддержку портирования kexts к 64-разрядному, и разработчики строго призваны сделать так.

Известные Ограничения в 64-разрядном ядре:

  • Акула не работает над 64-разрядным ядром.

  • Сон/след и управление питанием в настоящее время не поддерживаются. Это, рекомендуют отключить сон в Установках системы.

  • Графическое ускорение еще не поддерживается, который может вызвать программы, требующие, чтобы графическое ускорение работало неправильно.

  • Некоторое поведение, ранее не поддерживавшееся, такие как изменение OSCollection при перечислении его и попытке изменить kext's __ Сегмент текста, теперь приводит к диагностической панике ядра.

Изменения в расширениях ядра и инструментах

Изменения в инструментах Kext

Большинство kext инструментов было переписано на Snow Leopard OS X с поддержкой длинных опций, улучшили журналирование и различные другие улучшения. Существенные изменения к инструментам являются осуждением kextload(8) поскольку инструмент разработчика и поддержка перекрестной архитектуры работают над kexts.

kextload(8) инструмент был уменьшен до существенной функциональности, требуемой для производственной загрузки расширений ядра. Новый инструмент, kextutil(8), теперь функциональность разработчика дескрипторов. С этого семени, kextload больше не принимает опции разработчика и поддерживает только -b, -d, -h, -q, -r, -v, и их длинные эквиваленты; -c, -D, и -t будет принят, но проигнорирован. См. страницы справочника для подробных данных.

kextutil(8) функции a -arch флаг для генерации символов для архитектуры кроме того из рабочего ядра, включая отладку перекрестной архитектуры kexts. Мужественное расположение должно автоматически работать при генерации символов для Leopard и более ранних выпусков.

Snow Leopard использует новые версии mkext и предварительно соединенных файлов ядра, не распознанных более ранними выпусками OS X. Более ранние выпуски не будут в состоянии обновить объемы Boot≠Root с установленным Snow Leopard, но Snow Leopard может обновить объемы Boot≠Root с более ранними выпусками. kextcache включает новые опции генерировать mkext файлы и в старых и в новых форматах, и как kextutil теперь функции a -arch флаг; это больше не генерирует предварительно соединенные ядра старого формата.

Отладка расширений ядра

Общая процедура для отладки расширений ядра остается тем же как на Leopard OS X. Вот заметные различия:

  • Используйте версию Snow Leopard gdb отладить Snow Leopard kexts.

  • Использовать kextutil(8) генерировать отладочные символы.

  • Всегда указывайте архитектуру явно через -arch отметьте при генерации символов или запуске отладчика. Это особенно важно для gdb, поскольку это использует x86_64 архитектура по умолчанию.

Например, если Вы хотите генерировать 64-разрядные символы для AppleFWOHCI.kext и установили Набор Отладки Ядра, Вы могли бы использовать эту команду (вся одна строка):

kextutil -n -z -e -r /Volumes/KernelDebugKit -k /Volumes/KernelDebugKit/mach_kernel -arch x86_64 \
    -a com.apple.driver.AppleFWOHCI@0xffffff7f80830000 -a com.apple.iokit.IOPCIFamily@0xffffff7f80604000 \
    -a com.apple.iokit.IOFireWireFamily@0xffffff7f807e6000 -s /tmp/syms -- /tmp/syms/AppleFWOHCI.kext

Используемые опции:

  • -n — Не загружайтесь в ядро.

  • -z — Не аутентифицируйте расширения (больше необходимый на Snow Leopard при использовании -n, но необходимый на более старых выпусках)

  • -e — Не заглядывать /System/Library/Extensions для зависимостей или идентификаторов пакета

  • -r — Заглянуть /Volumes/KernelDebugKit для зависимостей и идентификаторов пакета

  • -arch — Используйте исполнимые программы для именованной архитектуры

  • -a — Ссылка, как будто kext с именованным идентификатором загружается в данном адресе

  • -s — Сохраните файлы символов к этому каталогу

  • --- — Конец опций; все после того, как это - имя kext

В Вашем gdb сеанс, Вы используете добавить-kext команду как так:

(gdb) add-kext /tmp/syms/AppleFWOHCI.kext

Кроме того, отладка FireWire теперь встроена к системе. Использовать отладку FireWire:

  1. Включите FireWire kdp на целевой машине в boot-args. Например: sudo nvram boot-args="debug=0x146 kdp_match_name=firewire".

  2. Перезапустите машину.

  3. На хост-машине, выполненной fwkdp команда.

  4. Во втором окне терминала, выполненном gdb на надлежащем файле ядра и присоединении; например:

    gdb -arch x86_64 /Volumes/KernelDebugKit/mach_kernel
    source /Volumes/KernelDebugKit/kgmacros
    kdp-reattach localhost

Обратите внимание на то, что с kdp Вы всегда присоединяете к localhost а не фактическое имя хоста цели; fwkdp вперед gdb пакеты между узлом и целью.

Для получения дополнительной информации об отладке FireWire консультируйтесь fwkpfv и fwkdp(1) страницы справочника.

64-разрядные расширения ядра

Snow Leopard OS X представляет 64-разрядное ядро и поддержку записи 64-разрядных расширений ядра. Существенное изменение, влияющее на 64-разрядный kexts, то, что com.apple.kernel* библиотеки не доступны; 64-разрядный kexts должен использовать com.apple.kpi.*. Частный KPI был перемещен от com.apple.kpi.unsupported kext к com.apple.kpi.private; третье лицо kexts не должно использовать этот KPI, поскольку это станет недоступным связи заключительным выпуском Snow Leopard.

64-разрядные kexts имеют новый Мужественный тип файла (KEXTBUNDLE, а не OBJECT, как сообщается otool).

Посмотрите позже в этом документе для получения информации о портировании kexts 64-разрядную среду ядра.

Установка расширений ядра

Snow Leopard OS X требует всех каталогов и файлов в пакете kext, за исключением содержания папки PlugIns (который технически содержит отличные пакеты, которые не должны быть kexts), чтобы принадлежать root:wheel и не быть перезаписываемым группой или другим. На предшествующих выпусках это - задокументированное поведение, но фактическое поведение состояло в том, чтобы проверить только Info.plist пакета и исполняемый файл и узлы каталога между ними и самим пакетом kext. Установщики, включающие ресурсы или другие файлы с различным владением или полномочиями, должны быть обновлены для обеспечивания корректных защит на всех каталогах компонента и файлах пакетов kext.

Рекомендуемый способ обновить kext кэши после установки или обновления состоит в том, чтобы все еще обновить время изменения /System/Library/Extensions/ и затем отправьте SIGHUP в kextd (оба как суперпользователь):

touch /System/Library/Extensions
/bin/kill -1 `ps -ax | awk '{print $1" "$5}' | grep kextd | awk '{print $1}'`

На Leopard и Snow Leopard, SIGHUP является дополнительным. Когда /System/Library/Extensions/ затронут, все kext кэши за исключением предварительно соединенного ядра обновляются автоматически после малой задержки; предварительно соединенное ядро обновляется после следующего перезапуска. Для получения дополнительной информации, особенно относительно установки на более старых выпусках OS X, посмотрите Технические Вопросы и ответы QA1319: Установка Набора I/O KEXT Без Перезагрузки.

Архитектурно-зависимые свойства

На Snow Leopard OS X, когда kext штабель управления ищет верхний уровень kext свойство пакета, он проверяет сначала на имя свойства, соответствующее текущей архитектуре. Такое имя свойства добавляет к основному имени подчеркивание, сопровождаемое именем архитектуры; архитектурно-зависимые значения для OSBundleLibraries, например, может быть установлен как OSBundleLibraries_i386 и OSBundleLibraries_x86_64. (Обратите внимание на то, что имя архитектуры соответствует cputype только и никогда cpusubtype.) Путем определения архитектурно-зависимых свойств можно указать различные наборы библиотек для использования при загрузке на различной архитектуре, с различными версиями при необходимости, через OSBundleLibraries; различные лица Набора I/O для использования для соответствия через IOKitPersonalities; и различные требования для ранней загрузки с OSBundleRequired.

Если Ваш драйвер не создается полностью универсальный, он настоятельно рекомендован это, Вы используете архитектурно-зависимые лица для предотвращения побочных запросов загрузки.

Используемая архитектура является по умолчанию архитектурой рабочего ядра, но многие kext инструменты позволяют Вам указывать архитектуру с -arch флаг, генерируя отладочные символы.

Обратите внимание на то, что архитектурно-зависимые свойства являются функцией kext штабеля управления, а не CFBundle. Только свойства, определенные kext системой и Набором I/O — в частности те, которые начинают OSBundle…, OSKernel…, и IO…— используйте архитектурно-зависимые варианты.

Смешанный C/C++ Kexts

Функции OS X Snow Leopard поддерживают для kexts, использующих и C и код C++. На предшествующих выпусках OS X, используя классы C++ Libkern в универсальном kext (на базе С) было опасное предложение, так как механизм авторазгрузки Набора I/O уничтожил любой kext ссылка на такие классы, если не было никаких экземпляров их. Кроме этого, даже если non-Libkern C++ использовался, разгружается программная заглушка, вызванная в, вызвал статические деструкторы C++ kext перед подпрограммой остановки kext, и когда kext был авторазгружен, подпрограмма остановки не была вызвана вообще.

Snow Leopard исправляет эти проблемы:

  • Отмечание только kexts, которые определяют подклассы IOService для, авторазгружается. Набор Non-I/O kexts загруженный на Snow Leopard может безопасно использовать и разделить классы C++ Libkern на подклассы.

  • Изменение тупика разгружает подпрограмму для вызова подпрограммы остановки kext сначала, тогда статические деструкторы C++ kext. Важный: Для получения этого поведения, необходимо создать kext, который будет предназначен против Snow Leopard, поскольку программная заглушка встроена в kext.

  • Всегда разгружая kext путем вызова и подпрограммы остановки и затем C++ статические деструкторы, независимо от типа kext (универсальный или Набор I/O).

Внутренние изменения

Кэши Kext на Snow Leopard

Кэши Kext на Snow Leopard OS X — включая предварительно соединенное ядро, mkext, и kext кэши свойства — теперь все находятся в /System/Library/Caches/com.apple.kext.caches/ папка. Как упомянуто выше, установщики и updaters должны только обновить время изменения /System/Library/Extensions/ гарантировать, что кэши восстановлены и не должны делать предположения о расположениях kext кэшей.

Осуждение kmod _ … Интерфейсы

Вследствие существенных изменений к загрузке kext и бухгалтерским системам в ядре, Snow Leopard OS X удалил почти все kmod_… функции (подпрограммы MIG остаются для совместимости на уровне двоичных кодов пространства пользователя, но наиболее теперь возвращаются KERN_UNSUPPORTED). Связанный список kmod_info структуры также больше не экспортируются. Kext запускаются и останавливаются, подпрограммы все еще передаются указатель на kext’s kmod_info структура, но kexts должна рассмотреть только name, version, id (также известный как тег загрузки или индекс), address, size, и info_version поля как допустимые. Остающиеся поляkmod_info структура может прекратить использоваться заключительным выпуском Snow Leopard или более поздним выпуском OS X.

Свяжитесь с Технической поддержкой Разработчика с любыми вопросами относительно этого вопроса.

Изменения в интерфейсах программирования ядра (KPIs)

Осуждаемый и новый KPIs

Это семя удаляет много символов из заголовков и KPIs и для 32-и для 64-разрядные расширения ядра. В 64-разрядном KPIs мы консолидировали интерфейсы, удалив функции с двойной функциональностью и сохранив более поддерживаемых из них. Некоторые KPIs имеют незначительные изменения для создания их более поддерживаемыми. Небольшое количество было удалено, которые никогда не использовались и не принадлежали модели их подсистем.

Обратите внимание на то, что совместимые версии 32-разрядного KPIs не изменились; удаление неподдерживаемых символов достаточно для предотвращения kexts ссылка на них от загрузки. Если Ваш kext не удается создать из-за символов, удаленных из заголовков, или не удается соединиться из-за символов, удаленных из наборов символов, консультируйтесь с Поддерживаемыми документами KPI в /System/Library/Frameworks/Kernel.framework/Resources/ и заголовки в Kernel.framework для замен и обновления Ваш kext соответственно. Если никакая замена не доступна для символа, Ваш kext соединялся против, зарегистрируйте ошибку и свяжитесь с Технической поддержкой Разработчика.

Поддержка стандарта PC Card (IOPCCardFamily.kext и заголовки) была удалена из Snow Leopard OS X.

Большое количество нового KPIs доступно, особенно в 64-разрядном Наборе I/O. Консультируйтесь с остальной частью этой информации о версии, поддерживаемых документов KPI в /System/Library/Frameworks/Kernel.framework/Resources/ для полных списков символов на всей архитектуре и заголовков в Kernel.framework относящийся к Вашему kext для комментариев headerdoc.

Два символа заслуживают специального замечания здесь:

ucred_t     // legacy type removed, use kauth_cred_t instead
vfs_context // opaque and this time it is mandatory for K64; there is no private header exported

Изменения KPI для 64-разрядного Kexts

Все предоставленные Apple семьи I/O Kit, за исключением IOPCCardFamily.kext, доступны для 64-разрядных расширений ядра в этом Семени.

Набор I/O Изменения KPI

В целом использование осудило Набор I/O, KPIs приведет к предупреждению сборки, и можно консультироваться с документацией класса для наблюдения то, что изменилось. Эти два существенных изменения, итоговые вот, к IOCreateThread, и IOMemoryDescriptor; иначе, большинство изменений к внутреннему KPIs.

IOCreateThread осуждается для 64-разрядного kexts. kernel_thread_start должен использоваться вместо этого. Удостоверьтесь, что выпустили ссылку на thread_t путем вызова thread_deallocate. IOExitThread может быть заменен вызовом к thread_terminate(current_thread()).

Изменения в IOMemoryDescriptor и связанных классах получены в итоге здесь:

Не поддерживаемый в 64-разрядном

Рекомендуемый

IOMemoryDescriptor::getPhysicalSegment64()

IOMemoryDescriptor::getPhysicalSegment(kIOMemoryMapperNone)

IOMemoryDescriptor::getVirtualSegment()

IOMemoryDescriptor::map()->getVirtualAddress()

  • IOMemoryDescriptor::initWithAddress(void *)

  • IOMemoryDescriptor::initWithAddress(task_t)

  • IOMemoryDescriptor::initWithPhysicalAddress()

  • IOMemoryDescriptor::initWithPhysicalRanges()

  • IOMemoryDescriptor::initWithRanges()

IOMemoryDescriptor::initWithOptions()

IOMemoryDescriptor::map(task_t)

IOMemoryDescriptor::createMappingInTask()

IOMemoryDescriptor::withAddress(task_t)

IOMemoryDescriptor::withAddressRange()

IOMemoryDescriptor::withPhysicalRanges()

IOMemoryDescriptor::withOptions(kIOMemoryTypePhysical)

IOMemoryDescriptor::withRanges()

IOMemoryDescriptor::withOptions(kIOMemoryTypeVirtual)

IOMemoryDescriptor::withSubRange()

IOSubMemoryDescriptor::withSubRange([kIOMemoryThreadSafe])

IOBufferMemoryDescriptor::initWithBytes()

IOBufferMemoryDescriptor::initWithPhysicalMask()

IOBufferMemoryDescriptor::initWithOptions(void *)

IOBufferMemoryDescriptor::initWithPhysicalMask()

IOBufferMemoryDescriptor::initWithOptions(task_t)

IOBufferMemoryDescriptor::initWithPhysicalMask()

Подклассы IOMemoryDescriptor далее имейте эти изменения:

Не поддерживаемый в 64-разрядном

Рекомендуемый

IOMemoryDescriptor::getPhysicalSegment()

IOMemoryDescriptor::getPhysicalSegment(IOOptionBits)

  • IOMemoryDescriptor::getPhysicalSegment64()

  • IOMemoryDescriptor::initWithAddress(void *)

  • IOMemoryDescriptor::initWithAddress(task_t)

  • IOMemoryDescriptor::initWithPhysicalAddress()

  • IOMemoryDescriptor::initWithPhysicalRanges()

  • IOMemoryDescriptor::initWithRanges()

—

Мах изменения KPI

Все KPIs, использующие структуру mach_timespec или mach_timespec_t осуждаются, и поддержка их не ожидается в K64.

Следующие возвращаемые значения вызовов с помощью новых специализированных типов, и секунды возвратились, unsigned long (64 бита) в K64 (K32 неизменен). Обратите внимание на то, что это примитивы Маха; большая часть kexts будет использовать эквиваленты BSD вместо этого.

extern void clock_get_system_microtime(
    clock_sec_t  * secs,
    clock_usec_t * microsecs);
 
extern void clock_get_system_nanotime(
    clock_sec_t  * secs,
    clock_nsec_t * nanosecs);
 
extern void clock_get_calendar_microtime(
    clock_sec_t  * secs,
    clock_usec_t * microsecs);
 
extern void clock_get_calendar_nanotime(
    clock_sec_t  * secs,
    clock_nsec_t * nanosecs);

Вызов потока изменения KPI

Не поддерживаемый в 64-разрядном

Рекомендуемый

  • thread_call_func

  • thread_call_func_cancel

  • thread_call_func_delayed

  • thread_call_is_delayed

  • thread_call_allocate

  • thread_call_enter

  • thread_call_enter_delayed

  • thread_call_cancel

  • thread_call_free

Таймер потока изменения KPI

Не поддерживаемый в 64-разрядном

Рекомендуемый

  • thread_set_timer

  • thread_set_timer_deadline

  • thread_cancel_timer

  • assert_wait_deadline

  • assert_wait_timeout

Поток ядра изменения KPI

Не поддерживаемый в 64-разрядном

Рекомендуемый

kernel_thread

kernel_thread_start (Удостоверьтесь, что выпустили ссылку на thread_t путем вызова thread_deallocate.)

Покажите время изменения KPI

Не поддерживаемый в 64-разрядном

Рекомендуемый

clock_get_uptime

mach_absolute_time

BSD и VFS KPI изменения

Важный: нет никакой поддержки непотоковых файловых систем в 64-разрядном ядре. Все Файловые системы должны быть поточными для работы в K64. Не полагайтесь на трубу ни для какой блокировки.

Пользователь KAuth изменения KPI

Не поддерживаемый в 64-разрядном

Рекомендуемый

  • suser

  • is_suser

  • is_suser1

  • kauth_cred_issuser

    vfs_context_suser

    proc_suser

Изменения учетных данных KAuth

Не поддерживаемый в 64-разрядном

Рекомендуемый

proc_ucred

kauth_cred_get (или получите cred из переданного в vfs_context)

kauth_cred_rele

kauth_cred_unref

Изменения UBC

Не поддерживаемый в 64-разрядном

Рекомендуемый

  • ubc_setcred

  • ubc_sync_range

  • ubc_setthreadcred

  • ubc_msync

  • ubc_getobject

  • ubc_info_deallocate

  • ubc_info_init

  • ubc_info_zone

  • ubc_isinuse

—

Изменения VFS

Не поддерживаемый в 64-разрядном

Рекомендуемый

file_vnode

  • file_vnode_withvid (обеспечивает vnode и vid)

  • vnode_getwithvid (для ioref не будучи под fileref объем)

rootvnode

  • vfs_rootvnode (возвращает указатель с ioreference, должен отбросить касательно с vnode_put())

  • vslock

  • vsunlock

  • vnode_target

—

Другие изменения

Не поддерживаемый в 64-разрядном

Рекомендуемый

  • ldisc_deregister

  • ldisc_register

  • lightning_bolt

  • postevent

  • —

Известные ошибки в ноябре 2008

  • Если Вы касаетесь папки Extensions объема Leopard, в то время как рабочий Snow Leopard, она будет обновлена с неправильным форматом mkext, и объем Leopard запаникует на запуске.

  • Не все предоставленные Apple расширения ядра доступны при использовании 64-разрядного ядра на этом семени. В частности ускоренная графика не поддерживается. Кроме того, спите и будьте в спящем режиме, не поддерживаются. Эти функции должны быть доступными в версии выпуска Snow Leopard OS X

  • «Himemory_mode» параметр загрузки, используемый для отладки больших конфигураций физической памяти, не поддерживается в этом семени.

  • showuserstack gdb макрос в kgmacros не работает над процессами на 64 бита.

  • Используя -v флаг с kext инструментами отключает регистрацию ошибок.

  • kextunload и mkextunpack не распознавайте длинные опции такой как -bundle-id, и некоторые длинные опции, берущие дополнительные аргументы, требуют, чтобы равняние расписалось за параметр, который будет распознан.