Pull to refresh

Comments 33

UFO just landed and posted this here
Поправил кавычки, спасибо.

Код компилируется потому что в языке С — это вполне допустимая конструкция, называется designated-initializer
UFO just landed and posted this here
main.cpp не компилируется, потому что в c++ их нет.
Очень познавательно, спасибо!
А что это за антенна такая на видео?
Это телескоп гамма излучения.
24 зеркала, фокусирующих свет на 4 приемные корзины. В каждой корзине — 37 ФЭУ (фотоэлектронный умножитель).
Телескоп улавливает Черенковские вспышки от влетающих в атмосферу гамма-частиц.


А как выглядит изображение, получаемое таким телескопом?
Изображения как такового нет. Значения с групп ФЭУ суммируется и просто измеряется.
В результате для наблюдаемого объекта строится диаграмма распределения гамма-квантов.
У этих телескопов ГТ-48 интересная история с опорно-поворотными устройствами kik-sssr.ru/41E_Simeiz.htm
В функции «lirdev_read» присутствует уязвимость позволяющая читать стэк ядра. Всё дело в том, что в вызове функции «copy_to_user» параметр отвечающий за размер копируемых данных контролирует пользователь. По хорошему надо заменить на контрукцию:
dt_size = min(4,count);
copy_to_user(buf, &data, dt_size);
Спасибо за ценное замечание :)
А так да, статья очень полезная) Спасибо)
Возможно я пропустил, но под какое ядро писался код? Это очень важная информация. А так, на мой взгляд блестящее решение. Уважаю!
Спасибо!
Код писался и тестировался на ядре версии 3.16, дистрибутив — Debian Jessie.
Также проверял на Scientific Linux 7.3, проблем не было, правда версию ядра сейчас не вспомню…
Просто там отличие версии ядра и код перестаёт работать. Поэтому и спрашиваю.

Обычно, если не ломается сборка, то работоспособность не нарушается.

Статья шикарная!
Как отреагировал производитель о написанном драйвере?
Да особо никак.
Я их уведомил, отправил ссылку на github, ответили «Спасибо» и на этом переписка закончилась :)
Не пытались апстримить драйвер? Если у устройства есть хотя бы несколько десятков пользователей, то есть неплохой шанс пропихнуть драйвер в mainline.
Честно говоря пока не задавался этим вопросом.
Пока слабо представляю себе как собрать статистику по пользователям. У производителя есть официальный форум, но он полупустой и там чаще вопросы либо конкретно по железу, либо Windows. Все таки железка специализированная.
Подобного материала в рунете не так уж и много, так что спасибо, статья отличная!
А когда ядро обновляется в системе, ручками пересобираете драйвер? Недавно узнал зачем надо dkms в системе)
В нашем случае драйвер используется в системе управления телескопом, такие рабочие станции стараюсь не обновлять без особой надобности, а если ядро новое все таки приедет — руками пересобрать 10 секунд :)
>>Существует несколько путей общения вышестоящего ПО с нашим драйвером. Одним из самых старых, простых и популярных способов является символьное устройство
расскажите плиз о др способах общения ПО из юзер спейса с драйверами
Об одном из таких, других, способов я уже писал довольно давно. Это netlink.
Еще один способ — через виртуальные файловые системы (/proc, /sys). В частности именно таким образом различные утилиты получают от ядра информацию таблице маршрутизации, запущенных процессах, обращениях к диску и т.п.
Другой механизм — системные вызовы, через него с ядром общается, например, стандартная библиотека С.

Вообще наверное стоит написать отдельную статью, о способах общения с модулем ядра и подробнее про netlink рассказать, интересная штука.
Большое спасибо! Литература по написанию драйверов вроде бы есть, и неплохая, но там, как правило, рассматриваются простейшие абстрактные примеры блочных устройств или что-то подобное. Думаю, что эта статья — хорошее дополнение.

да, после части 35, есть ещё 36 и так до 75, просто меняйте циферки в адресе

Подскажите, пожалуйста, а какова вероятность «подвесить ядро», если в процедуре wait_for_transaction_finish аппаратура так и не выставит бит готовности, или, скажем, сделает это через пол-минуты? Я не очень разбираюсь в архитектуре ядра, мне интересно, в каком потоке работает этот код, и что может оказаться отложенным из-за такого ожидания? Просто чтение из аппаратуры обычно делается на основе прерываний, которые и сигнализируют в таких случаях, что данные готовы.
Т.к. вся процедура чтения по факту вызывается пользовательским приложением, то и выполняется этот код в контексте читающего потока приложения.
К самому ядру это отношения не имеет.
Соответственно если вдруг где-то застрянет железо — то в ожидании застрянет лишь пользовательское приложение, в методе read() на символьном устройстве. Это не подвесит остальную систему с прочими приложениями и процедура вполне подлежит завершению.
Не выставление бита может означать какой-то серъезный сбой с платой, и очевидно работать с ней дальше не выйдет. В случае же отвала лишь датчика — пауза все равно будет выставлена и из памяти будет прочитано нулевое значение.
Конечно если есть возможность — лучше всего использовать прерывания, но в данном случае они недоступны.
Sign up to leave a comment.

Articles