Второе издание
Скачать 3.09 Mb.
|
Приложение Б. Генератор случайных чисел ядра 423 Принцип работы и реализация 424 Проблема с загрузкой системы 426 Интерфейсы для ввода энтропии 426 Интерфейсы для вывода энтропии 427 Приложение В. Сложность алгоритмов 429 Алгоритмы 429 Множество О 430 Множество болышого-тета 430 Объединяем все вместе 431 Опасность, связанная со сложностью алгоритмов 431 Приложение Г. Библиография и список литературы 433 Книги по основам построения операционных систем 433 Книги о ядрах Unix 434 Книги о ядрах Linux 434 Книги о ядрах других операционных систем 435 Книги по API Unix 435 Другие работы 435 Web-сайты 436 Предметный указатель 437 14 Содержание Посвящается Дорис (Doris) и Хялен (Helen) Предисловие В связи с тем, что ядро и приложения операционной системы Linux используют- ся все более широко, возрастает число разработчиков системного программ- ного обеспечения, желающих заняться разработкой и поддержкой операционной системы Linux. Некоторые из этих инженеров руководствуются исключительно соб- ственным интересом, некоторые работают в компаниях, которые занимаются опе- рационной системой Linux, некоторые работают на производителей компьютерных аппаратных средств, некоторые заняты в проектах по разработке программного обе- спечения на дому. Однако все они сталкиваются с общей проблемой: кривая затрат на изучение ядра становится все длиннее и круче. Система становится все более сложной и, кро- ме того, очень большой по объему. Годы проходят, и нынешние члены команды раз- работчиков ядра приобретают все более широкие и глубокие знания, что увеличива- ет разрыв между ними и разработчиками-новичками. Я уверен, что понимание основного кода ядра Linux уже сейчас является пробле- мой, приводящей к ухудшению качества ядра, и в будущем эта проблема станет еще более серьезной. Все, кому нравится операционная система Linux, несомненно, за- интересованы в увеличении числа разработчиков, которые смогут внести свой вклад в развитие ядра этой операционной системы. Один из возможных подходов к решению данной проблемы — ясность исходного кода: удобные интерфейсы, четкая структура, следование принципу "Делать мало, но делать хорошо" и т.д. Такое решение предложено Линусом Торвальдсом (Linus Torvalds). Подход, который предлагаю я, состоит в использовании большего числа коммен- тариев внутри исходного кода, что поможет читателю понять, чего хотел достичь программист. (Процесс выявления расхождений между целью и реализацией изве- стен как отладка. Этот процесс значительно затрудняется, если не известно, чего хотели достичь.) Однако комментарии все же не дают представления о том, для чего предназначе- но большинство подсистем и как разработчики приступали к их реализации. Именно печатное слово лучше всего подходит для стартовой точки такого пони- мания. Вклад Роберта Лава (Robert Love) состоит в предоставлении возможности, благо- даря которой опытные разработчики смогут получить полную информацию о том, какие задачи должны выполнять различные подсистемы ядра и каким образом пред- полагается выполнение этих задач. Этой информации должно быть достаточно для многих людей: для любопытных, для разработчиков прикладного программного обе- спечения, для тех, кто хочет ознакомиться с устройством ядра, и т.д. Кроме того, данная книга является ступенькой, которая может перенести начи- нающих разработчиков на новый уровень, где изменения в ядро вносятся для того, чтобы достичь определенной цели. Я хотел бы посоветовать начинающим разработ- чикам, чтобы они не боялись испачкать свои руки: наилучший способ понять какую- либо часть ядра — это внести в нее изменения. Внесение изменений повышает по- нимание разработчика до уровня, которого нельзя достичь простым чтением кода ядра. Серьезный разработчик ядра присоединится к спискам рассылки разработчиков и будет контактировать с другими коллегами. Это основной способ, позволяющий разработчикам учиться и быть на высоком уровне. Роберт очень хорошо осветил ме- ханизмы и культуру этой важной части жизни сообщества разработчиков ядра. Пользуйтесь книгой Роберта и учитесь по ней! Может быть, и вы решите сделать следующий шаг и вступить в сообщество разработчиков ядра, куда мы вас и пригла- шаем. Людей ценят по важности их дел, поэтому, помогая развитию операционной системы Linux, знайте, что ваша работа— небольшая, но непосредственная помощь десяткам или даже сотням миллионов людей. Эндрю Мортон (Andrew Morton) Open Source Development Labs 16 - Введение Введение Когда я сделал первую попытку превратить свой опыт работы с ядром Linux в текст книги, понял, что не знаю, как двигаться дальше. Не хотелось просто писать еще одну книгу о ядре операционной системы. Конечно, на эту тему не так уж и много книг, но все же я хотел сделать что-то такое, благодаря чему моя книга была бы особенной. Как достичь этой цели? Я не могу успокоиться, пока не сделаю что- нибудь особенное, лучшее в своем роде. Наконец я решил, что смогу предложить достаточно уникальный подход к дан- ной теме. Моя работа — изучение и разработка ядра операционной системы. Мое увлечение — изучение и разработка ядра операционной системы. Моя любовь — ядро операционной системы. Конечно, за многие годы я успел собрать много интересных анекдотов и полезных советов. С моим опытом я смог бы написать книгу о том, как нужно разрабатывать программный код ядра и как этого делать не нужно. Прежде всего, эта книга об устройстве и практической реализации ядра операционной си- стемы Linux. В ней информация представлена так, чтобы получить достаточно зна- ний для решения реальных практических задач и чтобы эти задачи решать правиль- но. Я человек прагматичный, и книга имеет практический уклон. Она должна быть полезной, интересной и легко читаться. Я надеюсь, что читатели, после прочтения этой книги, получат хорошее понима- ние тек правил (писанных и неписаных), которые действуют в ядре операционной системы. Я также надеюсь, что читатели сразу после прочтения этой книги смогут начать действовать и писать полезный, правильный и хороший код ядра. Конечно, эту книгу можно читать и просто ради интереса. Это то, что касалось еще первого издания книги. Однако время идет и снова приходится возвращаться к рассмотренным вопросам. В этом издании представле- но несколько больше информации по сравнению с первым: материал серьезно пере- смотрен и доработан, появились новые разделы и главы. С момента выхода перво- го издания в ядро были внесены изменения. Однако, что более важно, сообщество разработчиков ядра Linux приняло решение 1 в ближайшем будущем не начинать разработку серии ядра 2.7. Было решено заняться стабилизацией серии ядра 2.6. Стабилизация включает в себя много моментов, тем не менее есть один важный, ко- торый касается данной книги, — книга, которая посвящена ядру серии 2.6, остается актуальной. Если изменения происходят не слишком быстро, то существует большой шанс, что "моментальный снимок" ядра останется актуальным и в будущем. В конце концов, книга сможет вырасти и стать канонической документацией по ядру. Я на- деюсь, что именно такая книга и находится у вас в руках. Как бы там ни было, книга написана, и я надеюсь, что она вам понравится. 1 Это решение было принято на саммите разработчиков ядра Linux (Linux Kernel Development Summit), который состоялся летом 2004 года в г. Оттава, Канада. Введение 17 Итак... Разработка программного кода ядра операционной системы не требует наличия гениальной, волшебной или густой бороды Unix-хакера. Хотя ядро операционной системы и имеет некоторые свои особенности, оно незначительно отличается от любого большого программного продукта. Так же как и в случае любой сложной про- граммы, здесь есть, что изучать, но в программировании ядра не намного больше священных или непонятных вещей, чем в создании любой другой программы. Очень важно, чтобы вы читали программный код. Доступность открытого исхо- дного кода операционной системы Linux — это подарок, который встречается очень редко. Однако недостаточно только читать исходный код. Необходимо взяться за дело серьезно и изменять этот программный код. Находите ошибки и исправляйте их! Улучшайте драйверы для своего аппаратного обеспечения! Находите слабые ме- ста и закрывайте их! У вас все получится, если вы будете сами писать программный код. Версия ядра Эта книга посвящена ядрам Linux серии 2.6 и базируется на версии ядра 2.6.10. Ядро — это "движущийся объект", и никакая книга не в состоянии передать динами- ку во все моменты времени. Тем не менее базовые внутренние структуры ядра уже сформировались, и основные усилия по представлению материала были направлены на то, чтобы этот материал можно было использовать и в будущем. Читательская аудитория Эта книга предназначена для разработчиков программного обеспечения, кото- рые заинтересованы в понимании ядра операционной системы Linux. Тем не менее это не построчные комментарии исходного кода ядра. Это также не руководство по разработке драйверов и не справочник по программному интерфейсу (API) ядра (кстати, формализованного API ядра Linux никогда не было). Целью книги являет- ся предоставление достаточной информации об устройстве и реализации ядра для того, чтобы подготовленный программист смог начать разработку программного кода. Разработка ядра может быть увлекательным и полезным занятием, и я хочу ознакомить читателя с этой сферой деятельности по возможности быстро. В книге обсуждаются как вопросы теории, так и практические приложения, она обращена к людям, которые интересуются и тем, и другим. Я всегда придерживался мнения, что для понимания практических приложений необходима теория, тем не менее я счи- таю, что эта книга не сильно углубляется в оба этих направления. Я надеюсь, что, независимо от мотиваций необходимости понимания ядра операционной системы Linux, эта книга сможет объяснить особенности устройства и реализации в доста- точной степени. Таким образом, данная книга освещает как использование основных подсистем ядра, так и особенности их устройства и реализации. Я думаю, что эти вопросы важ- ны и достойны обсуждения. Хороший пример — глава 7, "Обработка нижних половин и отложенные действия", посвященная обработчикам нижних половин (bottom half). 18 Введение В этой главе рассказывается о принципах работы и об особенностях реализации механизмов обработки нижних половин (эта часть может быть интересна разработ- чикам основных механизмов ядра), а также о том, как на практике использовать экс- портируемый интерфейс ядра для реализации собственных обработчиков bottom ha- lf (это может быть интересно для разработчиков драйверов устройств). На самом деле мне кажется, что обе эти стороны обсуждения будут интересны для всех групп разработчиков. Разработчик основных механизмов ядра, который, конечно, должен понимать принципы работы внутренних частей ядра, должен также понимать и то, как интерфейсы ядра будут использоваться на практике. В то же самое время разра- ботчик драйверов устройств получит большую пользу от хорошего понимания того, что стоит за этим интерфейсом. Все это сродни изучению программного интерфейса некоторой библиотеки наря- ду с изучением того, как эта библиотека реализована. На первый взгляд, разработчик прикладных программ должен понимать лишь интерфейс (API). И действительно, интерфейсы часто предлагают рассматривать в виде черного ящика. Разработчик библиотеки, наоборот, обычно интересуется лишь принципом работы и реализации функций библиотеки. Я уверен, что обе группы разработчиков должны потратить некоторое время на изучение другой стороны предмета. Разработчик программ, который хорошо понимает операционную систему, сможет значительно лучше эту операционную систему использовать. Аналогично разработчик библиотеки должен иметь хотя бы малое представление о том, что происходит в реальной жизни, и, в частности, о тех программах, в которых будет использоваться его библиотека. Поэтому я старался коснуться как устройства, так и использования подсистем ядра не только в связи с тем, что эта книга может быть полезна для одной или другой группы разработчиков, а в надежде, что весь материал книги будет полезен для всех разработчиков. Предполагается, что читатель знаком с языком программирования С и операци- онной системой Linux. Некоторые знания принципов построения операционных си- стем также желательны. Я старался объяснять все понятия, однако в случае проблем в списке литературы можно найти несколько отличных книг, которые посвящены основам построения операционных систем. Эта книга будет полезна для студентов, изучающих основы построения операци- онных систем, в качестве прикладного пособия и вводного материала по соответству- ющей теории. Книга пригодна как для расширенных специальных курсов, так и для общих специальных курсов, причем в последнем случае без дополнительных матери- алов. Я прошу потенциальных учебных инструкторов связаться со мной; я буду очень рад оказать помощь. Интернет-ресурс Автор поддерживает Интернет-сайт h t t p : //tech9.net/rml/kernel_book/, со- держащий информацию о данной книге, включая ошибки, расширенные и исправ- ленные разделы, а также информацию о будущих изданиях. Всем читателям реко- мендуется посетить этот сайт. Введение 19 Благодарности ко второму изданию Как и большинство авторов, я писал эту книгу, не сидя в пещере (что само по себе хорошо, потому что в пещерах могут водиться медведи), и, следовательно, многие люди оказали мне поддержку в создании рукописи своим сердцем и умом. Поскольку невозможно привести полный список этих людей, я хочу поблагодарить всех своих друзей и коллег за помощь, поддержку и конструктивную критику. В первую очередь, я хотел бы высказать благодарность моему редактору Скотту Мейерсу (Scott Meyers) за руководство, благодаря которому второе издание книги превратилось из идеи в конечный продукт. Мне снова было очень приятно работать с Джоржем Недеффом (Georg Nedeff), производственным редактором, ко- торый во всем обеспечивал порядок. Особая благодарность литературному редакто- ру Марго Кэтс (Margo Catts). Мы можем только желать, чтобы наше владение ядром было так же совершенно, как ее владение печатным словом. Отдельное спасибо техническим редакторам этого издания Адаму Белею (Adam Belay), Мартину Пулу (Martin Pool) и Крису Ривере (Chris Rivera). Их знания и исправления помогли сделать эту книгу неизмеримо лучше. Если, несмотря на их неоценимые усилия, все же остались ошибки, то это вина автора. Такое же большое спасибо Заку Брауну (Zak Brown), который приложил огромные усилия к техническо- му редактированию первого издания. Многие разработчики ядра отвечали на вопросы, предоставляли поддержку или просто писали программный код, интересный настолько, что по нему можно было бы написать отдельную книгу. Среди них Андреа Аркангели (Andrea Arcangely), Алан Кокс (Alan Сох), Грег Кроах-Хартман (Greg Kroah-Hartman), Даниэл Филлипс (Daniel Phillips), Дэвид Миллер (David Miller), Патрик Мочел (Patrick Mochel), Эндрю Мортон (Andrew Morton), Звене Мвейкамбо (Zwane Mwaikambo), Ник Пиггин (Nick Piggin) и Линус Торвальдс (Linus Torvalds). Особое спасибо тайному сообще- ству ядра (хотя никакого тайного сообщества нет). Я хочу выразить свою любовь и признательность многим людям. Среди них Пол Амичи (Paul Amichi), Кейт Бэрбег (Keith Barbag), Дейв Эггерс (Dave Eggers), Ричард Эриксон (Richard Erickson), Нат Фридман {Nat Friedman), Дастин Холл (Dostin Hall), Джойс Хокинс (Joyce Hawkins), Мигуэль де Иказа (Miguel de Icaza), Джимми Крел (Jimmy Krehl), Дорис Лав (Doris Love), Джонатан Лав (Jonathan Love), Патрик ЛеКлер (Patrick LeClair), Линда Лав (Linda Love), Рэнди О'Дауд (Randy O'Dowd), Сальваторэ Рибаудо (Salvatore Ribaudo) и его чудесная мама, Крис Ривера (Chris Rivera), Джой Шау (Joey Shaw), Джэрэми ВанДорен (Jeremy VanDoren) и его семья, Стив Вейсберг (Steve Weisberg) и Хелен Винснант (Helen Whinsnant). И в заключение, спасибо за все моим родителям. Желаю большого хакерского счастья! Роберт Лав, г. Кембридж, штат, Массачусетс. 20 . Введение Об авторе Роберт Лав (Robert Love) использует операционную систему Linux с первых дней ее существования. Он является страстным активистом сообществ разработ- чиков ядра и GNOME. Сейчас Роберт работает главным инженером по разработке ядра группы разработчиков Ximian Desktop компании Novell. До этого он работал инженером по разработке ядра компании Мота Vista Software. Проекты по разработке ядра, которыми занимался автор, включают планиров- щик выполнения процессов, преемптивное (вытесняемое) ядро (preemptive kernel), уровень событий ядра, улучшение поддержки виртуальной памяти (VM), улучшение поддержки многопроцессорного оборудования. Роберт является автором утилит schedutils и менеджера томов GNOME. Роберт Лав читает лекции и пишет статьи по основам построения ядра операционной системы и получает приглашения редак- тировать статьи в издании Linux Journal. Автор получил степень бакалавра по математике и вычислительной технике в университете штата Флорида. Хотя Роберт и родился в южной Флориде, своим до- мом он считает Кембридж, штат Массачусетс. Роберт увлекается футболом, фотогра- фией и любит готовить. Введение 21 От издательства Вы, читатель этой книги, и есть главный ее критик. Мы ценим ваше мнение и хо- тим знать, что было сделано нами правильно, что можно было сделать лучше и что еще вы хотели бы увидеть изданным нами. Нам интересно услышать и любые другие замечания, которые вам хотелось бы высказать в наш адрес. Мы ждем ваших комментариев и надеемся на них. Вы можете прислать нам бу- мажное или электронное письмо либо просто посетить наш Web-сервер и оставить свои замечания там. Одним словом, любым удобным для вас способом дайте нам знать, нравится ли вам эта книга, а также выскажите свое мнение о том, как сделать наши книги более интересными для вас. Посылая письмо или сообщение, не забудьте указать название книги и ее авто- ров, а также ваш обратный адрес. Мы внимательно ознакомимся с вашим мнением и обязательно учтем его при отборе и подготовке к изданию последующих книг. Наши координаты: E-mail: info@williamspublishing.com WWW: http://www.williamspublishing.com Информация для писем из: России: 115419, Москва, а/я 783 Украины: 03150, Киев, а/я 152 Для читателей Более подробную информацию об этой и других книгах издательства Sams Publishing можно получить на Интернет-сайте www. nowellpress.com. Для поиска информации о книгах введите в поисковое поле код ISBN (без соединительных чер- точек) или название книги. |