Что такое монолитное ядро?
Монолитное ядро - это архитектура операционной системы, при которой ядро системы является единым целым и работает в одном адресном пространстве. Все основные компоненты системы, такие как драйверы устройств, файловая система, управление памятью и прочее, интегрированы непосредственно в ядро и выполняются в режиме ядра, то есть с максимальными привилегиями.
Это противоположно микроядерной архитектуре, где эти компоненты выполняются отдельно как пользовательские процессы. Примерами операционных систем с монолитным ядром являются: Linux, Windows и macOS.
#kernel #theory
Монолитное ядро - это архитектура операционной системы, при которой ядро системы является единым целым и работает в одном адресном пространстве. Все основные компоненты системы, такие как драйверы устройств, файловая система, управление памятью и прочее, интегрированы непосредственно в ядро и выполняются в режиме ядра, то есть с максимальными привилегиями.
Это противоположно микроядерной архитектуре, где эти компоненты выполняются отдельно как пользовательские процессы. Примерами операционных систем с монолитным ядром являются: Linux, Windows и macOS.
#kernel #theory
Что такое linux-headers?
Это заголовочные файлы, являющиеся частью исходного кода ядра. Они содержат описания внешних интерфейсов, структур данных и макросов. Эти файлы необходимы для сборки модулей ядра, обеспечивая актуальность данных для бинарной совместимости.
Пользовательские программы обращаются к
Модули ядра обращаются к
#kernel #theory
Это заголовочные файлы, являющиеся частью исходного кода ядра. Они содержат описания внешних интерфейсов, структур данных и макросов. Эти файлы необходимы для сборки модулей ядра, обеспечивая актуальность данных для бинарной совместимости.
Пользовательские программы обращаются к
/usr/include заголовкам.Модули ядра обращаются к
/usr/src/linux-headers-$(uname -r) заголовкам.#kernel #theory
Встроенные и загружаемые модули ядра
Встроенные модули - это те, которые встроены в ядро на этапе его сборки.
Загружаемые модули - обычно от сторонних поставщиков, могут существовать только отдельно и загружаться в память на этапе исполнения.
Показывает загружаемые модули:
Показывает встроенные модули:
Показывает как встроенные так и загружаемые модули:
Встроенные модули отмечаются как: CONFIG_SCSI=y (встроенная в ядро функциональность), а загружаемые как CONFIG_SCSI=m (отдельные .ko файлы, которые запускает
CONFIG_SCSI взят для примера.
Некоторые модули не видны в выводе
#kernel #utils
Встроенные модули - это те, которые встроены в ядро на этапе его сборки.
Загружаемые модули - обычно от сторонних поставщиков, могут существовать только отдельно и загружаться в память на этапе исполнения.
Показывает загружаемые модули:
$ lsmod
Показывает встроенные модули:
$ cat /lib/modules/$(uname -r)/modules.builtin
Показывает как встроенные так и загружаемые модули:
$ ls /sys/module
Встроенные модули отмечаются как: CONFIG_SCSI=y (встроенная в ядро функциональность), а загружаемые как CONFIG_SCSI=m (отдельные .ko файлы, которые запускает
kmod при необходимости).CONFIG_SCSI взят для примера.
Некоторые модули не видны в выводе
lsmod, но видны в modinfo потому что они являются (builtin). #kernel #utils
Замена системных вызовов с помощью модулей ядра
Из книги https://tldp.org/LDP/lkmpg/2.6/lkmpg.pdf:
You can even write modules to replace the kernel's system calls, which we'll do shortly. Crackers often make use of this sort of thing for backdoors or trojans, but you can write your own modules to do more benign things, like have the kernel write Tee hee, that tickles! everytime someone tries to delete a file on your system.
Другими словами: существует возможность создания модулей для ядра операционной системы, которые могут заменять системные вызовы. Это может использоваться как злоумышленниками для создания бэкдоров и троянов, так и для более безобидных задач, таких как добавление пользовательского сообщения при попытке удаления файла.
#kernel #books
Из книги https://tldp.org/LDP/lkmpg/2.6/lkmpg.pdf:
You can even write modules to replace the kernel's system calls, which we'll do shortly. Crackers often make use of this sort of thing for backdoors or trojans, but you can write your own modules to do more benign things, like have the kernel write Tee hee, that tickles! everytime someone tries to delete a file on your system.
Другими словами: существует возможность создания модулей для ядра операционной системы, которые могут заменять системные вызовы. Это может использоваться как злоумышленниками для создания бэкдоров и троянов, так и для более безобидных задач, таких как добавление пользовательского сообщения при попытке удаления файла.
#kernel #books
Что такое GRUB?
GRUB (GRand Unified Bootloader) в основном предназначен для загрузки операционной системы. Он управляет процессом загрузки, позволяя пользователю выбрать операционную систему или ядро, которое он хочет загрузить, и затем передает управление этому выбранному ядру.
Основная функция загрузчика Linux включает в себя возможность выполнять следующие задачи:
* выбирать одно из нескольких ядер;
* переключаться между наборами параметров ядра;
* разрешить пользователю вручную переопределять и редактировать имена и параметры образов ядра;
* обеспечить поддержку загрузки других операционных систем;
Файл конфигурации GRUB, который отображается при нажатии кнопки
2. Процесс выключения (или перезагрузки) управляется самим операционным ядром (kernel) и операционной системой, которые выполняют последовательность действий для корректного завершения всех процессов, демонтирования файловых систем и отключения питания.
Таким образом, когда вы выключаете систему, GRUB не играет никакой роли. Его задача завершается после того, как операционная система была успешно загружена.
#kernel #theory
GRUB (GRand Unified Bootloader) в основном предназначен для загрузки операционной системы. Он управляет процессом загрузки, позволяя пользователю выбрать операционную систему или ядро, которое он хочет загрузить, и затем передает управление этому выбранному ядру.
Основная функция загрузчика Linux включает в себя возможность выполнять следующие задачи:
* выбирать одно из нескольких ядер;
* переключаться между наборами параметров ядра;
* разрешить пользователю вручную переопределять и редактировать имена и параметры образов ядра;
* обеспечить поддержку загрузки других операционных систем;
Файл конфигурации GRUB, который отображается при нажатии кнопки
e в меню GRUB, можно прочитать в файле /boot/grub/grub.cfg на диске. Однако, не рекомендуется редактировать этот файл напрямую, так как он обычно генерируется автоматически с помощью команды update-grub, которая использует шаблоны и настройки из /etc/default/grub и скриптов в /etc/grub.d/
1. GRUB не участвует в процессе выключения. Его роль ограничивается начальной фазой загрузки системы.2. Процесс выключения (или перезагрузки) управляется самим операционным ядром (kernel) и операционной системой, которые выполняют последовательность действий для корректного завершения всех процессов, демонтирования файловых систем и отключения питания.
Таким образом, когда вы выключаете систему, GRUB не играет никакой роли. Его задача завершается после того, как операционная система была успешно загружена.
#kernel #theory
Что такое Аудит и для чего он нужен?
Нужен для отслеживания критичных с точки зрения безопасности системных событий:
* запуск и завершение работы системы;
* чтение, запись и изменение прав доступа к файлам;
* инициация сетевых соединений;
* попытки неудачной авторизации в системе;
* изменение сетевых настроек;
* изменение информации о пользователях и группах;
* запуск и остановка приложений;
* выполнение системных вызовов;
Ни одно из названных событий не может произойти без использования системных вызовов ядра. Чтобы их отслеживать, достаточно просто перехватывать соответствующие системные вызовы. Именно это и делает подсистема аудита. Когда я работал системным программистом, то часто приходилось взаимодействовать с аудитом (для отладки).
Конфигурация:
После
События 1000 пользователя:
Поиск событий по коду выхода:
Искать события open:
Номера всех системных вызовов:
#kernel #security #utils
Нужен для отслеживания критичных с точки зрения безопасности системных событий:
* запуск и завершение работы системы;
* чтение, запись и изменение прав доступа к файлам;
* инициация сетевых соединений;
* попытки неудачной авторизации в системе;
* изменение сетевых настроек;
* изменение информации о пользователях и группах;
* запуск и остановка приложений;
* выполнение системных вызовов;
Ни одно из названных событий не может произойти без использования системных вызовов ядра. Чтобы их отслеживать, достаточно просто перехватывать соответствующие системные вызовы. Именно это и делает подсистема аудита. Когда я работал системным программистом, то часто приходилось взаимодействовать с аудитом (для отладки).
$ apt-get install -y auditd
$ systemctl status auditd
Конфигурация:
/etc/audit/auditd.conf
Выполнить программу и отследить ее события (работает наподобие strace):$ autrace <path-to-program>
После
autrace:$ ausearch -i -p <pid>
События 1000 пользователя:
$ ausearch -ui 1000
Поиск событий по коду выхода:
$ ausearch -i -e -13
Искать события open:
$ ausearch -ui 1000 -sc open
Номера всех системных вызовов:
$ ausyscall --dump
#kernel #security #utils
Kernel panic - это критическая ошибка в операционной системе, когда система не может продолжать работу из-за серьезных проблем. Часто это связано с аппаратными сбоями, такими как неисправность оперативной памяти, процессора. Также это может быть вызвано невозможностью найти и смонтировать корневую файловую систему, запуском некорректных драйверов или ошибок в процессе инициализации (initramfs). Система может пытаться использовать несуществующие ресурсы, что приводит к этому состоянию.
#kernel #theory
#kernel #theory
——— НАВИГАЦИЯ ———
Git: #git
Жвачка: #fun
Ядро: #kernel
Разное: #misc
ПО: #software
Игры: #games
Книги: #books
Люди: #people
Сборка: #build
Утилиты: #utils
Python: #python
Теория: #theory
Debian: #debian
Новости: #news
Оболочка: #shell
Память: #memory
СПО: #opensource
Терминал: #terminal
Мои мысли: #thoughts
Безопасность: #security
Информация канала: #info
Конфигурационные файлы: #dotfiles
Кто я: https://xn--r1a.website/krxnotes/246
Откуда берется информация: https://xn--r1a.website/krxnotes/500
Поддержать канал:
Git: #git
Жвачка: #fun
Ядро: #kernel
Разное: #misc
ПО: #software
Игры: #games
Книги: #books
Люди: #people
Сборка: #build
Утилиты: #utils
Python: #python
Теория: #theory
Debian: #debian
Новости: #news
Оболочка: #shell
Память: #memory
СПО: #opensource
Терминал: #terminal
Мои мысли: #thoughts
Безопасность: #security
Информация канала: #info
Конфигурационные файлы: #dotfiles
Кто я: https://xn--r1a.website/krxnotes/246
Откуда берется информация: https://xn--r1a.website/krxnotes/500
Поддержать канал:
2202 2036 6907 4603
Спасибо, что читаете!Кризис в продвижении Rust в ядро из-за опасений усложнения сопровождения
Оказывается не всё так просто как хотелось, война между С и Rust, а точнее между инженерами, которые продвигают разные подходы. Кто же победит?
https://www.opennet.ru/opennews/art.shtml?num=62685
#kernel #news
Оказывается не всё так просто как хотелось, война между С и Rust, а точнее между инженерами, которые продвигают разные подходы. Кто же победит?
https://www.opennet.ru/opennews/art.shtml?num=62685
#kernel #news
Библиотечные функции и системные вызовы
Библиотечные функции - верхний уровень, работает в пространстве пользователя, обеспечивает более удобный интерфейс к функциям, которые выполняют работу (системным вызовам). То есть библиотечные функции обращаются к системным вызовам.
Системные вызовы - работают в привилегированном режиме от имени ядра и предоставляются самим ядром. Например, библиотечная функция printf() формирует строку, в соответствии с заданным форматом, и передает ее низкоуровневому системному вызову write(), который и выводит строку на устройство стандартного вывода.
Цепочка: Программа обращается к библиотечным функциям, находясь в пользовательском режиме. Затем библиотечная функция обращается к системным вызовам. Системные вызовы уже работают в режиме привилегированном (являются частью ядра). Затем когда системный вызов завершает работу, он возвращает управление библиотечной функции и происходит обратный переход в пользовательский режим.
Unix производит переключение из пространства пользователя в пространство ядра всякий раз, когда приложение делает системный вызов или приостанавливается аппаратным прерыванием. Например, код модуля исполняется в пространстве ядра, а обычная программа, исполняется в пространстве пользователя (прикладное ПО).
#kernel #theory
Библиотечные функции - верхний уровень, работает в пространстве пользователя, обеспечивает более удобный интерфейс к функциям, которые выполняют работу (системным вызовам). То есть библиотечные функции обращаются к системным вызовам.
Системные вызовы - работают в привилегированном режиме от имени ядра и предоставляются самим ядром. Например, библиотечная функция printf() формирует строку, в соответствии с заданным форматом, и передает ее низкоуровневому системному вызову write(), который и выводит строку на устройство стандартного вывода.
Цепочка: Программа обращается к библиотечным функциям, находясь в пользовательском режиме. Затем библиотечная функция обращается к системным вызовам. Системные вызовы уже работают в режиме привилегированном (являются частью ядра). Затем когда системный вызов завершает работу, он возвращает управление библиотечной функции и происходит обратный переход в пользовательский режим.
Unix производит переключение из пространства пользователя в пространство ядра всякий раз, когда приложение делает системный вызов или приостанавливается аппаратным прерыванием. Например, код модуля исполняется в пространстве ядра, а обычная программа, исполняется в пространстве пользователя (прикладное ПО).
#kernel #theory