[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
                       ИНФОРМАЦИЯ ДЛЯ PDP 11/70
                    Документация и редактор связей

Введение
Руководства пользователя ОС UNIX+ содержит несколько страниц,
помеченных (только для PDP-11).  Эти дополнительные страницы описывают
некоторые наиболее важные отличия программирования в ОС UNIX на этом
процессоре.
Компиляция - Редактор связей
По умолчанию после компиляции программы на PDP 11/70 создается файл
a.out, в котором текст и данные объединены и должны вместе занимать не
более 64 Кбайт. К тому же, весь этот сегмент является модифицируемым.
Для файла a.out для этого процессора имеется отдельная страница в
описании (см. a.out(4)). Системный код файла для такой компиляции
равен 407.
Опции редактора связей
Две следующие опции предоставляют возможность сделать текстовый
сегмент программы защищенным от записи и, как результат, разделяемым.
Обратите внимание на отличия:
-n        Область  данных   размещается  на  границе  первого  участка
          памяти, кратного  4К слов  (8К байт), следующего за текстом.
          Системный код файла для такой опции равен 410.

-i        Когда a.out  выполняется, текст  и данные будут находиться в
          раздельных областях. Каждая начинается с виртуального адреса
          0 и  может иметь  размер до 64Кбайт. Системный код файла для
          этой опции равен 411.

Разрешение внешних ссылок из библиотек
Редактор связей для PDP 11/70 работает с библиотекой несколько
отличным образом, чем редакторы связей на 32-битных компьютерах.
Функции для разрешения незамкнутых ссылок в программе извлекаются из
библиотеки. Если функция из библиотеки ссылается на другую функцию из
этой же библиотеки, искомая функция должна находится ниже ссылающейся.
Таким образом, порядок объектных процедур в библиотеке на PDP 11/70
является важным.
Пользовательское пространство  множественного доступа (MAUS - Multiple
Access User Spase)

Реализация разделяемой  памяти, описанная  в  этом  курсе  (shmget(2),
sgmop(2), shmctl(2))  применима только  для 32-битных процессоров.  На
16-битных  машинах,   таких  как   миникомпьютер  PDP   11/70   должно
использоваться MAUS.

Старое Руководство пользователя ОС UNIX+ описывает соответствующие
системные вызовы на странице maus(2). Системные вызовы очень схожи с
32-битными вызовами, но их реализация отличается. Размеры сегментов
памяти MAUS устанавливаются во время конфигурации системы. Создаются
такие точки входа как /dev/maus0 и /dev/maus1. Права доступа и
владельца таких MAUS-устройств можно изменить соответственно с помощью
команд chmod и chown. Так как MAUS-сегменты являются сегментами
закрепленной памяти, их владельца может назначить администратор
системы.
Выделение MAUS
Сегменты пользовательского пространства множественного доступа
выделяются при конфигурировании системы. Имеется ограниченное число
сегментов - десять вполне достаточное число. Эти сегменты являются
байт-ориентированными специальными файлами; они обычно именуются
/dev/maus0, /dev/maus1 и т.д.
У них всегда тот же тип устройства, что и у /dev/mem, и номер
устройства 8 или выше.
Размер MAUS
Вдобавок к тому, что число разделяемых сегментов фиксировано, каждый
сегмент имеет фиксированный, заранее определенный размер. Имена
доступных сегментов и их размеры могут задаваться в файле
/usr/include/opt.h. Ниже представлено содержимое этого файла:
struct mausmap mausmap[] = {
     0,     16,     /* 1K byte region */
     16,    16,     /* 1K byte region */
     32,    16,     /* 1K byte region */
     48,    16,     /* 1K byte region */
     46,    16,     /* 1K byte region */
     80,    16,     /* 1K byte region */
     96,    16,     /* 1K byte region */
     112,   16,     /* 1K byte region */
     128,   128,    /* 8K byte region */
     256,   128,    /* 8K byte region */
     1,     -1
};

Первая колонка - относительное положение. Вторая колонка - количество
выделяемой памяти в "кликах" (64 байта на DIGITAL 11/70 = 1 "клик"
(click))
Системные вызовы MAUS
Следующие страницы посвящены системным вызовам, которые используются
при работе с  MAUS-сегментами.
Получить MAUS-дескриптор - getmaus(2)
После того как вы выбрали MAUS-сегмент, который вы хотели бы
использовать, вы можете получить дескриптор MAUS-сегмента. Системный
вызов getmaus возвращает это значение. Вызов getmaus аналогичен
системному вызовы open.
Первый аргумент getmaus является указателем на путевое имя сегмента,
как например, /dev/maus1. Второй аргумент - oflag - флаг открытия,
который показывает, хотите ли вы открыть сегмент для чтения, записи
или того и другого. В отличие от разделяемой памяти на 32-битных
компьютерах, пользователь не может установить права на чтение/запись.
Как и дескриптор файла, MAUS-дескриптор наследуется при вызовах exec и
fork.
Не более 8 MAUS-дескрипторов может быть открыто одновременно.
Присоединить MAUS-сегмент - enabmaus(2)
Системный вызов enabmaus требует в качестве аргумента mausdes,
полученный при удачном вызове getmaus. Вызов enabmaus(2) возвращает
виртуальный адрес, который затем используется для отображения в MAUS-
сегмент. После того как MAUS присоединен, на него могут быть сделаны
адресные ссылки, начиная с адреса, возвращенного  enabmaus, вплоть до
размера сегмента. Этот системный вызов аналогичен shmat(2) на 32-
битных компьютерах.
Отсоединить MAUS-сегмент - dismaus(2)
Используя системный вызов dismaus, вы можете отсоединить MAUS-сегмент
от адресного пространства процесса. Передаваемый в качестве аргумента
addr должен соответствовать адресу, полученному ранее с помощью
enbamaus(2). При удачном завершении, dismaus возвращает дескриптор,
связанный с сегментом. Этот вызов аналогичен shmdt(2) для 32-битных
процессоров.
Освободить MAUS-дескриптор - freemaus(2)
После того как вы поработали с MAUS-сегментом, его следует освободить.
Системный вызов freemaus используется для освобождения MAUS-сегмента.
Ему нужен один аргумент - дескриптор MAUS-сегмента, связанного с
освобождаемым (закрываемым) сегментом.
Фрагмент программы, использующей maus(2)
Следующий пример демонстрирует использование системных вызовов при
работе с пользовательским пространством множественного доступа:
#include <sys/fcntl.h>
...
main()
{
     int mausdes;
     char *saddr;
...
     mausdes=getmaus("/dev/maus1");
     saddr=enabmaus(mausdes);
/* initialise from saddr for size <= size of /dev/maus1 */
...
/* use maus */
...
     dismaus(saddr);     /* free maus from data segment */
     freemaus(mausdes);  /* close maus descriptor */
...
}