CXX95 Telegram 90
#books

Обзор книги "Linux Kernel Development" (2010 г.) 📚👩‍💻

(можно скачать PDF тут, лучше читать оригинал на английском, а не перевод Гоблина)

Автор этой книги писал код для ядра Linux на протяжении 15 лет (на момент написания книги) в качестве основной работы и сделал там много хорошего.

В этой книге на 400+ страниц содержится информация, нужная для начала разработки кода в ядре Линукса, по состоянию на релиз 2.6.34. Объем информации большой - ведь во многих open source проектах достаточно вникать в код всего несколько дней или часов, чтобы туда что-то написать.

В книге описание "как отправить патч" есть только в одной главе в конце, а в остальном информация выглядит так:
1️⃣ Старые песни о главном: как работает fork(), виртуальная страничная память, прерывания, планировщик задач, syscalls, драйвера, и т.д. и т.п.
2️⃣ Копипаст сишной структуры из исходного кода и описание каждого его поля.
3️⃣ Описание разнообразных настроек, которые могут повлиять на каждую сферу работы ядра.
4️⃣ Иногда описание используемой структуры данных (например красно-черных деревьев)

Ядро написано на ISO C99 и активно использует костыли GNU C Extensions. Я отметил самые крутые на мой взгляд особенности разработки ядра, о которых не задумываются в "обычных" проектах:

⭕️ Ядро не использует стандартную библиотеку C. Нужные функции просто скопипасчены. Например, вместо printf используется функция printk. Еще скопипасчены строковые алгоритмы.
⭕️ Почти нет операций с float, потому что для этого требуется ручная работа с float-регистрами процессора.
⭕️ Стек ядра (kernel stack) жестко ограничен - от 4KB до 16KB.
⭕️ Самый часто используемый инструмент синхронизации - спинлок, с "активным" ожиданием разблокировки в while-цикле. Он обусловлен тем, что в ядре всё происходит сравнительно быстро и дожидаться разблокировки в цикле выходит "дешевле", чем делать всю байду с укладыванием процесса в "сон" и его "пробуждение".
⭕️ Для аллокации страничной памяти есть vmalloc - аллоцирует виртуально непрерывную память, и kmalloc - аллоцирует физически непрерывную память. "Обычные" программы практически всегда используют vmalloc, но ядро практически всегда использует kmalloc для быстроты, чтобы не возиться со структурами виртуальной памяти. Тред на stackoverflow
⭕️ Часто используются "аллокаторы маленьких объектов". Например, slab 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 невозможно, по каждой части можно писать отдельную книгу 📝
Please open Telegram to view this post
VIEW IN TELEGRAM



tgoop.com/cxx95/90
Create:
Last Update:

#books

Обзор книги "Linux Kernel Development" (2010 г.) 📚👩‍💻

(можно скачать PDF тут, лучше читать оригинал на английском, а не перевод Гоблина)

Автор этой книги писал код для ядра Linux на протяжении 15 лет (на момент написания книги) в качестве основной работы и сделал там много хорошего.

В этой книге на 400+ страниц содержится информация, нужная для начала разработки кода в ядре Линукса, по состоянию на релиз 2.6.34. Объем информации большой - ведь во многих open source проектах достаточно вникать в код всего несколько дней или часов, чтобы туда что-то написать.

В книге описание "как отправить патч" есть только в одной главе в конце, а в остальном информация выглядит так:
1️⃣ Старые песни о главном: как работает fork(), виртуальная страничная память, прерывания, планировщик задач, syscalls, драйвера, и т.д. и т.п.
2️⃣ Копипаст сишной структуры из исходного кода и описание каждого его поля.
3️⃣ Описание разнообразных настроек, которые могут повлиять на каждую сферу работы ядра.
4️⃣ Иногда описание используемой структуры данных (например красно-черных деревьев)

Ядро написано на ISO C99 и активно использует костыли GNU C Extensions. Я отметил самые крутые на мой взгляд особенности разработки ядра, о которых не задумываются в "обычных" проектах:

⭕️ Ядро не использует стандартную библиотеку C. Нужные функции просто скопипасчены. Например, вместо printf используется функция printk. Еще скопипасчены строковые алгоритмы.
⭕️ Почти нет операций с float, потому что для этого требуется ручная работа с float-регистрами процессора.
⭕️ Стек ядра (kernel stack) жестко ограничен - от 4KB до 16KB.
⭕️ Самый часто используемый инструмент синхронизации - спинлок, с "активным" ожиданием разблокировки в while-цикле. Он обусловлен тем, что в ядре всё происходит сравнительно быстро и дожидаться разблокировки в цикле выходит "дешевле", чем делать всю байду с укладыванием процесса в "сон" и его "пробуждение".
⭕️ Для аллокации страничной памяти есть vmalloc - аллоцирует виртуально непрерывную память, и kmalloc - аллоцирует физически непрерывную память. "Обычные" программы практически всегда используют vmalloc, но ядро практически всегда использует kmalloc для быстроты, чтобы не возиться со структурами виртуальной памяти. Тред на stackoverflow
⭕️ Часто используются "аллокаторы маленьких объектов". Например, slab 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 невозможно, по каждой части можно писать отдельную книгу 📝

BY C++95


Share with your friend now:
tgoop.com/cxx95/90

View MORE
Open in Telegram


Telegram News

Date: |

When choosing the right name for your Telegram channel, use the language of your target audience. The name must sum up the essence of your channel in 1-3 words. If you’re planning to expand your Telegram audience, it makes sense to incorporate keywords into your name. As the broader market downturn continues, yelling online has become the crypto trader’s latest coping mechanism after the rise of Goblintown Ethereum NFTs at the end of May and beginning of June, where holders made incoherent groaning sounds and role-played as urine-loving goblin creatures in late-night Twitter Spaces. Deputy District Judge Peter Hui sentenced computer technician Ng Man-ho on Thursday, a month after the 27-year-old, who ran a Telegram group called SUCK Channel, was found guilty of seven charges of conspiring to incite others to commit illegal acts during the 2019 extradition bill protests and subsequent months. Users are more open to new information on workdays rather than weekends. Content is editable within two days of publishing
from us


Telegram C++95
FROM American