Являются ли модули ядра специфичными для Linux или это общий механизм?

Являются ли модули ядра специфичными для Linux или это общий механизм?

Я прочитал в книге Таненбаума об операционных системах, что существуют кольца защиты, и кольцо 0 принадлежит ядру. Можно ли вообще сказать, что «модули ядра управляют вводом-выводом и управлением памятью кольца 0» или «модуль ядра» специфичен для Linux и не применим, например, для OpenBSD и MULTICS?

решение1

Идеи, представленные Эндрю Таненбаумом, обычно не применимы напрямую к Linux (или любому традиционному монолитному ядру Unix). Ответ на ваш вопрос гораздо проще, чем вы предполагаете: модуль ядра Linux — это код ядра, который был скомпилирован и скомпонован в отдельный файл, а не был скомпонован в образ ядра. Этот отдельный объектный файл ядра (.ko) может быть загружен в адресное пространство ядра по требованию во время выполнения. Практически все драйверы, которые могут быть скомпилированы как модули ядра, также могут быть статически скомпонованы в образ ядра без какой-либо разницы в функциональности после загрузки кода.

Код модуля — это код ядра, и он работает с той же привилегией, что и весь остальной код ядра. Модуль ядра в принципе может заменить любой код ядра, но чтобы сделать это чисто, само ядро ​​должно предоставить механизм, к которому модуль может подключиться.

Примечание по терминологии: Кольца защиты — это концепция, введенная в операционной системе Multics. «Кольцо 0» — «Кольцо 3» — это термины, характерные для процессоров Intel. Другие архитектуры процессоров используют другие термины, например режим пользователя/супервизора. Хотя процессоры Intel предоставляют четыре различных уровня привилегий, большинство операционных систем используют только два: кольцо 3 для кода уровня пользователя и кольцо 0 для кода ядра, отражая режимы пользователя/супервизора других процессоров. (Исключением является OS/2, которая использовала три уровня привилегий.)

Концепция уровня привилегий была расширена в последнее время с появлением технологии виртуализации на уровне оборудования. Например, архитектура ARM определяет три уровня привилегий: User, Supervisor и Hypervisor. В шутку было сказано, что в конечном итоге на машинах на базе Intel используются четыре кольца: Ring 3 для кода уровня пользователя, Ring 0 для кода ядра (виртуальной машины), Ring -1 для кода гипервизора и Ring -2 для режима SMM.

решение2

Концепция ядра не применима ко всем операционным системам. Она широко распространена, но как именно применить ее к конкретной системе, может быть предметом споров.

В случае многопрограммных систем, где программы изолированы друг от друга, есть точное определение ядра: ядро ​​— это часть системы, которая имеет доступ ко всему. Ядро — это часть, которая не изолирована. Роль ядра заключается, по крайней мере, в предоставлении механизма изоляции, но оно может делать больше. В традиционной архитектуре ядра Unix, которая включает Linux, ядро ​​также содержит драйверы оборудования, сетевые протоколы, драйверы файловой системы и т. д.

В большинстве систем изоляция между запущенными программами основана на аппаратных функциях (режимы привилегий процессора, блок управления памятью). Ядро является частью системы, которая работает в режиме наивысших привилегий процессора, режиме, в котором можно управлять привилегиями всей системы. На процессорах x86 этот режим называется «кольцом 0»; обратите внимание, что «кольцо 0» — это терминология x86, а не общая концепция. Общая концепция называется «режимом ядра» или «привилегированным режимом» или «режимом супервизора».

Утверждение «модули ядра управляют вводом-выводом и управлением памятью кольца 0» не имеет смысла. Ядро в целом управляет управлением памятью (на уровне принятия решения о том, какой процесс владеет какой памятью и по какому адресу он к ней обращается) и вводом-выводом (на уровне копирования данных в периферийные устройства и из них). Ядро в целом работает в режиме ядра процессора, который является кольцом 0 на процессоре x86.

Модуль ядра — это часть ядра, которая загружается после загрузки. Единственное различие между модулем и кодом времени загрузки заключается в том, как он загружается. Код в модуле ядра работает на том же уровне привилегий, что и код ядра, загружаемый во время загрузки, и может выполнять те же функции (любой код, который может быть загружен как модуль, также может быть включен в образ времени загрузки). Многие современные системы Unix имеют модули ядра, включая Solaris, *BSD, Linux и т. д.

Связанный контент