Состоящее почти из 20 миллионов строк кода ядро Linux является одним из самых крупных Opensource проектов в мире.
Содержание
Что такое ядро
Ядро представляет собой нижний уровень программного обеспечения, которое взаимодействует с оборудованием компьютера. Оно отвечает за взаимодействие всех приложений, которые работают в т.н. “пользовательском режиме” с физическим оборудованием и позволяет процессам передавать информацию друг другу с помощью inter-process communication (IPC).
Типы ядер
Имеется три основных типа ядер – монолитные (monolithic), микроядра (microkernel) и гибридные (hybrid).
К примеру Linux является монолитным ядром, тогда как OS X и Windows используют гибридные ядра.
Microkernel
Микроядра занимаются управлением только CPU, памятью и IPC. Практически все остальное в компьютере может рассматриваться как дополнительное оборудование и может обслуживаться в пользовательском режиме. Микроядра имеют большую переносимость, т.к. вам не приходиться беспокоиться если вы задумали сменить видеокарту или даже всю операционную систему – если новая ОС работает с оборудованием так же, как и предыдущее. Микроядра так же требуют меньше дискового простанства и RAM. Кроме того – они могут считаться более безопасными в силу того, что большая часть процессов работает в режиме пользователя и не имеет доступа к критически важным частям ситемы.
Плюсы
- переносимость
- меньший размер занимаемой RAM и на жестком диске
- безопасность
Минусы
- в целом система может работать медленнее из-за дополнительных слоев программной абстракции между ядром и оборудованием
- процессы могут тратить время на ожидание в очереди для получения информации
Monolithic ядра
Монолитные ядра являются противоположностью микроядрам, так как охватывают не только управление процессором, памятью и IPC – но так же включают в себя драйвера устройсв, управление файловыми системами и системными вызовами. Монолитные ядра имеют преимущество в скорости доступа к оборудованию и работе в многозадачном режиме, так как если программе требуется получить информацию из памяти или от другого процесса – она может получить его напрямую и не тратить время в очереди на ожидание ответа. С другой стороны это вызывает и определенные сложности, так как большее количество процессов работает в режиме ядра, что может привести к краху всей системы из-за проблем с одним из них.
Плюсы
- более быстрый доступ процессов к оборудованию
- проще связь между самими процессами
- проще реализация поддержки оборудования без необходимости установки дополнительных драйверов
- процессы взаимодействуют быстрее, так как не требуется ожидание в очереди
Минусы
- больший объем занимаемой памяти и жесткого диска
- больше проблем с безопасностью
Гибридные ядра
Гибридные ядра ядра могут сами определять – какую часть выполнять в режиме пользователя, а какую – в режиме ядра. Как правило – в режиме пользователя работают драйвера устройств и системы ввода-вывода, тогда как системные вызовы обслуживаются в режиме ядра. Этот подход сочетает в себе преимущества как монолитных, так и микроядер – однако и требует больше внимания со стороны производителей оборудования, так как работа драйверов зависят от них. Кроме того – этот подход может иметь некоторые проблемы быстродействия, унаследованные от микроядерной архитектуры.
Плюсы
- разработчик может выбирать что запускать в режиме ядра – а что в режиме пользователя
- меньший размер по сравнению с монолитными ядрами
- более гибкое, чем другие типы
Минусы
- возможны недостатки в производительности
- установка драйверов устройств зависит от пользователя и производителя оборудования
Файлы ядра Linux
В большинстве GNU/Linux-систем файлы ядра располагаются в каталоге /boot
, например CentOS 6:
# ls -l /boot/ | grep linu -rwxr-xr-x 1 root root 4221232 Dec 15 23:48 vmlinuz-2.6.32-573.12.1.el6.x86_64 -rwxr-xr-x 1 root root 4221968 Feb 10 01:15 vmlinuz-2.6.32-573.18.1.el6.x86_64 -rwxr-xr-x 1 root root 4221776 Aug 14 2015 vmlinuz-2.6.32-573.3.1.el6.x86_64 -rwxr-xr-x 1 root root 4220144 Sep 23 01:29 vmlinuz-2.6.32-573.7.1.el6.x86_64 -rwxr-xr-x 1 root root 4220368 Nov 10 20:31 vmlinuz-2.6.32-573.8.1.el6.x86_64
Файл с vmlinuz
в имени и есть файл ядра. Имя vmlinuz
пришло из мира UNIX, в котором c 60-годов файл ядра назывался просто unix
. Когда Linus Torvalds начал разработку Linux в 90-х – он назвал его просто linux
.
Когда появилась реализация виртуальной памяти – к имени linux
была добавлена приставка “vm
” (virtual memory). Так какое-то время файл ядра назывался просто vmlinux
, однако рамзер файла постоянно увеличивался и со временем его стали сжимать а последняя буква в имени была заменена c x
на z
(zlib compression). Ядро так же зачастую сжимается с помощью LZMA или BZIP2 и некоторые ядра называются просто zImage
.
В каталоге /boot
так же находятся файлы initrd.img-version
(или initramfs-version
), System.map-version
и config-version
. Файл initrd.img-version
используется для первоначальной загрузки системы, во время которой распаковывается и загружается само ядро. Файл System.map
используется для управления памятью перед загрузкой смого ядра, а файл config
содержит в себе параметры ядра и список модулей для загрузки в ядро во время его компиляции.
Архитектура ядра Linux
Так как ядро Linux является монолитным – оно является самым большим и сложным по сравнению с другими типами ядер. Что бы нивелировать эти недостатки – разработчики ядра добавили возможность работы ядра с модулями, которые могут быть загружены в него во время работы без необходимости перезагрузки всей системы.
Модули ядра Linux
Что если бы Windows изначально содержило в себе все необходимые драйвера, и все что требовалось бы от пользователя – это просто включить некоторые из них?
Именно так и работают модули Linux, которые так же называют Loadable Kernel Module (LKM) и которые жизненно необходимы для того, что бы ядро имело возможность взаимодейтсвовать со всем оборудованием компьютера и при этом не занимать всю его память.
Как правило – модули расширяют возможности ядра для работы с устройствами, файловыми системами и системными вызовами. LKM имеют рсширение файлов .ko
:
# find /lib/modules/2.6.32-573.18.1.el6.x86_64/kernel/ -name "*.ko" -type f | wc -l 2033
Благодаря модульной структуре – вы можете настраивать ядро под себя, выбирая только необходимые модули в menuconfig
, отредактировав файл /boot/config*
или загружая и выгружая модули прямо во время работы с помощью утилит типа modprobe
, insmod
и rmmod
.
Ядро не является чем-то волшебным, но является жизненно необходимым для работы любого компьютера. Ядро Linux отличается от ядер в Windows или OS X системах, так как включает в себя драйвера на уровне ядра системы и поддерживает многие возможности “из коробки”.
Оригинал тут>>>.
Ссылки по теме
Linux: LKM – Linux Kernel Module, модули ядра Linux