Архитектура ОС GNU/Linux
В этой статье вы прочитаете про архитектура ОС Linux, думаю будет очень интересно и полезно.
Также посмотрите статью «Лучшие книги для изучения Linux», там вы найдёте ещё книги для изучения Linux.
Архитектура ОС GNU/Linux:
Для того что бы понять GNU/Linux нужно разобраться с его архитектурой для этого вспомним что же такое операционная система (сокращенно ОС). ОС – это системная программа, которая выступает в качестве посредника между пользователем и аппаратурой компьютера. ОС – это системная программа, которая выступает в качестве посредника между прикладными программами и аппаратурой компьютера.
Для простоты условно разделим архитектуру на 3 части: двух уровневая (простая), структурная (схематическая, с основными компонентами системы) и полная схема ядра (объединение всех частей ядра в единую схему). Постепенно разберемся с каждой из них и будем углублять знания о GNU/Linux. И в конце сравним архитектуры Windows и Linux.
- Двухуровневая архитектура;
- Структурная архитектура;
- Сравнение Windows и GNU/Linux;
- Полная схема ядра Linux;
Двух уровневая архитектура:
Архитектура любой ОС может быть разделена структурно на 2 части это ядро (Kernel) и программы (Applications). Applications+Kernel это ОС. Ядро (Kernel) – это центр ОС.
Оно обеспечивает доступ программы к оборудованию компьютера, такого как оперативная память, процессорное время, жесткие диски, видеокарта и т.д.
Программы (Applications) – это разные утилиты, сервисы, прикладные программы и т.д. Из 2-х уровневой архитектуры, можно сделать вывод: ничего особенного.
Схематически так можно изобразить любую операционную систему. Windows, Dos, Unix, MAC ОС и другие. Попробуем разобраться детальней.
Программное обеспечение в GNU/Linux взято из проекта Ричарда Столлмэна GNU — то самое свободное программное обеспечение (open source). Ядро, которое использует GNU/Linux, то самое ядро Linux, написанное Линусом Торвальдсом.
Ядро любой ОС можно классифицировать как: монолитное ядро, модульное ядро, микроядро, экзо-ядро, нано-ядро, гибридное ядро. В ОС GNU/Linux используется монолитное ядро.
Монолитное ядро – изображено на рисунке и состоит из ядра (kernel) и модулей (modules). Части ядра – называют модулями.
При этом модуль ядра — это часть ядра, то есть модуль не является полноценной, независимой программой, а является частью одной большой программы, которая называется ядро ОС.
Все модули используют единое адресное пространство оперативной памяти, одни и те же данные. Иными словами, любой модуль может обратиться к данным которые использует другой модуль, так и к ОП другого модуля.
Как вывод крах одного модуля может повлечь за собой крах другого модуля или всей системы. К примеру, в случае если модуль некорректно изменит общие данные, то это может привести к ошибке в другом модуле и возможно к ошибке во всем ядре.
В архитектуре монолитного ядра есть свои плюсы и минусы. Плюсы заключаются в том, что разрабатывать отдельные модули ядра очень просто, и работает такое ядро очень быстро.
Минусом является то, что ошибка в работе любого модуля, может приведет к краху всей системы.
Старые ядра Linux требовали перекомпиляции ядра (то есть созданию нового ядра) при использовании нового оборудования.
То есть если возникала необходимость добавить новый модуль в ядро, то приходилось целиком пересобрать ядро. Новые ядра Linux могут на ходу подгружать модули. Такие модули часто называют динамическими.
Структурная схема ядра:
Посмотрим на архитектуру GNU/Linux немного детальней. Архитектура разбита на 3 функциональных уровня: уровень пользователя, уровень ядра и уровень аппаратуры.
Уровень пользователя — это то, что до этого момента мы называли: программы (Applications). На этом уровне работают разные программы, службы, системные утилиты и т.д.
Уровень ядра – тут находится само ядро ОС.
Уровень аппаратуры — тут находятся разные устройства таки как оперативная память, процессор, жесткие диски, видеокарта и т.д.
В уровне пользователя есть программное обеспечение (пользовательские приложения), которое может работать напрямую с ядром, либо посредством специальных системных библиотек (к примеру: glibc).
В пространстве ядра есть “обращение к операционной системе”, это посредник между программами и ядром. (Executive Services), который принимает данные от программ и передает их ядру системы, а ядро непосредственно работает с оборудованием.
Как видно из схемы после “обращения к операционной системе”, есть всего два варианта развития дальнейших событий.
Обращаться можно только к “подсистема управления файлами” либо к “подсистема управления процессами”. “Подсистема управления файлами” – управляет всем: вводом/выводом, устройствами и т.д. “Подсистема управления процессами” – управляет процессорным временем, ОП, процессами и т.д. “Подсистема управления процессами” позволяет процессам обмениваться данными друг с другом с помощью специальных процедур, которые называют каналы. “Подсистема управления файлами” и “подсистема управления процессами” могут между собой взаимодействовать.
Именно “Подсистема управления файлами” ( файловая система) и “подсистема управления процессами”( управления процессами) — две основных компоненты ядра. “Подсистема управления файлами” формирует нужного синтаксиса данные и отправляет их “Драйверу устройства”. “Подсистема управления файлами” может передавать символы или блоки данных. Стоит отметить, что Linux изначально разрабатывался под девизом: «Пишите программы, которые бы поддерживали текстовые потоки, поскольку это универсальный интерфейс» (Дуг МакИлрой, изобретатель каналов UNIX).
Именно поэтому Подсистема управления файлами связана с драйверами напрямую не битовыми потоками, а символьными.
Подсистема управления файлами разрабатывалась с возможностью отобразить все что есть в системе: устройства (жесткий диск, принтеры и т.д.), процессы, и т.д. Как видно из схемы, именно на файловую систему ложится задача передавать данные устройствам. Именно здесь, в файловой системе, каждое устройство представляется в виде отдельного специального файла, что позволяет легко и просто обращаться к любому устройству.
Для связи с жестким диском процесс использует файл “/dev/hdа”. Который в свою очередь связывается с драйвером жесткого диска. Драйвер жесткого диска уже непосредственно обращается к жесткому диску и производит чтение или запись. Еще несколько примеров.
Например: принтер – это специальный файл, и все что будет скопировано в этот файл — будет распечатано.
Например: сетевой адаптер – это специальный файл, и все что будет скопировано в этот файл, будет передано по сети. Например: терминал (консоль пользователя) – это специальный файл, и все что в него будет записано, будет выведено на экране терминала (консоль пользователя).
Вывод:
В этой статье вы прочитали про архитектура ОС Linux, думаю вам было вполне интересно и вы многое узнали.
Linux First: Кратко о linux-ядре
Этим постом начинаю серию статей “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