Linux First: Кратко о linux-ядре

linux linux-first kernel

Этим постом начинаю серию статей “Linux First” - разбираюсь как устроен и как работает linux с начала загрузки ядра и дальше про подсистемы, сеть, процессы и многое другое.

Cписок статей серии можно найти по тэгу linux-first

Сегодня немного про историю и в общем про архитектуру.

История

В августе 1991 года Линус Торвальдс написал в новостную ленту “minix” сообщение о том что он разрабатывает свободную операционую систему и хочет получить фидбэк от заинтересованных людей.

В сентябре Линус опубликовал версию 0.01. Этот исторический код можно посмотреть на github.

Особо сентиментальные ребята запилили образы для Qemu, в которых запускаются первые версии ядра и можно даже вызывать “доисторические” команды ls без хэлпов и прочих прелестей современных unix-команд.

К проекту сразу появился интерес и совместными усилиями Линуса и коммьюнити linux-ядро начало развиваться.

Через 3 года в 1994 выходит первая версия.

Ядро изначально проектировалось как монолитное и переносимое на разные процессорные архитектуры. Собственно из-за аритектуры в 1992 в группе обсуждения minix разгорелся холивар “монолит-ядро vs микро-ядрo” между Линусом Торвальдсом и Эндрю Таненбаумом (почти как и сейчас про монолит vs микросервисы).

Основной посыл холивара был в том что монолитное ядро устарело уже в 1992 году, а микроядра рулят и за ними будущее, но как показала история, даже 26 лет спустя монолитное ядро все еще живо и продолжает развиваться.

Текущая версия доросла до 5.6 (май 2020) и код начиная с 2.6 можно смотреть на оф сайте или на github-зеркале torvalds/linux

Архитектура

Cхема из статьи IBM "Анатомия ядра Linux"

Ядро делится на пространство ядра и пространство пользователя.

Пространство ядра через Интерфейс системных вызовов (SCI) позволяется вызывать функции ядра из пространства пользователя.

Вся работа с железом контролируется ядром, основная часть ядра архитектурно-независима, то есть этот код работает на любой архитектуре процессоров.

Специфичный код для работы с железом - архитектуро-зависимый - и либо уже есть в дистрибутиве Linux для определенной архитектуры, либо добавляется с помощью драйверов.

Ресурсы CPU распределяются между процессами планировщиком процессов O(1). Код планировщика может использовать фишки определенной процессорной архитектуры, поэтому как раз код планировщика разделен на архитектурно-независимый и архитектурно-зависимый.

Память аналогично ресурсам CPU контролируется ядром и эта же подсистема управляет подкачкой (swap).

Виртуальная файловая система (VFS) абстрагирует от конкретных файловых систем и через SCI позволяет работать с любыми файловыми система одинаково. Поддержка конкретных файлов систем добавляется через модули ядра.

Сеть контролируется отдельной подсистемой и через все тот же SCI позволяет открывать и работать с сетевыми сокетами разных протоколов.

Если хочется узнать подробнее про подсистемы - есть целая интерактивная карта linux-ядра, из которой можно узнать много нового и интересного - www.makelinux.net/kernel_map

Ну и документацию конечно никто не отменял www.kernel.org/doc/html/latest/

Источники


Все статьи серии “Linux First”