в списке рассылки новичков ядра.
отаю над перехватом системных вызовов (для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()
вызовет панику (поскольку указатель на функцию больше не является допустимой областью памяти).
Мне нужен механизм, чтобы избежать этой проблемы. По сути, я хочу решение, которое облегчает загрузку / выгрузку модулей (которые перехватывают один и тот же системный вызов) в любом случайном порядке, не вызывая паники.