Logo CitForum CITForum на CD Форумы Газета Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

19.03.2010

Google
WWW CITForum.ru

Новости мира IT:

Архив новостей

Пятнадцатая техническая конференция «Корпоративные базы данных-2010»
Москва, 22–23 апреля

Руководство программиста для Linux

Sven Goldt, Sven van der Meer, Skott Burkett, Matt Welsh

Перевод: Алексей Паутов,
Russian LDP: http://www.botik.ru/~rldp, ftp://ftp.botik.ru/rented/rldp

Данное руководство далеко не полное. Первая версия (0.1) вышла в свет в сентябре 1994 года. По причине отсутствия личного состава и информации акцент был сделан на системных вызовах. Планировалось описание библиотечных функций и существенных изменений ядра, а также экскурс в наиболее важные области, такие как сети, звук, графика и асинхронный ввод/вывод. Может быть, позже будут включены некоторые соображения о том, как создать разделяемые библиотеки и указатели на полезные инструменты.

Введение

Однажды автор инсталлировал Linux на своем ПК, чтобы больше узнать о системе управления. Он пытался инсталировать slip сервер, который не таботал с теневыми программами и mggetty. Пришлось подправить sliplogin и все работало, но до нового релиза Linux 1.1. Никто не смог объяснить что приключилось, а комментарии Расса Нельсона (Russ Nelson) об измиенениях в ядре с версии 0.99 не слишком помогли.

Данное руководство призвано помочь программистам разобраться с особенностями Linux. Оно также освещает проблемы переноса программ с других операционных систем; влияющие на старые программы изменения в ядре и в системных вызовах, такие как последовательный ввод/вывод и работа по сети.

1. Операционная система LINUX

В марте 1991 Л.В.Торвальдс (Linus Benedict Torvalds) купил мультизадачную операционную систему Minux для своего AT 386. Он использовал ее для того, чтобы создать свою собственную мультизадачную ОС, которую назвал Linux. В сентябре 1991 года он распространил по e-mail ее первый прототип среди пользователей Minux. С этого момента многие стали поддерживать Linux, добавляя драйверы устройств, разрабатывая разные продвинутые приложения и учитывая соглашения POSIX. В настоящее время Linux - очень мощная система, но самое замечательное то, что она free. Ведется работа над Linux-ом для других платформ.

2. Ядро LINUX

Ядро является базой LINUX-а. Вы можете как угодно переставлять любую из библиотек, но пока есть ядро есть и LINUX. Оно включает в себя драйвера устройств, механизм распределения памяти, управление процессами и связями. Разработчики ядра стараются следовать рекомендациям POSIX, которые иногда осложняют, а иногда упрощают программирование. И если ваша программа поведет себя иначе на новой версии ядра, то вероятнее всего, в этой версии учтена еще какая-нибудь рекомендация POSIX. Информацию о ядре для программиста можно найти в Linux Kernel Hacker's Guide (Справочное руководство по ядру LINUX для программиста).

3. Библиотека libc

libc: ISO 8859.1, , YP функции, функции кодирования, некоторые базовые теневые программы (по умолчанию не добавлены), ..., старые программы для совместимости с libcompact (по умолчанию не запущены), сообщения об ошибках на английском, французском и немецком, bsd 4.4lite-совместимые программы работы с экраном в libcourses, bsd-совместимые программы в libbsd, программы работы с экраном в libtermcap, поддержка баз данных в libdbm, математика в libm, точка запуска программ в crt0.o (entry to execute programs in crt0.o ??? (-авторский знак)), байт sex-информации в libeee (??? объясните мне, лучше, что это такое, вместо того, чтобы ржать - автор), профилирование пространства пользователя в libgmon.

Автор надеется, что кто-нибудь из разработчиков libc напишет эту главу как положено. Все, что автор может на данный момент сказать, это то, что исполняемый формат a.out собираются поменять на elf (executable and lincable format - исполняемый и собираемый формат), что подразумевает изменения и в разделяемых библиотеках. В настоящий момент поддерживаются оба формата.

Большая часть libc находится под лицензией GNU (Library GNU Public License). Хотя попадаются и специальные исключения, например crt0.o. Для коммерческого использования это означает запрет на статически линкуемые программы. Динамически линкуемые программы, однако, тоже являются специальными исключениями.

4. Системные вызовы

Системный вызов - это требование к ОС (к ядру) произвести аппаратно/системно специфическую или привилегированную операцию. В Linux-1.2 были определены 140 системных вызовов. Такие вызовы, как close() реализованы в Linux libc. Эта реализация часто включает в себя макрос, который в конце концов вызывает syscall(). Параметры, передаваемые syscall-y - это номер системного вызова, перед которым ставятся требуемые аргументы. Номера системных вызовов можно найти в , а обновленные вместе с новой версией libc - в . Если появились новые системные вызовы, но их до сих пор нет в libc, вы можете использовать syscall(). Как пример, рассмотрим закрытие файла при помощи syscall-а (не советуем, однако):

