VisionFive 2 — одноплатный компьютер на базе процессора StarFive JH7110. Примечателен тем, что в нем используется открытый набор инструкций RISC-V. В отличие от 1-ой версии, 2-ая версия VisionFive имеет интегрированный GPU. Это делает VisionFive 2 первым одноплатником на RISC-V, способным серьезно конкурировать с Raspberry Pi и другими одноплатниками на ARM. По крайней мере, в теории.
Game & Watch: Super Mario Bros — это портативная игровая консоль, выпущенная Nintendo в 2020-м году по случаю 35-и летия игр про Марио. Консоль напоминает игры Game & Watch из 80-х годов, но имеет цветной дисплей. Спустя год вышла аналогичная игровая консоль Game & Watch: The Legend of Zelda. Оба устройства имеют по три игры. Две из них — игры соответствующей серии (Марио / Зельда) под Famicom, и еще одна игра в стиле Game & Watch из 80-х. Вскоре энтузиасты научились прошивать больше трех игр. Этим мы сегодня и займемся.
Тут по работе возникла задачка с PostgreSQL. Нужно было определить, как часто при определенных условиях вызываются такие-то процедуры, и что они при этом возвращают. Трейсить предстояло совсем чуть-чуть, да и не в проде, поэтому я воспользовался LLDB. Несмотря на то, что это не инструмент трассировки, в моем случае с задачей он справился. И тут я вспомнил, что еще не так давно читал про bpftrace. Хотя, конечно же, успел напрочь все позабыть. Было решено проверить, насколько лучше или хуже bpftrace подошел бы для той же задачи.
Из предыдущей заметки о модулях ядра Linux мы узнали, что такое контекст прерывания, и что в нем нельзя делать блокирующие вызовы. Но что, если я хочу повесить прерывание на нажатие кнопки, а в обработчике делать что-то блокирующее? Давайте разберемся.
По традиции, при изучении нового языка программирования первой пишется программа, показывающая сообщение «Hello world». В мире электроники есть аналогичная традиция, только вместо вывода сообщения нужно помигать светодиодом. При изучении модулей ядра Linux (часть 1, часть 2) мы как-то обошли стороной этот важнейший этап. Пришло время исправиться, и написать модуль, мигающий светодиодом.
Бывает так, что ошибка в коде воспроизводится лишь при определенном стечение обстоятельств. Эти обстоятельства могут быть довольно сложными, особенно если приложение распределенное и каждый его экземпляр состоит из N процессов. Подцепиться отладчиком к правильному процессу в правильный момент времени практически невозможно. В подобных случаях я использую один незамысловатый прием, речь о котором и пойдет далее.
Недавно мы научились основам написания модулей ядра Linux. Впрочем, рассмотренные тогда примеры были совсем простые, можно даже сказать, что игрушечные. Сегодня мы напишем модуль поинтереснее. Он будет создавать в каталоге /dev символьное устройство, с которым можно взаимодействовать из юзерспейса.
Вопрос ковыряния ядра Linux впервые поднимался в этом блоге еще в далеком 2016-м году. Мы научились собирать ядро из исходников и цепляться к нему отладчиком. Но на этом все и заглохло. Тогда найти актуальную информацию по разработке ядерного кода в Linux, да еще и в удобоваримом виде, было проблемой. Я предпочел дождаться появления свежих книг по теме, а пока заняться изучением чего-то другого. И вот, спустя пять лет, такие книги были опубликованы. В связи с чем я решил попробовать написать пару модулей ядра, и посмотреть, как пойдет.
TimescaleDB — это расширение PostgreSQL для работы с временными рядами (time series). Временные ряды можно хранить в PostgreSQL и просто так, но TimescaleDB обеспечивает большую производительность на том же железе. Также расширение предлагает ряд удобных фичей, специфичных для тайм-серий.
WebDAV — это расширение протокола HTTP, описанное в RFC4918. WebDAV добавляет в HTTP возможность загружать файлы на сервер, а также удалять / перемещать их, и так далее. В итоге мы получаем что-то очень похожее на FTP, или даже на сетевую файловую систему типа NFS или Samba. Давайте же выясним, как этим пользоваться.