Home Index Search Links About Us
[LinuxFocus Image]
[Navegation Bar]
Новости Архивы Компании Подсказки

Секреты ядра

by Emiliano Ariel Lesende


Введение

Linux: операционная
система для Internet

Основные характеристики

Компиляция ядра

Введение

Добро пожаловать в первую статью из серии статей о секретах ядра Linux. Вероятно, когда-то вы уже заглядывали в исходные тексты ядра. В таком случае, вы заметили, что пара стокилобайтовых компрессированных загрузочных файлов превратилась в более чем 3 00 файлов, содержащих больше 2 миллионов строк исходного кода и занимающих примерно 9 (версия 2.1.112 - последняя - ~ 11, прим. перев.) мегабайт в архиве.

Эта серия предназначена не для начинающих, а продвинутых программистов. Разумеется, и в ином случае вы можете читать эти статьи, и автор постарается ответить на все вопросы и разрешить сомнения, посланные ему по e-mail.

Как правило, каждый день обнаруживаются новые ошибки и публикуются патчи к ним. Сейчас зачастую невозможно понять весь исходный код целиком. Он написан большим числом программистов, хоть и пытающихся выдержать единый (гомогенный) стиль, но всё же очен ь разных.

Linux: операционная система для Internet

Linux - свободно распространяемая операционная система для ПК и других архитектур. Она совместима со стандартом POSIX 1003.1 и включает большое число возможностей Unix System V и BSD 4.3. Основные части ядра Linux, рассматриваемого в этой серии, напис аны Линусом Торвальдсом (Linus Torvalds), студентом, заканчивающим компьютерный ВУЗ. Первое ядро было выпущено в ноябре 1991-го года.

Основные характеристики

Linux предоставляет практически все возможности современных Unix-ориентированных ОС:

  • Многозадачность

    Linux реализует настоящую многозадачность. Все процессы независимы; ни один из них не должен нагружать процессор выполнением других задач.

  • Многопользовательский доступ

    Linux - не только многопользовательская ОС, но она поддержиает многопользовательский доступ. Linux может предоставлять все системные ресурсы пользователям, работающим с хостом через различные удалённые терминалы.

  • Загрузка выполняемых модулей "по требованию"

    Только необходимые части программы загружаются в память для выполнения.

  • Страничная организация памяти

    Если системная память полностью исчерпана, Linux будет искать давно не использованные 4K-вые страницы памяти для их перемещения из памяти на жёсткий диск. Если какие-либо из этих страниц становятся нужны, Linux восстанавливает их с диска в том же ра сположении. Некоторые старые Unix-системы и некоторые современные платформы (включая Microsoft Windows) скачивают неиспользуемое содержимое памяти на диск - т.е. ВСЕ страницы памяти, относящиеся к приложению, сохраняются на диске при нехватке памяти, что менее эффективно.

  • Динамическое кеширование диска

    Пользователи MSDOS работают со SmartDrive'ом, который резервирует фиксированные области системной памяти для кеширования диска. Взамен этого Linux использует много более динамичную систему кеширования: память, зарезервированная под кеш, увеличивается, когда память не используется, и уменьшается, если системе или процессу пользователя требуется больше памяти.

  • Общие библиотеки

    Билиотеки - наборы процедур, используемых программами для обработки данных. Существует некоторое количество стандартных библиотек, используемых одновременно более чем одним процессом. В старых системах такие библиотеки включались в каждый исполняемый файл, одновременное выполнение которых приводило к непродуктивному использованию памяти. В новых системах (в частности, в Linux), общий код загружается только раз, и предоставляется всем нуждающемся в нeм прцессам.

  • 100%-ное соответствие стандарту POSIX 1003.1. Частичная поддержка возможностей System V и BSD.

    POSIX 1003.1 задаeт стандартный интерфейс Unix-систем, который описывается набором процедур языка C. Сейчас он поддерживается всеми новыми ОС. Microsoft Windows NT также поддерживает POSIX 1003.1. Linux 1.2 100%-но соответствует POSIX. Дополнительно поддерживаются (или будут реализованы) некоторые возможности System V и BSD для увеличения совместимости.

  • Несколько форматов исполняемых файлов

    Кому не понравится возможность выполнять любые приложения DOS, Windows 95, FreeBSD или OS/2 под Linux? Что ж, эмуляторы DOS, Windows и Windows 95 находятся в стадии разработки. Linux также способен выполнять бинарные файлы других intel-ориентированных Unix-платформ, соответствующих стандарту iBCS2 (intel Binary Compatibility).

  • Несколько форматов файловых систем

    Linux поддерживает большое число форматов файловых систем. Наиболее используемая ныне ФС - Second Extended File System (Ext2). Другой поддерживаемый формат - File Allocation Table (FAT), используемый в DOS-ориентированных системах, но FAT не применим для возможностей безопасности и многопользовательского доступа из-за ограничений структуры.

  • Сетевые возможности

    Linux можно интегрировать в любую локальную сеть. Поддерживаются все службы Unix, включая Networked File System (NFS), удалeнный доступ (telnet, rlogin), dial-up-доступ SLIP and PPP, и т.д.. Также поддерживается включение Linux-машины как сервер или клиент для другой сети, в частности, работает sharing файлов и удалeнная печать в Macintosh, NetWare и Windows.

  • System V IPC

    Linux использует эту технологию для обмена сообщениями между процессами, семафоров и общей памяти.

