Хорошие новости, всем!
Ядро Linux 5.0 уже здесь и появляется в экспериментальных дистрибутивах, таких как Arch, openSUSE Tumbleweed, Fedora.
А если посмотреть RC-дистрибутивы Ubuntu Disko Dingo и Red Hat 8, то становится понятно: скоро ядро 5.0 перенесут с фанатских десктопов на серьезные сервера.
Кто-то скажет – ну и что.
Просто очередной релиз, ничего особенного.
Сам Линус Торвальдс сказал:
Я хотел бы отметить (еще раз), что мы не выпускаем функциональные релизы, и что «5.0» означает не что иное, как то, что цифры 4.x стали настолько большими, что у меня кончились пальцы.Однако подправлен модуль для дискет (для тех, кто не знает, это диски размером с нагрудный карман рубашки, емкостью 1,44 Мб).и пальцы ног.
( Повторюсь еще раз - наши релизы не привязаны к каким-то конкретным функциям, поэтому номер новой версии 5.0 означает лишь то, что у меня уже не хватает пальцев на руках и ногах нумеровать версии 4.х.
)
И вот почему: Все дело в слое блоков с несколькими очередями (blk-mq).
В Интернете есть множество вводных статей об этом, так что перейдем сразу к делу.
Процесс перехода на blk-mq начался давно и продвигался медленно.
Появился multi-queue scsi (параметр ядра scsi_mod.use_blk_mq), появились новые планировщики mq-deadline, bfq и так далее.
Кстати, какой твой? Уменьшено количество драйверов блочных устройств, работающих по старинке.[root@fedora-29 sblkdev]# cat /sys/block/sda/queue/scheduler [mq-deadline] none
А в 5.0 функцию blk_init_queue() убрали за ненадобностью.
А теперь старый добрый код lwn.net/Articles/58720 с 2003 года он не только больше не собирается, но и потерял актуальность.
Более того, новые дистрибутивы, которые готовятся к выпуску в этом году, используют уровень блокировки с несколькими очередями в конфигурации по умолчанию.
Например, на 18-м Манджаро ядро хоть и версии 4.19, но по умолчанию blk-mq. Поэтому можно считать, что в ядре 5.0 переход на blk-mq завершен.
И для меня это важное событие, которое потребует переписывания кода и дополнительного тестирования.
Что само по себе сулит появление багов, больших и малых, а также несколько краша серверов (Надо, Федя, надо! (с)).
Кстати, если кто-то думает, что для rhel8 этот переломный момент не наступил, поскольку ядро там «заморозили» с версией 4.18, то вы ошибаетесь.
В новом RC на rhel8 уже перенесены новые возможности из 5.0, а также удалена функция blk_init_queue() (вероятно, при перетаскивании очередного регина с github.com/torvalds/linux в его исходники).
Вообще, «заморозка» версий ядра для таких дистрибьюторов Linux, как SUSE и Red Hat, уже давно стала маркетинговой концепцией.
Система сообщает, что версия например 4.4, но на самом деле функционал от свежей ванили 4.8. При этом на официальном сайте есть надпись типа: «В новой раздаче мы сохранили для вас стабильное ядро 4.4».
Но мы отвлеклись.
Итак, вот оно.
Нам нужен новый простой драйвер блочного устройства, чтобы было понятнее, как оно работает. Итак, источник есть.
Предлагаю обсудить, сделать пул-реквесты, открыть проблему - исправлю.
Я еще не проверял это в QA. Далее в статье я постараюсь описать, что и почему.
Поэтому ниже много кода.
Сразу извиняюсь за не полное соответствие стилю кодирования ядра Linux, и да, goto мне не нравится.
Итак, начнем с точек входа.
static int __init sblkdev_init(void)
{
int ret = SUCCESS;
_sblkdev_major = register_blkdev(_sblkdev_major, _sblkdev_name);
if (_sblkdev_major <= 0){
printk(KERN_WARNING "sblkdev: unable to get major number\n");
return -EBUSY;
}
ret = sblkdev_add_device();
if (ret)
unregister_blkdev(_sblkdev_major, _sblkdev_name);
return ret;
}
static void __exit sblkdev_exit(void)
{
sblkdev_remove_device();
if (_sblkdev_major > 0)
unregister_blkdev(_sblkdev_major, _sblkdev_name);
}
module_init(sblkdev_init);
module_exit(sblkdev_exit);
Очевидно, что при загрузке модуля запускается функция sblkdev_init(), а при выгрузке — sblkdev_exit().
Функция Register_blkdev() регистрирует блочное устройство.
Ему присвоен старший номер.
unregister_blkdev() — освобождает этот номер.
Ключевая структура нашего модуля — sblkdev_device_t. // The internal representation of our device
typedef struct sblkdev_device_s
{
sector_t capacity;
Теги: #разработка Linux #программирование #открытый исходный код #C++ #blk-mq #модуль ядра Linux #драйвер простого блочного устройства #ядро Linux 5.0 #слой блока с несколькими очередями
-
Templatemonster.com. Теперь На Русском
19 Oct, 24 -
Комбинация Modx Revolution + Livestreet
19 Oct, 24 -
Почти Компьютерные Вещи
19 Oct, 24 -
Какой У Вас Среднемесячный Доход?
19 Oct, 24 -
Смотрю «Теорию Большого Взрыва»
19 Oct, 24