Добавлен: 29.10.2018
Просмотров: 48098
Скачиваний: 190
10.1. История UNIX и Linux
791
связанной с дополнительными переключениями из режима пользователя в режим ядра.
Однако производительность — это еще не все. На всех современных системах UNIX
оконная система X Windows работает в режиме пользователя, в результате чего произ-
водительность несколько снижается, зато достигается большая модульность (в отличие
от системы Windows, у которой весь графический интерфейс пользователя расположен
в ядре). Среди других хорошо известных примеров микроядер того времени можно на-
звать Mach (Accetta et al., 1986) и Chorus (Rozier et al., 1988).
Уже через несколько месяцев после своего появления система MINIX стала чем-то вро-
де объекта культа — со своей группой новостей
comp.os.minix
и более чем 40 000 поль-
зователей. Очень многие пользователи стали сами писать команды и пользовательские
программы, так что система MINIX быстро стала продуктом коллективного творчества
большого количества пользователей по всему Интернету, послужив прототипом для
других коллективных проектов, появившихся позднее. В 1997 году была выпущена вер-
сия 2.0 системы MINIX. Теперь базовая система включала в себя сетевое программное
обеспечение, и ее размер вырос до 62 200 строк.
Примерно в 2004 году направление развития MINIX радикально изменилось, центр
тяжести был перенесен на создание исключительно безотказной и надежной системы,
которая могла бы автоматически восстанавливаться после своих сбоев и продолжать
корректную работу даже в условиях повторяющихся программных ошибок. Вследствие
этого заложенная в версии 1 идея модульности была в версии MINIX 3.0 значительно
расширена, почти все драйверы устройств перенесены в пространство пользователя
(причем все драйверы работают как отдельные процессы). Размер ядра резко сокра-
тился (до 4000 строк кода, которые вполне может понять один программист). Для
повышения отказоустойчивости были изменены и внутренние механизмы.
Кроме того, на MINIX 3.0 было перенесено более 650 популярных программ для UNIX,
в том числе и оконная система X Window System (иногда называемая просто Х), раз-
личные компиляторы (в том числе gcc), текстовые процессоры, сетевое программное
обеспечение, веб-браузеры и многое другое. В отличие от предыдущих версий (которые
были в основном учебными), начиная с версии MINIX 3.0 система стала вполне при-
годной для использования (акцент сделан на высокую надежность). Конечная цель
такова: никаких кнопок сброса (No more reset buttons).
Вышло третье издание книги «Operating Systems: Design and Implementation», описы-
вающее новую систему и приводящее в приложении ее исходные коды с подробным
описанием (Tanenbaum and Woodhull, 2006). Система продолжает развиваться и имеет
активное сообщество пользователей. Впоследствии она была портирована на процес-
сор ARM и сделалась доступной для встраиваемых систем. Чтобы бесплатно получить
текущую версию, вы можете посетить сайт
www.minix3.org
.
10.1.7. Linux
В ранние годы разработки системы MINIX и обсуждения этой системы в Интернете
многие люди просили (а часто требовали) все больше новых и более сложных функций,
и на эти просьбы автор часто отвечал отказом (чтобы сохранить небольшой размер
системы, которую студенты могли бы полностью освоить за один семестр). Эти по-
стоянные отказы раздражали многих пользователей. В те времена бесплатной системы
FreeBSD еще не было. Наконец, через несколько лет финский студент Линус Торвальдс
(Linus Torvalds) решил сам написать еще один клон системы UNIX, который он назвал
792
Глава 10. Изучение конкретных примеров: Unix, Linux и Android
Linux
. Это должна была быть полноценная производственная система, со многими
изначально отсутствовавшими в системе MINIX функциями. Первая версия 0.01 опе-
рационной системы Linux была выпущена в 1991 году. Она была разработана и собрана
на компьютере под управлением MINIX и заимствовала из системы MINIX множе-
ство идей, начиная со структуры дерева исходных кодов и заканчивая компоновкой
файловой системы. Однако в отличие от микроядерной системы MINIX, Linux была
монолитной системой, то есть вся операционная система размещалась в ядре. Размер
исходного текста составил 9300 строк на языке C и 950 строк на ассемблере, что при-
близительно совпадало с версией MINIX как по размеру, так и по функциональности.
Фактически это была переделка системы MINIX — единственной системы, исходный
код которой имелся у Торвальдса.
Операционная система Linux быстро росла в размерах и впоследствии развилась
в полноценный клон UNIX с виртуальной памятью, более сложной файловой системой
и многими другими дополнительными функциями. Хотя изначально система Linux
работала только на процессоре Intel 386 (и даже имела встроенный ассемблерный код
386-го процессора в процедурах на языке C), она была быстро перенесена на другие
платформы и теперь работает на широком спектре машин — так же, как и UNIX. Следу-
ет выделить одно отличие системы Linux от UNIX: она использует многие специальные
возможности компилятора gcc, поэтому потребуется приложить немало усилий, чтобы
откомпилировать ее стандартным ANSI C-компилятором. Теперь недальновидная идея
о том, что gcc является невиданным доселе компилятором, превратилась в настоящую
проблему, поскольку благодаря гибкости и качеству своего кода стремительно набирает
популярность компилятор с открытым кодом LLVM, разработанный в университете
Иллинойса. Так как LLVM не поддерживает все нестандартные расширения языка C,
он не может компилировать ядро Linux без многочисленных поправок к ядру, предна-
значенных для замены кода, не отвечающего стандарту ANSI.
Следующим основным выпуском системы Linux была версия 1.0, появившаяся
в 1994 году. Она состояла примерно из 165 000 строк кода и включала новую файло-
вую систему, отображение файлов на адресное пространство памяти и совместимое
с BSD сетевое программное обеспечение с сокетами и TCP/IP . Она также включала
многие новые драйверы устройств. В течение следующих двух лет выходили версии
с незначительными исправлениями.
К этому времени операционная система Linux стала достаточно совместимой с UNIX,
поэтому на нее было перенесено большое количество программного обеспечения для
UNIX, что значительно увеличило ее полезность. Кроме того, операционная система
Linux привлекла большое количество людей, которые начали работу над ее кодом
и расширением (под общим руководством Торвальдса).
Следующий главный выпуск, версия 2.0, вышел в свет в 1996 году. Эта версия состояла
примерно из 470 000 строк на языке C и 8000 строк ассемблерного кода. Она включала
в себя поддержку 64-разрядной архитектуры, симметричной многозадачности, новых
сетевых протоколов и прочих многочисленных функций. Значительную часть общей
массы исходного кода составляла обширная коллекция драйверов устройств для по-
стоянно растущего количества поддерживаемых периферийных устройств. Следом за
этой версией довольно часто выходили дополнительные выпуски.
Номер версии ядра Linux состоит из четырех чисел: A.B.C.D (например, 2.6.9.11).
Первое число обозначает версию ядра. Второе число обозначает основную версию. До
ядра 2.6 четные номера версии обозначали стабильную версию ядра, а нечетные — не-
10.1. История UNIX и Linux
793
стабильную (находящуюся в разработке). Начиная с версии ядра 2.6 это не так. Третье
число обозначает номер ревизии (например, добавлена поддержка новых драйверов).
Четвертое число обозначает исправление ошибок или заплатки системы безопасности.
В июле 2011 года Линус Торвальдс анонсировал выпуск Linux 3.0, но не из-за каких-то
существенных технических усовершенствований, а просто в честь 20-й годовщины раз-
работки ядра. По состоянию на 2013 год ядро Linux содержит около 16 млн строк кода.
В систему Linux была перенесена внушительная часть стандартного программного
обеспечения UNIX, включая популярную оконную систему X Windows и большое
количество сетевого программного обеспечения. Кроме того, специально для Linux
было написано два различных конкурирующих графических интерфейса пользователя:
GNOME и KDE. В общем, система Linux выросла в полноценный клон UNIX со всеми
погремушками, какие только могут понадобиться любителю UNIX.
Необычной особенностью Linux является ее бизнес-модель: это бесплатное программное
обеспечение. Его можно скачать с различных интернет-сайтов, например
www.kernel.org
.
Система Linux поставляется вместе с лицензией, разработанной Ричардом Столманом,
основателем Фонда бесплатных программ (Free Software Foundation). Несмотря на то
что система Linux бесплатна, эта лицензия, называющаяся GPL ( GNU Public License —
общедоступная лицензия GNU), по длине превосходит лицензию корпорации Microsoft
для операционной системы Windows и указывает, что вы можете и чего не можете делать
с кодом. Пользователи могут бесплатно использовать, копировать, модифицировать
и распространять исходные коды и двоичные файлы. Основное ограничение касается
отдельной продажи или распространения двоичного кода (выполненного на основе ядра
Linux) без исходных текстов. Исходные коды (тексты) должны либо поставляться вместе
с двоичными файлами, либо предоставляться по требованию.
Хотя Торвальдс до сих пор довольно внимательно контролирует ядро системы, большое
количество программ пользовательского уровня было написано другими программи-
стами, многие из которых изначально перешли на Linux из сетевых сообществ MINIX,
BSD и GNU. Однако по мере развития системы Linux все меньшая часть сообщества
Linux желает ковыряться в исходном коде (свидетельством тому служат сотни книг,
описывающих, как установить систему Linux и как ею пользоваться, и только не-
сколько книг, в которых обсуждается сам код или то, как он работает). Кроме того,
многие пользователи Linux теперь предпочитают бесплатному скачиванию системы
из Интернета покупку одного из CD-ROM-дистрибутивов, распространяемых много-
численными коммерческими компаниями. На веб-сайте
www.linux.org
перечислено
более 100 компаний, продающих различные дистрибутивы Linux
1
. По мере того как
все больше и больше занимающихся программным обеспечением компаний начинают
продавать свои версии Linux и все большее число производителей компьютеров постав-
ляют систему Linux со своими машинами, граница между коммерческим и бесплатным
программным обеспечением начинает заметно размываться.
Интересно отметить, что когда мода на Linux начала набирать обороты, она получила
поддержку с неожиданной стороны — от корпорации AT&T. В 1992 году университет
в Беркли, лишившись финансирования, решил прекратить разработку BSD UNIX на
последней версии 4.4BSD (которая впоследствии послужила основой для FreeBSD).
Поскольку эта версия по существу не содержала кода AT&T, университет в Беркли вы-
1
Кроме того, информацию о дистрибутивах Linux и их распространителях можно найти
на
www.distrowatch.org
.
— Примеч. ред.
794
Глава 10. Изучение конкретных примеров: Unix, Linux и Android
пустил это программное обеспечение с лицензией открытого исходного кода, которая
позволяла всем делать все, что угодно, кроме одной вещи — подавать в суд на универси-
тет Калифорнии. Контролировавшее систему UNIX подразделение корпорации AT&T
отреагировало немедленно — вы угадали, как, — подав в суд на университет Калифор-
нии. Оно также подало иск против компании BSDI, созданной разработчиками BSD
UNIX для упаковки системы и продажи поддержки (примерно так сейчас поступают
компании типа Red Hat с операционной системой Linux). Поскольку код AT&T прак-
тически не использовался, то судебное дело основывалось на нарушении авторского
права и торговой марки, включая такие моменты, как телефонный номер 1-800-ITS-
UNIX компании BSDI. Хотя этот спор в конечном итоге удалось урегулировать в до-
судебном порядке, он не позволял выпустить на рынок FreeBSD в течение долгого
периода — достаточного для того, чтобы система Linux успела упрочить свои позиции.
Если бы судебного иска не было, то уже примерно в 1993 году началась бы серьезная
борьба между двумя бесплатными версиями системы UNIX, распространяющимися
с исходными кодами: царствующим чемпионом — системой BSD (зрелой и устойчивой
системой с многочисленными приверженцами в академической среде еще с 1977 года)
и энергичным молодым претендентом — системой Linux всего лишь двух лет от роду,
но с уже растущим числом последователей среди индивидуальных пользователей. Кто
знает, чем обернулась бы эта схватка двух бесплатных версий системы UNIX.
10.2. Обзор системы Linux
В этом разделе будет представлено общее введение в операционную систему Linux ,
а также описано, как ею пользоваться, — для читателей, еще не знакомых с этой систе-
мой. Приведенный здесь материал применим ко всем версиям системы UNIX (с не-
большими изменениями). Linux имеет несколько графических интерфейсов, основное
внимание в данном разделе будет уделено тому, как система Linux выглядит при работе
программиста в окне командной оболочки (shell) в графической системе Х. Последую-
щие разделы будут посвящены системным вызовам и внутреннему устройству системы.
10.2.1. Задачи Linux
Операционная система UNIX всегда была интерактивной системой, разработанной для
одновременной поддержки множества процессов и множества пользователей. Она была
разработана программистами и для программистов — чтобы использовать ее в такой
среде, в которой большинство пользователей достаточно опытны и занимаются про-
ектами (часто довольно сложными) разработки программного обеспечения. Во многих
случаях большое количество программистов активно работает над созданием общей
системы, поэтому в операционной системе UNIX есть большое количество средств,
позволяющих людям работать вместе и управлять совместным использованием ин-
формации. Очевидно, что модель группы опытных программистов, совместно работа-
ющих над созданием сложного программного обес печения, существенно отличается от
модели одного начинающего пользователя, сидящего за персональным компьютером
в текстовом процессоре, и это отличие отражается в операционной системе UNIX
от начала до конца. Совершенно естественно, что Linux унаследовал многие из этих
установок, даже несмотря на то что первая версия предназначалась для персонального
компьютера.
10.2. Обзор системы Linux
795
Чего действительно хотят от операционной системы хорошие программисты? Прежде
всего, большинство хотело бы, чтобы их система была простой, элегантной и совме-
стимой. Например, на самом нижнем уровне файл должен представлять собой просто
набор байтов. Наличие различных классов файлов для последовательного и произ-
вольного доступа, доступа по ключу, удаленного доступа и т. д. (как это реализовано
на мейнфреймах) просто является помехой. А если команда
ls A*
означает вывод списка всех файлов, имя которых начинается с буквы «A», то команда
rm A*
должна означать удаление всех файлов, имя которых начинается с буквы «A», а не
одного файла, имя которого состоит из буквы «A» и звездочки. Эта характеристика
иногда называется принципом наименьшей неожиданности (principle of least surprise).
Другие свойства, которые, как правило, опытные программисты желают видеть в опе-
рационной системе, — это мощь и гибкость. Это означает, что в системе должно быть
небольшое количество базовых элементов, которые можно комбинировать, чтобы при-
способить их для конкретного приложения. Одно из основных правил системы Linux
заключается в том, что каждая программа должна выполнять всего одну функцию —
и делать это хорошо. То есть компиляторы не занимаются созданием листингов, так как
другие программы могут лучше справиться с этой задачей.
Наконец, у большинства программистов есть сильная неприязнь к бесполезной избы-
точности. Зачем писать copy, когда вполне достаточно cp, чтобы однозначно выразить
желаемое? Это же пустая трата драгоценного хакерского времени. Чтобы получить
список всех строк, содержащих строку «ard», из файла
f
, программист в операционной
системе Linux вводит команду
grep ard f
Противоположный подход состоит в том, что программист сначала запускает про-
грамму grep (без аргументов), после чего программа grep приветствует программиста
фразой: «Здравствуйте, я grep. Я ищу шаблоны в файлах. Пожалуйста, введите ваш
шаблон». Получив шаблон, программа grep запрашивает имя файла. Затем она спра-
шивает, есть ли еще какие-либо файлы. Наконец, она выводит резюме того, что она
собирается делать, и спрашивает, все ли верно. Хотя такой тип пользовательского
интерфейса может быть удобен для начинающих пользователей, он бесконечно раз-
дражает опытных программистов. Им требуется слуга, а не нянька.
10.2.2. Интерфейсы системы Linux
Операционную систему Linux можно рассматривать как пирамиду (рис. 10.1). У осно-
вания пирамиды располагается аппаратное обеспечение, состоящее из центрального
процессора, памяти, дисков, монитора и клавиатуры, а также других устройств. Опера-
ционная система работает на «голом железе». Ее функция заключается в управлении
аппаратным обеспечением и предоставлении всем программам интерфейса системных
вызовов. Эти системные вызовы позволяют программам пользователя создавать про-
цессы, файлы и прочие ресурсы, а также управлять ими.
Программы делают системные вызовы, помещая аргументы в регистры (или ино-
гда в стек) и выполняя команду эмулированного прерывания для переключения из
пользовательского режима в режим ядра. Поскольку на языке C невозможно написать