Андрей Робачевский - Операционная система UNIX
- Название:Операционная система UNIX
- Автор:
- Жанр:
- Издательство:BHV - Санкт-Петербург
- Год:1997
- Город:Санкт-Петербург
- ISBN:5-7791-0057-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Андрей Робачевский - Операционная система UNIX краткое содержание
Книга посвящена семейству операционных систем UNIX и содержит информацию о принципах организации, идеологии и архитектуре, объединяющих различные версии этой операционной системы.
В книге рассматриваются: архитектура ядра UNIX (подсистемы ввода/вывода, управления памятью и процессами, а также файловая подсистема), программный интерфейс UNIX (системные вызовы и основные библиотечные функции), пользовательская среда (командный интерпретатор shell, основные команды и утилиты) и сетевая поддержка в UNIX (протоколов семейства TCP/IP, архитектура сетевой подсистемы, программные интерфейсы сокетов и TLI).
Для широкого круга пользователей
Операционная система UNIX - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Символьная информация состоит из таблицы символов (symbol table) и таблицы строк (string table). В первой таблице хранятся символы, их адреса и типы. Например, мы можем определить, что символ locptr
является указателем и его виртуальный адрес равен 0x7feh0. Далее, используя этот адрес, мы можем выяснить значение символа для выполняющегося процесса. Записи таблицы символов имеют фиксированный размер. Если длина символа превышает восемь знаков, его имя хранится во второй таблице — таблице строк. Обычно обе эти таблицы присутствуют в объектных и исполняемых файлах, если они явно не удалены, например, командой strip(1) .
Как и в случае ELF-файла, заголовок содержит общую информацию, позволяющую определить местоположение остальных компонентов (табл. 2.5).
Таблица 2.5. Поля заголовка COFF-файла
Поле | Описание |
---|---|
f_magic |
Аппаратная платформа, для которой создан файл |
f_nscns |
Количество разделов в файле |
f_timdat |
Время и дата создания файла |
f_symptr |
Расположение таблицы символов в файле |
f_nsyms |
Количество записей в таблице символов |
f_opthdr |
Размер заголовка |
f_flags |
Флаги, указывающие на тип файла, присутствие символьной информации и т.д. |
Заголовок COFF присутствует в исполняемых файлах, промежуточных объектных файлах и библиотечных архивах. Каждый исполняемый файл кроме заголовка COFF содержит заголовок a.out, хранящий информацию, необходимую ядру системы для запуска программы [16] В SCO UNIX заголовок a.out самого ядра используется программой начальной загрузки /boot для запуска ядра и передачи ему управления при инициализации системы.
(табл. 2.6).
Таблица 2.6. Поля заголовка a.out
Поле | Описание |
---|---|
vstamp |
Номер версии заголовка |
tsize |
Размер раздела инструкций (text) |
dsize |
Размер инициализированных данных (data) |
bsize |
Размер неинициализированных данных (bss) |
entry |
Точка входа программы |
text_start |
Адрес в начала сегмента инструкций виртуальной памяти |
data_start |
Адрес в начала сегмента данных виртуальной памяти |
Все файлы формата COFF имеют один или более разделов, каждый из которых описывается своим заголовком. В заголовке хранится имя раздела (.text, .data, .bss или любое другое, установленное соответствующей директивой ассемблера), размер раздела, его расположение в файле и виртуальной адрес после запуска программы на выполнение. Заголовки разделов следуют сразу за заголовком файла.
Таблицы символов и строк являются основой системы отладки. Символом является любая переменная, имя функции или метка, определенные в программе.
Каждая запись в таблице символов хранит имя символа, его виртуальный адрес, номер раздела, в котором определен символ, тип, класс хранения (автоматический, регистровый и т.д.). Если имя символа занимает больше восьми байт, то оно хранится в таблице строк. В этом случае в поле имени символа указывается смещение имени символа в таблице строк.
С помощью символьной информации можно определить виртуальный адрес некоторого символа. Одним из очевидных применений этой возможности является использование символьной информации в программах- отладчиках. Эта возможность используется некоторыми программами, например, утилитой ps(1) , отображающей состояние процессов в системе.
Выполнение программы в операционной системе UNIX
Выполнение программы начинается с создания в памяти ее образа и связанных с процессом структур ядра операционной системы, инициализации и передаче управления инструкциям программы. Завершение программы ведет к освобождению памяти и соответствующих структур ядра. Образ программы в памяти содержит, как минимум, сегменты инструкций и данных, созданные компилятором, а также стек для хранения автоматических переменных при выполнении программы.
Запуск C-программы
Функция main() является первой функцией, определенной пользователем (т. е. явно описанной в исходном тексте программы), которой будет передано управление после создания соответствующего окружения запускаемой на выполнение программы. Традиционно функция main() определяется следующим образом:
main(int argc, char *argv[], char *envp[]);
Первый аргумент ( argc
) определяет число параметров, переданных программе, включая ее имя.
Указатели на каждый из параметров передаются в массиве argv[]
, таким образом, через argv[0]
адресуется строка, содержащая имя программы, argv[1]
указывает на первый параметр и т.д.. до argv[argc-1]
.
Массив envp[]
содержит указатели на переменные окружения, передаваемые программе. Каждая переменная представляет собой строку вида имя_переменной=значение_переменной
. Мы уже познакомились с переменными окружения в главе 1, когда обсуждали командный интерпретатор. Сейчас же мы остановимся на их программной "анатомии".
Стандарт ANSI С определяет только два первых аргумента функции main() — argc
и argv
. Стандарт POSIX.1 определяет также аргумент envp
, хотя рекомендует передачу окружения программы производить через глобальную переменную environ
, как это показано на рис. 2.6:
extern char *environ;
Рекомендуется следовать последнему формату передачи для лучшей переносимости программ на другие платформы UNIX.

Рис. 2.6. Передача переменных окружения
Приведем пример программы, соответствующую стандарту POSIX.1, которая выводит значения всех аргументов, переданных функции main() : число переданных параметров, сами параметры и значения первых десяти переменных окружения.
#include
extern char **environ;
main(int argc, char *argv[]) {
int i;
printf("число параметров, переданных программе %s равно %d\n",
argv[0], argc-1);
for (i=1; i
if (environ[i] != NULL)
printf("environ[%d] : %s\n", i, environ[i]);
}
В результате компиляции будет создан исполняемый файл программы (по умолчанию a.out). Запустив его, мы увидим следующую информацию:
$ a.out first second 3
число параметров, переданных программе a.out равно 3
argv[1] = first
argv[2] = second
argv[3] = 3
environ[0] : LOGNAME=andy
environ[1] : MAIL=/var/mail/andy
environ[2] : LD_LIBRARY_PATH=/usr/openwin/lib:/usr/ucblib
environ[3] : PAGER=/usr/bin/pg
environ[4] : TERM=vt100
environ[5] : PATH=/usr/bin:/bin:/etc:/usr/sbin:/sbin:/usr/ccs/bin:/usr/local/bin
environ[6] : HOME=/home/andy
environ[7] : SHELL=/usr/local/bin/bash
Интервал:
Закладка: