LINUX.ORG.RU

Сплайсинг в ядре


0

3

Доброе утро.
Меня интересует, как правильно производить модификацию памяти в пространстве ядра linux с помощью записи jmp в прологе функции.
А точнее то, как защититься от сбоя. Сразу привожу пример.
Есть оригинальная функция, которая вызывается к примеру 200к раз в секунду. А когда я произвожу модификацию подобной функции в памяти методом сплайсинга, выскакивает Oops. Из всей доступной информации дебаг сообщения, можно выцепить только, то что сбой прозошёл при сплайсинге (именно в функции которая часто вызывается)(нулевых указателей нет). Если осуществлять перехват не часто вызываемой функции, то всё работает стабильно и без ошибок.
Как защититься от подобной ошибки? Так чтоб можно было осуществить безболезненный перехват управления функции с помощью метода сплайсинга.

Видел этот тред без комментариев.

proud_anon ★★★★★
()

Я не знаю, что такое сплайсинг, но дело наверняка в неатомарности вносимых модификаций. Грубо говоря, один байт jmp'а ты уже записал, а второй ещё не успел, и тут вызывается эта функция.

intelfx ★★★★★
()

используй atomic64_xchg или что-то аналогичное, т.к. писать минимум 5 байт

anonymous
()
Ответ на: комментарий от anonymous

cmpxchg16b , не нашёл в исходниках ядра. Имелось ввиду асм функция?
смотрел неделимые операции в ядре, и заинтересовали функции: atomic_set atomic64_set Это неделимое присвоение переменной указанного значения, на 32 и 64 разрядных архитектурах. На 64 битах использую atomic64_set этого должно хватить чтоб изменить 5 байт (которые нужны для перехвата управления) , а вот что делать с 32 разрядными системами? atomic_set изменяет только 4 байта..

vopros_linux
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.