|
Секреты ЯдраВведениеДобро пожаловать в первую статью из серии статей о секретах ядра Linux. Вероятно, когда-то вы уже заглядывали в исходные тексты ядра. В таком случае, вы заметили, что пара стокилобайтовых компрессированных загрузочных файлов превратилась в более чем 3 00 файлов, содержащих больше 2 миллионов строк исходного кода и занимающих примерно 9 (версия 2.1.112 - последняя - ~ 11, прим. перев.) мегабайт в архиве. Эта серия предназначена не для начинающих, а продвинутых программистов. Разумеется, и в ином случае вы можете читать эти статьи, и автор постарается ответить на все вопросы и разрешить сомнения, посланные ему по e-mail. Как правило, каждый день обнаруживаются новые ошибки и публикуются патчи к ним. Сейчас зачастую невозможно понять весь исходный код целиком. Он написан большим числом программистов, хоть и пытающихся выдержать единый (гомогенный) стиль, но вс. же очен ь разных. Linux: операционная система для InternetLinux - свободно распространяемая операционная система для ПК и других архитектур. Она совместима со стандартом POSIX 1003.1 и включает большое число возможностей Unix System V и BSD 4.3. Основные части ядра Linux, рассматриваемого в этой серии, напис аны Линусом Торвальдсом (Linus Torvalds), студентом, заканчивающим компьютерный ВУЗ. Первое ядро было выпущено в ноябре 1991-го года. Основные характеристикиLinux предоставляет практически все возможности современных Unix-ориентированных ОС:
Компиляция ядраДавайте заглянем в исходный код ядра перед тем, как изучать само ядро. Структурная схема исходников: Исходники ядра 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/. Компиляция: Новое
ядро обычно генерируется в
три шага:
Мы детально рассмотри "изнанку" этих скриптов и возможности их модификации для добавления новых опций кофигурирования в следующих статьях. Я надеюсь, вам понравилась эта статья. Вы можете свободно присылать свои комментарии, предложения и критику по email на elesende@nextwork.net. Перевод с испанского: Gonzalo Garcia Agullo Перевод с английского: Сергей 'Росс' Борисов
За дополнительной информацией обращайтесь:
1998 Emiliano Ariel Lesende |
|||||||||||||||||
With any suggestions or questions please feel free to contact us |