tgoop.com/cxx95/90
Last Update:
#books
Обзор книги "Linux Kernel Development" (2010 г.) 📚
(можно скачать PDF тут, лучше читать оригинал на английском, а не перевод Гоблина)
Автор этой книги писал код для ядра Linux на протяжении 15 лет (на момент написания книги) в качестве основной работы и сделал там много хорошего.
В этой книге на 400+ страниц содержится информация, нужная для начала разработки кода в ядре Линукса, по состоянию на релиз 2.6.34. Объем информации большой - ведь во многих open source проектах достаточно вникать в код всего несколько дней или часов, чтобы туда что-то написать.
В книге описание "как отправить патч" есть только в одной главе в конце, а в остальном информация выглядит так:fork()
, виртуальная страничная память, прерывания, планировщик задач, syscalls, драйвера, и т.д. и т.п.
Ядро написано на ISO C99 и активно использует костыли GNU C Extensions. Я отметил самые крутые на мой взгляд особенности разработки ядра, о которых не задумываются в "обычных" проектах:printf
используется функция printk
. Еще скопипасчены строковые алгоритмы.vmalloc
- аллоцирует виртуально непрерывную память, и kmalloc
- аллоцирует физически непрерывную память. "Обычные" программы практически всегда используют vmalloc
, но ядро практически всегда использует kmalloc
для быстроты, чтобы не возиться со структурами виртуальной памяти. Тред на stackoverflowslab allocator
очень напомнил мне блоковый аллокатор из Box2D (хотя я не большой специалист в аллокаторах).gdb
не работает нормально, он не может никак модифицировать данные ядра, ставить breakpoint-ы и выполнять код step by step. В книге приводится какая-то укуренная схема с костылем kgdb
, где используется два компьютера, и один компьютер дебажит ядро второго через шнур.
После этой книги я понял, насколько Linux огромен. Можно сказать, что эта книга "обо всем и ни о чем". Если можно сказать, что компилятор для C++ это "четкая цель", то ядро Linux это "нечеткая цель" - его можно собрать в миллиарде разных конфигураций.
Например: В описании обработчиков прерываний (interrupt handlers - грубо говоря обработка событий типа "ввод с клавиатуры") мы узнаем, что обработчик должен быть мега-быстрым, потому что пока обрабатывается одно прерывание, все остальные прерывания идут лесом.
Поэтому обработка прерывания разделена на две части - "top half"
в interrupt handler (очень быстро сделать вещи, скажем поставить флаг где-то в ядре), и "bottom half"
когда-то потом (копировать данные, менять структуры в ядре, блокировать поток и тд и тп).
Так вот, для обработки части "bottom half"
по состоянию на 2010 год было 5 механизмов - 2 устаревших и 3 активных
И так во всем - везде будет огромное количество опций.
По состоянию на 2010 год официально поддерживалось 60 файловых систем.
Есть целые классы алгоритмов для планировщика процессов.
Несколько методов управления I/O Scheduling (ввод-вывод с жестким диском).
Есть море драйверов, которые можно вкомпилировать в образ ядра по желанию.
Полностью "выучить" Linux невозможно, по каждой части можно писать отдельную книгу