Компиляция ядра

Давайте заглянем в исходный код ядра перед тем, как изучать само ядро.

Структурная схема исходников: Исходники ядра Linux обычно находятся в каталоге /usr/src/linux, и далее мы будем именовать каталоги, начиная с этого расположения. Как результат портинга под не-intel архитектуры, дерево каталогов ядра было изменено после версии 1.0. Архитектурно-зависимый код расположен в arch/. Код для процессоров intel 386, 486, Pentium и Pentium Pro - в arch/i386, arch/mips предназначен для основанных на MIPS систем, arch/sparc - для платформ на Sun Sparc, arch/ppc - для систем PowerPC/PowerMacintosh, и т.д.. Мы остановимся на Intel-архитектуре как наиболее используемой с Linux.

Ядро Linux - обычная программа на языке C. Она имееет только два важных отличия. Точка старта программ, написанных на языке C - процедура main(int argc,char **argv), в то время, как ядро Linux использует start_kernel(void). Программная среда ещe не создана к тому моменту, когда система запускается и ядро должно быть загружено. Это значит, что до вызова первой процедуры на C должны быть сделаны две вещи. Выполняющий это ассемблерный код находится в каталоге arch/i386/asm/.

Эта ассемблерная процедура загружает ядро по абсолютному адресу в памяти 0x100000 (1 мегабайт), затем устанавливает процедуры обработки прерываний, глобальные таблицы дескрипторов файлов и прерываний, которые используются исключительно во время процесса инициализации. В этой точке процессор переводится в защищeнный режим. Каталог init/ содержит всe, что нужно для инициализации ядра. Здесь находится процедура start_kernel(), необходимая для правильной инициализации ядра, берущая все переданные параметры загрузки. Первый процесс создан без системных вызовов (сама система вce ещe не загружена). Это холостой (idle) процесс, единолично использующий время процессора, не занятое другими процессами.

Каталоги kernel/ и arch/i386/kernel/ содержат, как следует из имeн их путей, основные части ядра. Здесь расположены основные системные вызовы. Здесь реализованы другие задачи, включая обработчик времени, планировщик, менеджер DMA, обработчик прерываний и сигнальный контроллер.

Код, обрабатывающий системную память, расположен в mm/ и arch/i386/mm/. Эта область предназначена для выделения и освобождения памяти для процессов. Страничная организация памяти также реализуется здесь.

Виртуальная файловая система (Virtual File System, vfs) находится в каталоге fs/. Файловые системы других поддерживаемых форматов находятся в ссответствующих подкаталогах. Наиболее важные файловые системы - Ext2 и Proc. Позже мы рассмотрим их подробнее.

Всем операционным системам нужен набор драйверов для физических усройств. В ядре Linux они расположены в drivers/.

В ipc/ вы найдeте реализацию System V IPC для Linux.

Исходный код для поддержки нескольких сетевых протоколов, сокетов (sockets) и доменов Internet хранится в net/.

В lib/ реализованы некоторые стандартные процедуры на C, позволяющие самому ядру использовать запрограммированные на C свойства (?, habits).

Загружаемые модули, генерируемые во время компиляции ядра, хранятся в modules/, но этот каталог пуст до окончания первой компиляции ядра.

Вероятно, наиболее важный для программистов каталог - include/. Здесь вы найдёте все заголовки (header) C-файлов, используемых в ядре. Специфические файлы заголовков для intel-платформ находятся в include/asm-386/.

Компиляция: Новое ядро обычно генерируется в три шага:

  • Во-первых, конфигурирование задаваемых опций ядра посредством "make config", "make menuconfig" или "make xconfig" (различные интерфейсы для данного этапа выбора конфигурации)
  • Затем все зависимости исходников перестраиваются командой "make depend"
  • и затем - выполняется реальная компиляция ядра через "make"

Мы детально рассмотри "изнанку" этих скриптов и возможности их модификации для добавления новых опций кофигурирования в следующих статьях.

Я надеюсь, вам понравилась эта статья. Вы можете свободно присылать свои комментарии, предложения и критику по email на [email protected].


Перевод с испанского: Gonzalo Garcia Agullo

Перевод с английского: Сергей 'Росс' Борисов


За дополнительной информацией обращайтесь:
  • Kernel-HOWTO.


© 1998 Emiliano Ariel Lesende
This website is mantained by Miguel A Sepulveda.