Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

перационная система 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 <syscall.h>
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 <linux/unistd.h>
_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 нужен для борьбы со специальными файлами, но его можно использовать и для обычных.


Оглавление

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог