LINUX.ORG.RU

А писал ли кто-нить драйвера пол Linux?


0

0

Есть проблема - был написан драйвер, довольно простенький, предназначен для работы с платой собственной разработки. Должен он работать на 2-х процессорной машине (Intel). И нормально он работал на ядре 1.ххх (не знаю версию, к сожалению). Теперь перетащили этот драйвер на ядро 2.4 и вылез косяк - при ядре не-SMP все работает, как и положено, а вот при ядре SMP в обработчике прерывания все валится при вызове wake_up_interruptible... дамп что-то такое пишет про wate_on_interrupt on CPU0 .... irq lost. Если выкинуть эту строку - все нормально. Но без нее тоскливо - драйвер слушается через poll и через poll мы получаем причину прерывания. Хотя я, вообщем-то не претендую на глубокое знание предмета. Может, кто чего подскажет?

anonymous

я не знаю что за специфика в linux но здравый смысл подсказывает что в однопроцессорной системе для исключения врубания в конкретный исполняемый кусок достаточно изменить приоритет прерываний на самый высокий + 1 так что-бы никакой пидарас не мог обработаться, а после выполнения кода понижаешь. Для мультипроцовых такая тактика не прокатывает и впринципе во время выполнения твоего кода два проца могли обратится к одному ресурсу не разруливая последовательность доступа и убить консистентность. Вывод такой что если есть такой ресурс, а он наверняка есть - его надо защитить чем либо(захватить). Если таких ресурсов много то стоит обратить внимание на то что вы можете отсасать друг у друга .. например ты захватил ресурс A - второй проц захватил ресурс B, ты ждешь B для захвата, а он A.

удачи

lg ★★
()

Это все круто и понятно и это было самым первым, что было сделано - из всего модуля было выкинуто все, что можно - все функции голые - т.е. кроме return 0, в них нихрена нет. Единственное исключение - функция poll и обработчик прерывания :

static DECLARE_WAIT_QUEUE_HEAD(mod_poll);

static int mod_poll(......) { poll_wait(... , &mod_poll, ...); return 0; }

static void irq_routine(....) { wake_up_interruptible(&mod_poll); }

причем poll ни разу не вызывается..

и все это очень изящно превращается в kernel panic... Самое непонятное - перерыл кучу исходников, везде используется эта конструкция и везде она работает - я ж ядро компилил и SMP и не-SMP - везде драйвера загружаются и нормально работают...

//я не знаю что за специфика в linux :) пардон, не сразу заметил, для тебя все это бредом покажется...

anonymous
()

Может это поможет? http://www.xml.com/ldd/chapter/book/ch02.html If you are compiling for an SMP machine, you also need to define __SMP__ before including the kernel headers. In version 2.2, the "multiprocessor or uniprocessor" choice was promoted to a proper configuration item, so using these lines as the very first lines of your modules will do the task: #include <linux/config.h> #ifdef CONFIG_SMP # define __SMP__ #endif A module writer must also specify the -Oflag to the compiler, because many functions are declared as inline in the header files. gcc doesn't expand inline functions unless optimization is enabled, but it can accept both the -g and -Ooptions, allowing you to debug code that uses inline functions.[9] Because the kernel makes extensive use of inline functions, it is important that they be expanded properly. geekkoo

anonymous
()

Драйвер нужно собирать со специальным ключем при компиляции и сборке. Можно прочитать статью в интернете по поводу написания драйверов или книжечку "Написание модулей ядра Linux", но там все очень плохо написано, лично у меня такого опыта нет.

anonymous
()

Глупый вопрос - а для SMP драйвер перестраивал? Иначе именно так ядерный код себя и ведет...

omerm
()

ну вообщето, если написано, что проблемы именно с SMP, то про все ключи, дефайны и прочую лабуду вроде как уже известно... Все равно всем спасибо Оказалось, что эта мерзость ОБЯЗАТЕЛЬНО должна брать инклуды из /usr/src/linux/include, а не из /usr/include. После фри я линух начинаю ненавидеть все больше и больше. Ладно, все вроде как собралось и работает... на ядре 2.4. на ядре 2.5 - не хочет :) то cli()&sti() оно не знает, то приинклудить "int_vectors.h" не может :) но это уже мелочи вроде

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