Несколько модулей ядра, перехватывающих один и тот же системный вызов, и сбой при выгрузке
Я работаю над перехватом системных вызовов (для open()
системный вызов), и у меня есть одна проблема: у меня есть два модуля ядра (mod1
а также mod2
) и они оба пытаются перехватить open()
Системный вызов. Я загрузил mod1
сначала, а потом mod2
, mod1
перехвачены open()
от:
original_open1 = sys_call_table[__NR_open];
sys_call_table[__NR_open] = mod1_open;
Вот original_open1
было бы sys_open
, После этого, mod2
перехвачены open()
от:
original_open2 = sys_call_table[__NR_open];
sys_call_table[__NR_open] = mod2_open;
Вот, original_open2
было бы mod1_open()
так как мод1 был загружен первым. Теперь проблема заключается в следующем: Предположим, я выгружаю mod1
первый и open()
системный вызов выполняется, затем mod2_open()
будет вызван, что в конечном итоге вызывает mod1_open()
,
поскольку mod1
уже выгружен, звонит mod1_open()
вызвало бы панику (поскольку указатель на функцию больше не является допустимой областью памяти).
Мне нужен механизм, чтобы избежать этой проблемы. По сути, я хочу решение, которое облегчает загрузку / выгрузку модулей (которые перехватывают один и тот же системный вызов) в любом случайном порядке, не вызывая паники.