Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
sppp ptm md cpc crypto fcip fcp logindmux nsctl sdbc sv ii rdc ipc ]
> ufs_lookup::dis -n 3
ufs_lookup: lock movl %esp,%ebp
ufs_lookup+3: subl $0x10,%esp
ufs_lookup+6: andl $0xfffffff0,%esp
Как нетрудно увидеть, в начале первой инструкции появился префикс lock. Это не совсем корректный код с точки зрения ассемблера x86, потому что по спецификации #lock нельзя использовать в комбинации с инструкцией movl. Поэтому эта комбинация генерирует программное прерывание (illegal opcode), управление перехватывается ловушкой (trap), где в итоге передаётся DTrace. Если вы попробуете воспроизвести эти действия, то возможно, что вместо #lock увидите нечто другое. Полученный после модификации ассемблерный код для x86, amd64 и, разумеется, для SPARC будет различен.
Подробнее об этом позже, а теперь снова вернёмся к обзору архитектуры.
Предикаты и действия. Буферы и DIF
У каждого ЕCB-блока может быть ассоциированый с ним предикат. Если таковой имеется, но его условие не выполняется, то DTrace по цепочке переходит к следующему ECB-блоку. Помимо предиката у каждого блока ECB есть список действий и, если условие предиката удовлетворено, то обработка ECB-блока продолжится последовательным исполнением всех действий данного блока. Если действие предполагает запись каких-то данных, то они будут сохранены в специальном буфере, который выделяется для каждого CPU и однозначно привязывается к потребителю, создавшему ECB-блок. Это делается потому, что для обеспечения безопасности использования действия не могут содержать явную запись в память ядра, изменение регистров, равно как и выполнение каких-то других явных операций, изменяющих состояние системы. Они могут делать это косвенно, но строго определённым способом, например остановить текущий процесс или сгенерировать точку останова в ядре. Такие действия можно делать только пользователям с определёнными полномочиями и явно разрешив деструктивные действия.
Рисунок 2. ECB, предикаты и действия
Еще одна линия защиты системы от нанесения непреднамеренного вреда – это виртуальная машина DTrace с собственным набором машинно-независимых команд RISC, который называется DIF (D Intermediate Format) и является целевым языком компиляции для libdtrace. D-скрипты транслируются в DIF и эмулируются в ядре при срабатывании датчика, подобно тому, как виртуальная машина Java (JVM) интерпретирует байткод Java. Использование эмуляции в момент исполнения гарантирует, что возможные ошибки, способные дестабилизировать систему, будут выловлены и обработаны безопасным способом. При помощи ключа -S команды dtrace можно посмотреть на генерируемые DIF-объекты (DIFO):