LINUX.ORG.RU

Сообщения SteveN

 

Kernel to user.

Всем привет,

Знатоки, помогите с решением.

Как мне из ядра Linux пользовательскому приложению передать информацию?

Хочется из функции sys_write передавать для определенных файлов информацию об изменении в user mode приложение.

Правильно ли использовать shared memory? Используют ли ее в ядре вообще? Какие еще варианты можно попробовать?

Заранее спасибо!

SteveN
()

Семафоры в ядре

Всем привет!

Создаю семафор в ядре, точнее в функции fs/read_write.c, чтобы обезопасить работу своего кода в многопоточной среде. Каждый раз мне возвращается новый семафор... Почему, ведь IPC_EXCL говорит, что если создан семафор, то вернется ошибка и в этом случае я буду работать с уже существующим семафором...

смотрю ipcs -s - семафор создан.

int sid;
union semun semopts;
semopts.val = 1;
struct sembuf sem_lock;
key_t sem_key=16384;

if ((sid = sys_semget( sem_key, 1, IPC_CREAT | IPC_EXCL | 0666 )) != -1)
{
sys_semctl(sid, 0, SETVAL, semopts);
printk(KERN_ERR «\nsys_semget create new \n»);
}
else
sid = sys_semget( sem_key, 1, 0666 );

дальше делаю lock

sem_lock.sem_num =0;
sem_lock.sem_op =-1;
sem_lock.sem_flg =0;
sys_semop(sid, &sem_lock, 1);

потом unlock

struct sembuf sem_unlock;
sem_unlock.sem_num =0;
sem_unlock.sem_op = 1;
sem_unlock.sem_flg =0;
sys_semop(sid, &sem_unlock, 1);

SteveN
()

Shared memory & multithreading

Всем привет,

Может кто-нибудь подскажет, не могу понять проблему.

Работаю в ядре. Перехватываю запись в определенный файл в sys_pwrite64. При перехвате записи в файл меня интересует информация - сдвиг(место записи) и размер записи, чтобы вычислить изменившийся сектор.

Далее идея такая - получить bitmap определенного размера, в котором выставлены биты для изменившихся секторов.

Сейчас использую shared memory System V, чтобы делать все в ядре. Возникает следующая проблема - при работе с одной ниткой проблем нет, а вот при работе большего количества ниток возникает BUG: unable to handle paging request at 0x...

Копаясь с проблемой нашел, что происходит это в момент, когда у меня одна из ниток получает при вызове shmat другой адрес (на тот же сегмент), что само по себе нормально. И в этот же момент какая-нибудь нитка пишет по адресу, полученному в своем контексте. В какой конкретно нитке происходит ошибка, пока не знаю, но, предполагаю, что в той, которая пишет по старому адресу.

Пытался сделать синхронизацию через семафоры, но не хватило пока времени закончить, проблема возникла, что каждый раз инициализируется семафор заново каждой ниткой и не происходит блокировки.

Собственно вопрос в том, как быть? Может кто-то сталкивался с таким? Любые соображения приветствуются.

SteveN
()

RSS подписка на новые темы