Внутреннее устройство ядра Linux 2.4


Поддержка загружаемых модулей


Linux - это монолитная операционная система и не смотря на навязчивую рекламу "преимуществ", предлагаемых операционными системами, базирующимися на микроядре, тем не менее (цитирую Линуса Торвальдса (Linus Torvalds)):

... message passing as the fundamental operation of the OS is just an exercise in computer science masturbation. It may feel good, but you don't actually get anything DONE.

Поэтому Linux есть и всегда будет монолитным, это означает, что все подсистемы работают в привелигированном режиме и используют общее адресное пространство; связь между ними выполняется через обычные C-функции.

Однако, не смотря на то, что выделение функциональности ядра в отдельные "процессы" (как это делается в ОС на микро-ядре) - определенно не лучшее решение, тем не менее, в некоторых случаях, желательно наличие поддержки динамически загружаемых модулей (например: на машинах с небольшим объемом памяти или для ядер, которые автоматически подбирают (auto-probing) взаимоисключающие драйверы для ISA устройств). Поддержка загружаемых модулей устанавливается опцией CONFIG_MODULES во время сборки ядра. Поддержка автозагружаемых модулей через механизм request_module() определяется отдельной опцией (CONFIG_KMOD).

Ниже приведены функциональные возможности, которые могут быть реализованы как загружаемые модули:

  1. Драйверы символьных и блочных устройств.
  2. Terminal line disciplines.
  3. Виртуальные (обычные) файлы в /proc и в devfs (например /dev/cpu/microcode и /dev/misc/microcode).
  4. Обработка двоичных форматов файлов (например ELF, a.out, и пр.).
  5. Обработка доменов исполнения (например Linux, UnixWare7, Solaris, и пр.).
  6. Файловые системы.
  7. System V IPC.

А здесь то, что нельзя вынести в модули (вероятно потому, что это не имеет смысла):

  1. Алгоритмы планирования.
  2. Политики VM (VM policies).
  3. Кэш буфера, кэш страниц и другие кзши.

Linux предоставляет несколько системных вызовов, для управления загружаемыми модулями:

  1. caddr_t create_module(const char *name, size_t size): выделяется size байт памяти, с помощью vmalloc(), и отображает структуру модуля в ней. Затем новый модуль прицепляется к списку module_list. Этот системный вызов доступен только из процессов с CAP_SYS_MODULE, все остальные получат ошибку EPERM.



  2. - Начало -  - Назад -  - Вперед -



    Книжный магазин