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
Архитектура #
Ядро делится на пространство ядра и пространство пользователя.
Пространство ядра через Интерфейс системных вызовов (SCI) позволяется вызывать функции ядра из пространства пользователя.
Вся работа с железом контролируется ядром, основная часть ядра архитектурно-независима, то есть этот код работает на любой архитектуре процессоров.
Специфичный код для работы с железом - архитектуро-зависимый - и либо уже есть в дистрибутиве Linux для определенной архитектуры, либо добавляется с помощью драйверов.
Ресурсы CPU распределяются между процессами планировщиком процессов O(1). Код планировщика может использовать фишки определенной процессорной архитектуры, поэтому как раз код планировщика разделен на архитектурно-независимый и архитектурно-зависимый.
Память аналогично ресурсам CPU контролируется ядром и эта же подсистема управляет подкачкой (swap).
Виртуальная файловая система (VFS) абстрагирует от конкретных файловых систем и через SCI позволяет работать с любыми файловыми система одинаково. Поддержка конкретных файлов систем добавляется через модули ядра.
Сеть контролируется отдельной подсистемой и через все тот же SCI позволяет открывать и работать с сетевыми сокетами разных протоколов.
Если хочется узнать подробнее про подсистемы - есть целая интерактивная карта linux-ядра, из которой можно узнать много нового и интересного - www.makelinux.net/kernel_map
Ну и документацию конечно никто не отменял www.kernel.org/doc/html/latest/
Источники #
- Схема архитектуры и описание из статьи IBM “Анатомия ядра Linux”. В статье чуть подробнее описано как устроено ядро.