Комментарии 5
Добрый день,
Спасибо за статью. Подход достаточно интересный, но возможно несколько странный.
- Почему нельзя было воспользоваться fsevents? Они из userspace доступны и предназначены в общем-то как раз для вашего случая. Проблемы асинхронности с ними вполне должны решаться через flock.
- Синхронный запрос в userspace на каждую I/O операцию будет приводить к жутким лагам, если не делать это сильно избирательно для пары файлов, но тогда лаги всё равно будут, пусть и при использовании этих файлов.
- Непонятно, как за такой варварский патчинг ядра вам дали сертификат для подписи драйвера, и пока ещё его не отобрали.
Здравствуйте!
- Как я понимаю, flock является лишь advisory, то есть нельзя гарантировать, что любое приложение поведет себя корректно и попросит flock перед записью.
- Синхронный запрос можно заменить асинхронным, который будет производить чтение части, которая еще не была сохранена. Я рассматриваю этот подход как улучшение текущего, но уже сейчас я проверяю нужно ли делать copy-on-write — в сервисе. Также пока живу с замедлениями текущего подхода.
- На macOS 10.16 скорее всего начнут отрезать поддержку загрузки 3rd party кекстов, поэтому все равно придется переходить на DriverKit API. Мой способ в любом случае скоро станет deprecated, поэтому делюсь хитростями пока еще есть шанс поэкспериментировать. Да и подход не такой уж варварский, в read-only секции и чужие кексты не пишем
Впрочем, вероятность изменения паттерна функции на порядок меньше, чем вероятность изменения порядка полей. Так что мы решили остановиться на втором методе.
- На чем основывался расчет вероятности? Есть какая-то статистика по изменениям паттернов кода и перетасовке полей?
- Почему не использовать каскад методов: если не получилось найти паттерн в коде функции, тот искать по смещениям?
- Вероятность основывается на результатах blame коммитов в ядро XNU GitHub blame для VNOP_CREATE и GitHub blame для struct vnode. Видно, что структура vnode менялась последний раз 3 года назад против 6 лет для VNOP_CREATE.
- Все верно, именно каскад и должен использоваться. Также необходимо валидировать саму таблицу, производя чтение ее содержимого — хотя бы проверить, что в таблице находятся указатели на функции.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Использование перехватов операций для бэкапа файлов в macOS “на лету”