Всем привет,
Может кто-нибудь подскажет, не могу понять проблему.
Работаю в ядре. Перехватываю запись в определенный файл в sys_pwrite64. При перехвате записи в файл меня интересует информация - сдвиг(место записи) и размер записи, чтобы вычислить изменившийся сектор.
Далее идея такая - получить bitmap определенного размера, в котором выставлены биты для изменившихся секторов.
Сейчас использую shared memory System V, чтобы делать все в ядре. Возникает следующая проблема - при работе с одной ниткой проблем нет, а вот при работе большего количества ниток возникает BUG: unable to handle paging request at 0x...
Копаясь с проблемой нашел, что происходит это в момент, когда у меня одна из ниток получает при вызове shmat другой адрес (на тот же сегмент), что само по себе нормально. И в этот же момент какая-нибудь нитка пишет по адресу, полученному в своем контексте. В какой конкретно нитке происходит ошибка, пока не знаю, но, предполагаю, что в той, которая пишет по старому адресу.
Пытался сделать синхронизацию через семафоры, но не хватило пока времени закончить, проблема возникла, что каждый раз инициализируется семафор заново каждой ниткой и не происходит блокировки.
Собственно вопрос в том, как быть? Может кто-то сталкивался с таким? Любые соображения приветствуются.