Второе издание
Скачать 3.09 Mb.
|
22 Введение в ядро Linux Д аже после трех десятилетий использования операционная система (ОС) Unix все еще считается одной из самых мощных и элегантных среди всех существующих операционных систем. Со времени создания операционной систе- мы Unix в 1969 году, это детище Денниса Ритчи (Dennis Ritchie) и Кена Томпсона (Ken Thompson) стало легендарным творением, системой, принцип работы которой выдержал испытание временем и имя которой оказалось почти незапятнанным. Операционная система Unix выросла из Multics — многопользовательской опера- ционной системы, проект по созданию которой потерпел неудачу в корпорации Bell Laboratories. По прекращении проекта Multics, сотрудники центра Bell Laboratories Computer Sciences Research Center прекратили работу и так и не создали дееспособ- ной диалоговой операционной системы. Летом 1969 года программисты корпорации Bell Labs разработали проект файловой системы, которая в конце концов была вклю- чена в операционную систему Unix. Томпсон осуществил реализацию операционной системы для реально не используемой платформы PDP-7. В 1971 году операционная система Unix была перенесена на платформу PDP-11, а в 1973 году переписана с ис- пользованием языка программирования С, что было беспрецедентным шагом в то время, но этот шаг стал основой для будущей переносимости. Первая версия опера- ционной системы Unix, которая использовалась вне стен Bell Labs, называлась Unix System версии 6, ее обычно называют V6. Другие компании перенесли операционную систему Unix на новые типы машин. Версии, полученные в результате переноса, содержали улучшения, которые позже привели к появлению нескольких разновидностей этой операционной системы, В 1977 году корпорация Bell Labs выпустила комбинацию этих вариантов в виде одной операционной системы Unix System III, а в 1982 году корпорация AT&T пред- ставила версию System V 1 Простота устройства операционной системы Unix, а также тот факт, что эта система распространялась вместе со своим исходным кодом, привели к тому, что дальнейшие разработки начали проводиться в других организациях. Наиболее важ- ным среди таких разработчиков был Калифорнийский университет в городе Беркли (University of California at Berkeley). 1 Как насчет версии System IV? Ходят слухи, чтo это внутренняя экспериментальная версия. 1 Варианты операционной системы Unix из Беркли именовались Berkeley Software Distributions (BSD). Первая версия операционной системы Unix, разработанная в Беркли в 1981 году, называлась 3BSD. Следом за ней появились выпуски серии 4BSD: 4.0BSD, 4.1BSD, 4.2BSD и 4.3BSD. В этих версиях операционной системы Unix была добавлена виртуальная память, замещение страниц по требованию (demand paging) и стек протоколов TCP/IP. Последней официальной версией ОС Unix из Беркли была 4.4BSD, выпущенная в 1993 году, которая содержала переписанную систему управления виртуальной памятью. Сейчас разработка линии BSD продолжается в операционных системах Darwin, Dragonfly BSD, FreeBSD, NetBSD и OpenBSD. В 1980-1990-х годах многие компании, разработчики рабочих станций и серве- ров, предложили свои коммерческие версии операционной системы Unix. Эти опе- рационные системы обычно базировались на реализациях AT&T или Беркли и под- держивали дополнительные профессиональные возможности, которые обеспечивала соответствующая аппаратная платформа. Среди таких систем были Tru64 компании Digital, HP-UX компании Hewlett Packard, AIX компании IBM, DYNIX/ptx компании Sequent, IRIX компании SGI, Solaris компании Sun. Первоначальное элегантное устройство операционной системы Unix в соедине- нии с многолетними нововведениями и улучшениями, которые за ними последо- вали, сделали систему Unix мощной, устойчивой и стабильной. Очень небольшое количество характеристик ОС Unix ответственны за ее устойчивость. Во-первых, операционная система Unix проста: в то время как в некоторых операционных си- стемах реалилованы тысячи системных вызовов и эти системы имеют недостаточно ясное назначение, Unix-подобные операционные системы обычно имеют только не- сколько сотен системных вызовов и достаточно четкий дизайн. Во-вторых, в опера- ционной системе Unix все представляется в виде файлов 2 . Такая особенность позволяет упростить работу с данными и устройствами, а также обеспечить это посредством простых системных вызовов: open (), read (), w r i t e ( ) , i o c t l () и c l o s e (). В-тре- тьи, ядро и системные утилиты Операционной системы Unix написаны на языке программирования С - это свойство делает Unix удивительно переносимой и до- ступной для широкого круга разработчиков операционной системой. Для ОС Unix характерно очень малое время создания нового процесса и уникаль- ный системный вызов f o r k ( ) . И наконец, операционная система Unix предоставля- ет простые и в то же время устойчивые средства межпроцессного взаимодействия, которые, в сочетании с быстрым созданием процессов, позволяют создавать про- стые утилиты, которые умеют выполнять всего одну функцию, но делают это хорошо, и могут быть связаны вместе для выполнения более сложных задач. Сегодня Unix — современная операционная система, которая поддерживает мно- гозадачность, многопоточность, виртуальную память, замещение страниц по требо- ванию, библиотеки совместного использования, загружаемые по требованию, и сеть TCP/IP. Многие варианты операционной системы Unix поддерживают масштабиро- вание до сотен процессоров, в то время как другие варианты ОС Unix работают на миниатюрных устройствах в качестве встраиваемых систем. Хотя разработка Unix больше не является исследовательским проектом, все же продолжаются разработки (с целью получить дополнительные преимущества) с использованием возможностей 2 Да, конечно, не все, но многое представлено в виде файла. В современных операционных систе- мах, таких как Plan9 (наследник Unix), практически все представляется в виде файлом. 24 Глава 1 операционной системы Unix, которая при этом остается практичной операционной системой общего назначения. Операционная система Unix обязана своим успехом простоте и элегантности по- строения. В основе ее сегодняшней мощности лежат давние идеи Денниса Ритчи, Кена Томпсона и других разработчиков, обеспечившие возможность операционной системе Unix бескомпромиссно развиваться. Потом пришел Линус: введение в Linux Операционная система Linux была разработана Линусом Торвальдсом (Linus Torvalds) в 1991 году как операционная система для компьютеров, работающих на новом в то время микропроцессоре Intel 80386. Тогда Линус Торвальдс был студен- том университета в Хельсинки и был крайне возмущен отсутствием мощной и в то же время свободно доступной Unix-подобной операционной системы. Операционная система DOS, продукт корпорации Microsoft, была для Торвальдса полезна только лишь, чтобы поиграть в игрушку "Принц Персии", и не для чего больше. Линус поль- зовался операционной системой Minix, недорогой Unix-подобной операционной си- стемой, которая была создана в качестве учебного пособия. В этой операционной системе ему не нравилось отсутствие возможности легко вносить и распространять изменения исходного кода (это запрещалось лицензией ОС Minix), а также техниче- ские решения, которые использовал автор ОС Minix. Поставленный перед такой проблемой, Линус решил написать свою операци- онную систему. Начал он с написания простого эмулятора терминала, который он подключал к большим Unix-системам в университете. Его эмулятор терминала по- степенно рос, развивался и улучшался. Постепенно у Линуса появилась еще не со- всем зрелая, но полноценная Unix-система. В 1991 голу он опубликовал в Интернет ее первую версию. По некоторым неясным причинам, использование операционной системы Linux и количество ее пользователей начали стремительно расти. Более важным для успе- ха Linux стало то, что эта операционная система привлекла многих разработчиков, которые начали изменять, исправлять и улучшать код. Благодаря соответствующему лицензионному соглашению, ОС Linux быстро стала совместным проектом, который разрабатывается многими людьми. Сейчас Linux — это развитая операционная система, работающая на аппаратных платформах AMD х86-64, ARM, Compaq Alpha, CRIS, DEC VAX, H8/300, Hitachi SuperH, HP PA-RISC, IBM S/390, Incel IA-64, MIPS, Motorola 68000, PowerPC, SPARC, UltraSPARC и v850. Она работает в различных системах, как размером с часы, так и на больших супер-компьютерных кластерах. Сегодня коммерческий интерес к опера- ционной системе Linux достаточно высок. Как новые корпорации, ориентирующиеся исключительно на Linux {Monta Vista или Red Hal), так и старые (IBM, Novell) пред- лагают решения на основе этой ОС для встраиваемых систем, десктопов и серверов. Операционная система Linux является клоном Unix, по ОС Linux— это не Unix. Хотя в ОС Linux позаимствовано много идей от Unix, в Linux реализован API ОС Unix (как это определено в стандарте POSIX и спецификации Single Unix Specification), все же система Linux не является производной от исходного кода Unix, как это имеет место для других Unix-систем, Там, где это желательно, были сделаны отклонения от пути, по которому шли другие разработчики, однако это не Введение в ядро Linux 25 подрывает основные принципы построения операционной системы Unix и не нару- шает программные интерфейсы. Одна из наиболее интересных особенностей операционной системы Linux — то, что это не коммерческий продукт; наоборот, это совместный проект, который вы- полняется через всемирную сеть Интернет. Конечно, Линус остается создателем Linux и занимается поддержкой ядра, но работа продолжается группой мало связан- ных между собой разработчиков. Фактически кто угодно может внести свой вклад в операционную систему Linux. Ядро Linux, так же как и большая часть операционной системы, является свободно распространяемым программным обеспечением и имеет открытый исходный код 3 . В частности, ядро Linux выпускается под лицензией GNU General Public License (GPL) версии 2.0. В результате каждый имеет право загружать исходный код и вно- сить в него любые изменения. Единственная оговорка — любое распространение внесенных вами изменений должно производиться на тех же условиях, которыми пользовались вы при получении исходного кода, включая доступность самого исхо- дного программного кода 4 Операционная система Linux предоставляет много возможностей для многих людей. Основными частями системы являются ядро, библиотека функций языка С, компилятор, набор инструментов, основные системные утилиты, такие как про- грамма для входа в систему (login) и обработчик команд пользователя (shell). В опе- рационную систему Linux может быть включена современная реализация системы X Windows, включая полно-функциональную среду офисных приложений (desktop environment), такую как, например, GNOME. Для ОС Linux существуют тысячи сво- бодных и коммерческих программ. В этой книге под понятием Linux, в основном, имеется в виду ядро Linux. Там, где это может привести к неопределенностям, будет указано, что имеется в виду под понятием Linux — вся система или только ядро. Строго говоря, термин Linux относится только к ядру. Обзор операционных систем и ядер Из-за неуклонного роста возможностей и не очень качественного построения не- которых современных операционных систем, понятие операционной системы стало несколько неопределенным. Многие пользователи считают, что то, что они видят на экране, — и есть операционная система. Обычно, и в этой книге тоже, под операци- онной системой понимается часть компьютерной системы, которая отвечает за основ- ные функции использования и администрирования. Это включает в себя ядро и драй- веры устройств, системный загрузчик (boot loader), командный процессор и другие интерфейсы пользователя, а также базовую файловую систему и системные утилиты. В общем, только необходимые компоненты. Термин система обозначает операционную систему и все пользовательские программы, которые работают под ее управлением. Конечно, основной темой этой книги будет ядро операционной системы. Интерфейс пользователя — это внешняя часть операционной системы, а ядро — вну- 3 Для тех, кому интересно, дискуссии по поводу отличия свободного кода от открытого доступна в Интернет по адресам h t t p : / / w w w . f s f . o r g и h t t p : / / w w w . o p e n s o u r c e . o r g . 4 Вероятно, вам нужно прочесть лицензию GNU GPL, если вы еще не читали ее. В файле COPYING, в исходном коде ядра, есть копия этой лицензии. В Интернет лицензия доступна по адресу h t t p : / / w w w . f s f . o r g . 26 Глава 1 тренняя. В своей основе ядро — это программное обеспечение, которое предоставля- ет базовые функции для всех остальных частей операционной системы, занимается управлением аппаратурой и распределяет системные ресурсы. Ядро часто называют основной частью (core) или контроллером операционной системы. Типичные компо- ненты ядра — обработчики прерываний, которые обслуживают запросы на преры- вания, планировщик, который распределяет процессорное время между многими процессами, система управления памятью, которая управляет адресным простран- ством процессов, и системные службы, такие как сетевая подсистема и подсистема межпроцессного взаимодействия. В современных системах с устройствами управле- ния защищенной памятью ядро обычно занимает привилегированное положение по отношению к пользовательским программам. Это включает доступ ко всем областям защищенной памяти и полный доступ к аппаратному обеспечению. Состояние систе- мы, в котором находится ядро, и область памяти, в которой находится ядро, вместе называются пространством ядра (или режимом ядра, kernel-space). Соответственно, пользовательские программы выполняются в пространствах задач (пользовательский режим, режим задач, user-space). Пользовательским программам доступно лишь не- которое подмножество машинных ресурсов, они не могут выполнять некоторые системные функции, напрямую обращаться к аппаратуре и делать другие недозво- ленные вещи. При выполнении программного кода ядра система находится в про- странстве (режиме) ядра, в отличие от нормального выполнения пользовательских программ, которое происходит в режиме задачи. Прикладные программы, работающие в системе, взаимодействуют с ядром с по- мощью интерфейса системных вызовов (system call) (рис. 1.1). Прикладная программа обычно вызывает функции различных библиотек, например библиотеки функций язы- ка С, которые, в свою очередь, обращаются к интерфейсу системных вызовов для того, чтобы отдать приказ ядру выполнить определенные действия от их имени. Некоторые библиотечные вызовы предоставляют функции, для которых отсутствует системный вызов, и поэтому обращение к ядру — это только один этап в более слож- ной функции. Давайте рассмотрим всем известную функцию p r i n t f (). Эта функции обеспечивает форматирование и буферизацию данных и лишь после этого один раз обращается к системному вызову w r i t e () для вывода данных на консоль. Некоторые библиотечные функции соответствуют функциям ядра один к одному. Например, биб- лиотечная функция open () не делает ничего, кроме выполнения системного вызова open () . В то же время некоторые библиотечные функции, как, например, s t r c p y (), надо полагать, вообще не используют обращения к ядру. Когда прикладная программа выполняет системный вызов, то говорят, что ядро выполняет работу от имени приклад- ной программы. Более того, говорят, что прикладная программа выполняет системный вызов в пространстве ядра, а ядро выполняется в контексте процесса. Такой тип взаи- модействия, когда прикладная программа входит в ядро через интерфейс системных вызовов, является фундаментальным способом выполнения задач. В функции ядра входит также управление системным аппаратным обеспечением. Практически все платформы, включая те, на которых работает операционная си- стема Linux, используют прерывания (interrupt). Когда аппаратному устройству необ- ходимо как-то взаимодействовать с системой, оно генерирует прерывание, которое прерывает работу ядра в асинхронном режиме 5 5 Иными словами, заранее неизвестно, в какой момент времени это событие произойдет и в каком состоянии будет система в этот момент времени. - Прим*. перев. Введение в ядро Linux 27 Рис. 1.1. Взаимодействие между прикладными программами, ядром и аппа- ратным обеспечением. . Обычно каждому типу прерываний соответствует номер. Ядро использует номер прерывания для выполнения специального обработчика прерывания (interrupt han- dler), который обрабатывает прерывание и отправляет на него ответ. Например, при вводе символа с клавиатуры, контроллер клавиатуры генерирует прерывание, чтобы дать знать системе, что в буфере клавиатуры есть новые данные. Ядро определяет номер прерывания, которое пришло в систему и выполняет соответствующий обра- ботчик прерывания. Обработчик прерывания обрабатывает данные, поступившие с клавиатуры, и даст знать контроллеру клавиатуры, что ядро готово для приема но- вых данных. Для обеспечения синхронизации выполнения ядро обычно может за- прещать прерывания: или все прерывания, или только прерывание с определенным номером. Во многих операционных системах обработчики прерываний не выполня- ются в контексте процессов. Они выполняются в специальном контексте прерывания (interrup context), который не связан ни с одним процессом. Этот специальный кон- текст существует то только для того, чтобы дать обработчику прерывания возможность быстро отреагировать на прерывание и закончить работу. Контексты выполнения заданий полностью определяют всю широту возможных действий ядра. Фактически, можно заключить, что в операционной системе Linux процессор в любой момент времени выполняет один из трех типов действий. • Работа от имени определенного процесса в режиме ядра в контексте процесса. 28 Глава 1 Пространство задачи Пространство ядра Аппаратное обеспечение Прикладная программа 1 Прикладная программа 2 Прикладная программа 3 Интерфейс системных вызовов Подсистемы ядра Драйверы устройств |