Home Index Search Links About Us
[LinuxFocus Image]
[Navegation Bar]
  News   Archives   Companies   Tips  

Секреты ядра

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), общий код загружается только раз, и предоставляется всем нуждающемся в нём прцессам.

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

    POSIX 1003.1 задаёт стандартный интерфейс 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), удалённый доступ (telnet, rlogin), dial-up-доступ SLIP and PPP, и т.д.. Также поддерживается включение Linux-машины как сервер или клиент для другой сети, в частности, работает sharing файлов и удалённая печать в 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). Программн ая среда ещё не создана к тому моменту, когда система запускается и ядро должно быть загружено. Это значит, что до вызова первой процедуры на C должны быть сделаны две вещи. Выполняющий это ассемблерный код находится в каталоге arch/i386/asm/.

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

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

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

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

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

В ipc/ вы найдёте реализацию 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 на elesende@nextwork.net.


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

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


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


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