#include
extern int syscall(int,...)
int my_close(int filedescriptor)
{
   return syscall(SYS_close, filedescriptor);
}

На i386 системные вызовы ограничены 5-ю аргументами кроме номера вызова из-за аппаратного числа регистров. На другой архитектуре вы можете поискать макрос _syscall в и там посмотреть сколько аргументов поддерживается у вас или $how many developers chose to support$. Макросами _syscall можно пользоваться вместо syscall(), но это не рекомендуется, поскольку макрос может развернуться в функцию, которая уже существует в библиотеке. Поэтому только ядреные хакеры имеют право поиграться с _syscall-ом :). Для демонстрации посмотрим на пример close(), использующий макрос _syscall.

#include
_syscall1 (int, close, int, filedescriptor);
     _syscall1 раскрывается в функцию close(), и мы получаем твикс:
один close() в libc и один в нашей программе.

Возвращаемое syscall()-ом (или _syscall-ом) значение есть -1, если вызов неудачен и 0 или больше в случае успеха. В случае неудачи ошибку можно определить по глобальной переменной errno.

Приведем системные вызовы, возможные в BSD и SYS V, но не допустимые в LINUX: audit(), audition(), fchroot(), getauid(), getdents(), getmsg(), mincore(), poll(), putmsg(), setaudit(), setauid().

5. ioсtl

iotcl предназначен для контроля ввода/вывода и используется для манипуляций с устройством через файловый дескриптор. Формат ioсtl:

ioсtl(unsigned int fd, unsigned int request, unsigned long argument)

Возвращаемое значение есть -1 в случае ошибки, 0 и больше если команда (request) прошла так же, как другие системные вызовы. Ядро различает специальные и регулярные файлы. Специальные файлы в основном находятся в /dev и /proc. Они отличаются от регулярных файлов тем, что прячут свое описание в драйвер, тогда как регулярные файлы содержат текст или двоичные данные. Эта философия UNIX-а, которая позволяет вводить/выводить из любого файла. Но если вам хочется сделать что-нибудь особенное со специальным файлом, вы можете это сделать при ioсtl. В основном ioсtl нужен для борьбы со специальными файлами, но его можно использовать и для обычных.

Содержание | Вперед

 

Последние комментарии:

Я не верю в iPad (69)
19 марта, 12:17

Подписка на новости CITForum.ru

Новые публикации:

10 марта

  • HadoopDB: архитектурный гибрид технологий MapReduce и СУБД для аналитических рабочих нагрузок

  • Классификация OLAP-систем вида xOLAP

  • BGP. Три внешних канала. Балансировка исходящего и входящего трафиков

    Газета:

  • Что мы знаем об iPhone 4G?

    17 февраля

  • MapReduce и параллельные СУБД: друзья или враги?

  • Объектно-ориентированное программирование в ограничениях: новый подход на основе декларативных языков моделирования данных

  • Системологический подход к декомпозиции в объектно-ориентированном анализе и проектировании программного обеспечения

    Газета:

  • Эволюция Wine

    3 февраля

  • Дом на песке

  • Реальное переосмысление "формальных методов"

  • Интервью с Найджелом Пендзом

    Газета:

  • iPad. Первый взгляд на долгожданный планшет от Apple

  • Я не верю в iPad

    20 января

  • SQL/MapReduce: практический подход к поддержке самоописываемых, полиморфных и параллелизуемых функций, определяемых пользователями

  • Данные на лету: как технология потокового SQL помогает преодолеть кризис

    Обзоры журнала Computer:

    2 декабря

  • Сергей Кузнецов. Год эпохи перемен в технологии баз данных

    18 ноября

  • Генерация тестовых программ для подсистемы управления памятью микропроцессора

  • Сравнительный анализ современных технологий разработки тестов для моделей аппаратного обеспечения

    11 ноября

  • Генерация оптимизированных для ручного выполнения сценариев тестирования приложений с графическим интерфейсом пользователя

  • Применение технологии UniTESK для функционального тестирования инфаструктурного ПО Грид

    28 октября

  • Remoting с сервером на Unmanaged C++ или Вторая жизнь старых приложений

  • Методы обеспечения переносимости ПО

  • Организация сложных тестовых наборов

    22 октября

    Обзоры журнала Computer:

    14 октября

  • МОГучие способности: новые приемы анализа больших данных

  • Учимся регулярно выражаться

    8 октября

  • Записки исследователя NTFS

  • Создание кросс-платформенных графических интерфейсов на wxPerl

    Все публикации >>>


  • IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

    Информация для рекламодателей PR-акции, размещение рекламы — тел. +7 495 6608306, ICQ 232284597 Пресс-релизы — pr@citforum.ru
    Послать комментарий
    Информация для авторов

    Редакция раздаёт котят!

    Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
    Copyright © 1997-2000 CIT, © 2001-2009 CIT Forum
    Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...