Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Таким образом, каждый датчик полностью идентифицируется следующей четвёркой:
<провайдер, модуль, функция, имя>
Создание датчиков ещё не модифицирует систему, это только лишь определение возможных точек модификации системы. Это по сути создание необходимых структур данных, после чего DTrace только возвращает идентификатор датчика провайдеру. В какой же момент происходит модификация? Созданные провайдером датчики становятся видимыми для потребителей, которые могут включить группу датчиков, задав комбинацию элементов из вышеупомянутой четвёрки. После включения DTrace создаёт и привязывает к датчику блок управления (ECB – enabling control block), где определены действия (actions) и предикат (predicate), то есть что и при каком условии будет выполнено в случае срабатывания датчика. Если во время создания данного ECB других связанных с текущим датчиком ECB нет, DTrace обращается к провайдеру с указанием включить данный датчик (кстати, если ECB уже есть, то новый блок становится в хвост цепочки ECB-блоков для этого датчика). И в этот момент провайдер динамически модифицирует систему таким образом, что при срабатывании датчика управление переходит к модулю DTrace, причём первым аргументом в обращении к нему следует идентификатор датчика.
Итак, DTrace получил управление. Как только это произошло, на текущем процессоре запрещаются прерывания, и DTrace отрабатывает действия, определённые в каждом ECB-блоке из цепочки ECB-блоков сработавшего датчика. Затем прерывания разрешаются вновь, и управление возвращается провайдеру.
Пример модификации кода провайдером
Теперь давайте посмотрим, как же реально модифицируется код на платформе x86 в Solaris . Для этого нам понадобится Solaris 10 или Solaris Express Developer Edition, рутовый доступ, штатный отладчик модулей ядра mdb и 2 терминальных окошка. В одном из окошек запускаем mdb и дизассемблируем функцию ufs_lookup(), ограничив вывод тремя первыми командами, чтобы его не загромождать:
jedi# mdb -k
Loading modules: [ unix genunix specfs dtrace uppc pcplusmp scsi_vhci
ufs ip hook neti sctp arp usba uhci fctl nca lofs zfs random audiosup
sppp ptm md cpc crypto fcip fcp logindmux nsctl sdbc sv ii rdc ipc ]
> ufs_lookup::dis -n 3
ufs_lookup: pushl %ebp
ufs_lookup+1: movl %esp,%ebp