Определение операционной системы 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Определение операционной системы



Введение

Выполнение программы

Содержимое регистров С S и IP, в которых хранится базовый адрес сегмента кодов и смещение очередной команды относительно начала сегмента, определяет физический адрес команды, которая должна быть выполнена на следующем шаге.

По указанному адресу из основной памяти считывается команда и пересылается в микропроцессор. Команда длиной от 1 до 8 байт помещается в очередь команд, откуда поступает в устройство управления, где дешифрируется.

Если при выполнении команды требуются данные, расположенные в основной памяти, то специальные полем кода команды определяется способ адресации и вычисляется исполнительный, и затем и физический адрес данных.

Данные, считанные из основной памяти по указанному адресу, пересылаются в регистр данных или в арифметико-логическое устройство и обрабатываются в соответствии с кодом команды. Результат помещается либо в регистры, либо (в соответствии с командой) в какую-либо область основной памяти.

Если выполненная команда не являлась командой передачи управления, то содержимое регистра IP увеличивается на длину выполненной команды, в противном случае в регистр IP заносится исполнительный адрес команды, которая должна выполняться следующей.

Затем процесс повторяется.

Флажковый регистр

Флажковый регистр микропроцессора i8086, в котором в виде однобитовых признаков по принципу ДА - НЕТ (ВКЛЮЧЕНО - ВЫКЛЮЧЕНО) фиксирует информацию о результатах выполнения некоторых команд, например арифметических.

О   - признак переполнения;

D   - признак направления;

I    - признак прерывания;

Т   - признак трассировки;

S   - признак знака: 1 - число < 0, 0 - число > 0

Z   - признак нуля: 1 - число = 0

А   - признак переноса из тетрады; 

P   - признак четности;

С   - признак переноса.

В последующем эта информация может использоваться, например, командами условной передачи управления.

Система прерываний 32-разрядных микропроцессоров 180x86

В микропроцессорах семейства i80x86 система прерываний построена таким образом, чтобы, с одной стороны, обеспечить возможность создавать эффектив­ные и надежные мультипрограммные операционные системы, которые должны функционировать в защищенном режиме, а с другой стороны — обеспечить воз­можность выполнять программы, разработанные для реального режима. Рас­смотрим коротко оба режима.

В реальном режиме работы система прерываний использует понятие вектора прерывания. Термин «вектор прерываний» используется потому, что для указания адреса используется не одно значение, а два, то есть мы имеем дело не со скалярной величиной, а с «векторной».

Итак, каждый вектор прерываний состоит из 4 байтов или 2 слов: первые два содержат новое значение для регистра IP, а следующие два — новое значение регистра CS. Таблица векторов прерываний занимает 1024 байта. Таким образом, в ней может быть задано 256 векторов прерываний. В процессоре 18086 эта таб­лица располагается на адресах OQOOGH-003FFH. Расположение этой таблицы в про­цессорах i80286 и старше определяется значением регистра IDTR — Interrupt Descriptor Table Register. При включении или сбросе процессора i80x86 этот ре­гистр обнуляется. Однако при необходимости можно в регистре IDTR указать смещение и, таким образом, перейти на новую таблицу векторов прерываний.

Таблица векторов прерываний заполняется (инициализируется) при запуске сис­темы, но в принципе может быть изменена или перемещена.

Каждый вектор прерывания имеет свой номер, называемый номером прерыва­ния, который указывает его место в таблице. Этот номер, помноженный на четы­ре (сдвиг на два разряда влево и заполнение освободившихся битов нулями), и сложенный с содержимым регистра IDTR, дает абсолютный адрес первого бай­та вектора в оперативной памяти.

Подобно вызову процедуры, прерывание заставляет микропроцессор сохранить в стеке информацию для последующего возврата, а затем перейти к группе ко­манд, адрес которых определяется вектором прерывания. Таким образом, преры­вание вызывает косвенный переход к своей подпрограмме обработки за счет по­лучения ее адреса из вектора прерывания.

В IBM PC, как и в других вычислительных системах, прерывания бывают двух видов: внутренние и внешние.

Внутренние прерывания, как мы уже знаем, возникают в результате работы про­цессора. Они возникают в ситуациях, которые нуждаются в специальном обслу­живании, или при выполнении специальных инструкций — INT или INTO. Это следующие прерывания:

¾ U прерывание при делении на ноль; номер прерывания — 0;

¾ G прерывание по флагу TF (trap flag). В этом случае прерывание обычно ис­пользуется специальными программами отладки типа DEBUG, номер прерыва­ния — 1;

¾ Q инструкции INT (interrupt — выполнить прерывание с соответствующим но­мером) и INTO (interrupt if overflow — прерывание по переполнению). Эти пре­рывания называются программными. В качестве операнда команды INT указывается номер прерывания, которое нужно выполнить, например INT 10H.

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

Как известно, прерывания могут быть инициированы внешним устройством ПК или специальной командой прерывания из программы. В любом случае, если прерывания разрешены, то выполняется следующая процедура:

1. В стек помещается регистр флагов.

2. Флаг включения/выключения прерываний IF и флаг трассировки TF, нахо­дящиеся в регистре, обнуляются для блокировки других прерываний и исключения пошагового режима исполнения команд.

3. Значения регистров CS и IP сохраняются в стеке.

4. Вычисляется адрес вектора прерывания, и из вектора, соответствующего но­меру прерывания, загружаются новые значения IP и CS.

Когда системная подпрограмма принимает управление, она может снова разре­шить прерывания командой STI (set interrupt flag, установить флаг прерываний), которая переводит флаг IF в состояние 1, что разрешает микро­процессору вновь реагировать на прерывания, инициируемые внешними устрой­ствами, поскольку стековая организация позволяет вложение прерываний друг в друга.

Закончив работу, подпрограмма обработки прерывания должна выполнить инст­рукцию IRET (interrupt return), которая извлекает из стека три 16-битовых значе­ния и загружает их в указатель команд IP, регистр сегмента команд CS и регистр PSW соответственно. Таким образом, процессор сможет продолжить работу с того места, где он был прерван.

ACCЕМБЛЕР ПЭВМ

 Формат операторов ассемблера

Операторы языка ассемблера ПЭВМ имеют следующий формат:

[<метка>:] <код операции > [<спиcок операндов >1 [<комментарии>].

Запись программы выполняется по свободному формату, т. е. специально не оговариваются правила заполнения каких бы то ни было позиций строки. Точка с запятой в начале строки означает, что данная строка является строкой комментария.

Программа может записываться как заглавными, так и строчными буквами. Метку произвольной длины следует записывать с начала строки и отдалять от кода операции двоеточием, за которым может следовать произвольное количество пробелов (вплоть до конца строки).     

Код операции должен отделяться от списка операндов хотя бы одним пробелом. Операнды отделяются один от другого запятой.

Inc OPND

Здесь OPN D - символическое имя поля памяти, определенного оператором ассемблера

OPN D dw?

При трансляции программы ассемблер заменит символическое имя на исполнительный адрес указанного поля памяти (смещение относительно начала сегмента) и занесет этот адрес на место индексного смещения. Адресация а этом случае выполняется по схеме: B Р + <индексное смещение>, но содержимое регистра ВР при вычислении исполнительного адреса не используется (частный случай).

В отличие от прямого косвенный адрес определяет не местоположение данных в основной памяти, а местоположение компонентов адреса этих данных. В этом случае в команде указываются один или два регистра в соответствии с допустимыми схемами адресации и индексное смещение, которое может задаваться числом или символическим именем. Косвенный адрес заключается в квадратные скобки весь или частично, например:

[OPND +SI]

 OPND [SI]

OPND + [SI]

[ OPND ] +[ SI ]

Приведенные выше формы записи косвенного адреса интерпретируются одинаково.

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

Примечание. При использовании косвенной адресации по схеме ВР + <индексное смещение> индексное смещение не может быть опущено, так как частный случай адресации по данной схеме с нулевой длиной индексного смещения используется для организации прямой адресации. Следовательно, при отсутствии индексного смещения в команде следует указывать нулевое индексное смещение, т.е. [ ВР + 0 ].

Приведем два примера: [ a + bx ] и [ b р ]+[ si ] + 6.

В первом случае исполнительный адрес операнда определяется суммой содержимого регистра b х и индексного смещения, заданного символическим именем " а ", а во втором - суммой содержимого регистров bp, si и индексного смещения, равного 6.

Длина операнда может определяться:

а) кодом команды - в том случае, если используемая команда обрабатывает данные определенной длины, что специально оговаривается;

б) объемом регистров, используемых для хранения операндов (1 или 2 байта);

в) специальными указателями byte ptr (1 байт) и word ptr (2 байта), которые используются в тех случаях, когда длину операнда нельзя установить другим способом. Например,

    mov byte ptr x, 255

т. е. операнд пересылается в поле с именем " х " и имеет длину I байт.

Команды пересылки / преобразования данных

Команда пересылки данных.

  MOV <адрес приемника>,< адрес источника>

используется для пересылки данных длиной I или 2 байта из регистра в регистр, из регистра в основную память, из основной памяти в регистр, а также для записи в регистр или основную память данных, непосредственно записанных в команде.

Приведем примеры:

а) mov ax, bx - пересылка содержимого регистра bx в регистр ax;

б) mov cx, exword - пересылка 2 байт, расположенных     в поле exword, из основной памяти в регистр cx;

в) mov si, 1000 - запись числа 1000 в регистр si;

г) mov word ptr [ di +515], 4 - запись числа 4 длиной 2 байта в основную память по адресу [ di +515].

Для загрузки "прямого" адреса в сегментный регистр используются две команды пересылки:

Mov ax, code

Mov ds, ax

Команда обмена данных.

ХCHG <операнд 1>, <операнд 2>

организует обмен содержимого двух регистров (кроме сегментных) или регистра и поля основной памяти. Например:

xchg bx, cx - обмен содержимого регистров bx и сх.

Команды загрузки указателя.

L DS < регистр >,<операнд 2>

LЕS < регистр >,< операнд 2>

Команда LDS загружает в регистры D S:< регистр> указатель (< адрес сегмента >: < исполнительный адрес >), расположенный по адресу, указанному во втором операнде.

Команда LЕS загружает указатель по адресу, расположенному во втором операнде, в регистры ЕS:< регистр>.

Например:

lds si, exword

т.e. слово (2 байта) по адресу exword загружается в si, а по адресу exword + 2 - в ds.

Команда записи в стек.

PUSH < операнд>

организует запись в стек слова, адрес которого указан в операнде. Например;

p ush dx - запомнить содержимое регистра dx в стеке.

Команды сложения.

ADD <операнд 1>, <операнд 2>

ADC  <операнд 1>, <операнд 2>

устанавливают флаги четности, знака результата, наличия переноса, наличия переполнения.

Ilo команде A D D выполняется сложение двух операндов. Результат записывается по адресу первого операнда. По команде А DC также выполнятся сложение двух операндов, но к ним добавляется еще значение, записанное в бите переноса, установленном предыдущей командой сложения.

Приведем пример сложения двух 32-разрядных чисел:

Mov ax,value1

Add value2,ax

mov ax,value1+2

adc value2+2,ax

Исходные числа находится в основной памяти по адресам value 1 и value 2, а результат записывается по адресу value 1.

Команды вычитания.

SUB <уменьшаемое-результат>, <вычитаемое>

SBB  <уменьшаемое-результат>, <вычитаемое>

устанавливают флаги четности, знака результата, наличия заема, наличия переполнения.

При выполнении операции по команде SUB заем не учитывается, а по команде SBB - учитывается. Ограничения на местоположение операндов такие же, как и у команды сложения.

Команда изменения знака.

NEG <операнд>

знак операнда изменяется на противоположный.

Команда добавления единицы.

INC <операнд>

значение операнда увеличивается на единицу.

Команда вычитания единицы.

D E C <операнд>

значение операнда уменьшается на единицу.

Команда сравнения.

СМ P <операнд 1>, < операнд 2>

выполняется операция вычитания без записи результата и устанавливаются признаки во флажковом регистре.

Команды умножения.

MU L <операнд>

I М UL <операнд>

устанавливают флаги наличия переноса или переполнения.

По команде MU L числа перемножаются без учета, и по команде - I М UL с учетом знака (в дополнительном коде).

Рассмотрим пример:

Imul word ptr c

Здесь содержимое основной памяти по адресу " с" длиной слово умножается на содержимое регистра ax. Младшая часть результата операции записывается в регистр a х, а старшая часть - и регистр dx.

Команда деления.

DI V <операнд-делитель>

I DIV <операнд-делитель>

По команде DI V операция деления выполняется без учета, а по команде I DIV - с учетом знака (в дополнительном коде).

15. Команда преобразования байта в слово, а слова - в двойное слово.

CBW

CWD

По команде CBW число из al переписывается в ax (дополнение выполняется знаковыми разрядами). Аналогично по команде CW D число из ax переписывается в два регистра dx и ax.

Команды условного перехода.

<мнемоническая команда> <адрес перехода>

Мнемоника команд условного перехода:

JZ - переход по "ноль";

J E - переход по "равно";

JN Z - переход по "не нуль";

J NE - переход по "не равно";

JL - переход по "меньше";

JNG, J LE - переход по "меньше или равно ";

JG - переход по "больше";

JNL, J GE - переход по "больше или равно ";

JA - переход по "выше" (беззнаковое больше);

JNA, JBE - переход по "не выше"(беззнаковое не больше);

JB - переход по "ниже" (беззнаковое меньше);

JNB, JAE - переход по"не ниже" (беззнаковое не меньше).

Все команды имеют однобайтовое поле адреса, следовательно, смешение не должно превышать -128...127 байт. Если смещение выходит за указанные пределы, то используется специальный прием:

вместо                                                      программируется

Команды вызова подпрограмм.

1) Команда вызова процедуры.

C A L L <адрес процедуры>

осуществляет передачу управления по указанному адресу, предварительно записав в стек адрес возврата.

При указании адреса процедуры так же как и при указании адреса перехода в командах безусловного перехода, возникает необходимость определить удаленности процедуры от места вызова:

а) если процедура удалена не более чем на -128...127 байт, то специальных указаний не требуется;

б) если процедура удалена в пределах 32 к6ант, то перед адресом по процедуры необходимо указать near ptr,

в) если процедура подпрограмма удалена более, чем на 32 кбайта, то перед адресом процедуры необходимо записать far ptr.

Например:

          call near ptr p - вызов подпрограммы " р ".

Текст процедуры должен быть оформлен в виде:

< имя процедуры> ргос < указатель удаленности>

         ... тело процедуры...

<имя процедуры>   end

Здесь указатель удаленности также служит дли определения длины адресов, используемых при обращении к процедуре: near - при использовании двухбайтовых адресов, far - при использовании четырехбайтовых адресов.

2) Команда возврата управления.

RET [<число>]

извлекает из стека адрес возврата и передает управление по указанному адресу.

Если в команде указано значение счетчика, то после восстановления адреса возврата указанное число добавляется к содержимому регистра-указателя стека. Последний вариант команды позволяет удалить из стека параметры, передаваемые в процедуру через стек.

Команды обработки строк.

Команды обработки строк используются для организации циклической обработки последовательностей элементов длиной I или 2 байта. Адресация операндов при этом выполняется с помощью пар регистров: DS: SI - источник, ES: DI - приемник. Команды имеют встроенную корректировку адреса операндов согласно флагу направления D: 1 - уменьшение адреса на длину элемента, 0 - увеличение адреса на длину элемента. Корректировка выполняется после выполнения операции.

Установка требуемого значения флага направления выполняется специальными командами:

ST D - установка флага направления в единицу,

CLD - сброс флага направления в ноль.

1) Команда загрузки строки LO DS.

LO DSB              (загрузка байта),

LO DSW          (загрузка слова).

Команда загружает байт в А L или слово в AX. Для адресации операнда используются регистры DS: S I

2) Команда записи строки STOS.

STOSB      (запись байта),

ST OSW        (запись слова)

записывает в основную память содержимое A L или АX соответственно. Для адресации операнда используются регистры ES:DI.

3) Команда пересылки MOVS.

MOVSB (пересылка байта),

МО VSW (пересылки слова)

пересылает элемент строки из области, адресуемой регистрами DS: SI, в область, адресуемую регистрами Е S: DI.

4) Команда сканирования строки SCAS.

SCASB    (поиск байта),

SCAS W   (поиск слова).

По команде содержимое регистра AL или АХ сравниваются с элементом строки, адресуемым регистрами DS: SI и устанавливается значение флажков в соответствии с результатом [ DI ] - AL или [ DI ]- AX.

5) Команда сравнения строк CMPS.

СMPSB (сравнение байт),

С MPS W (сравнение слов)

элементы строк, адресуемых парами регистров DS: SI и ES: DI, сравниваются и устанавливаются значения флажков в соответствии с результатом [DI]-[ SI ].

6) Префиксная команда повторения.

REP <команда>

позволяет организовать повторение указанной команды CX раз. Например:

Rep stosb

Здесь поле, адресуемое парой регистров ES: DI длиной CX заполняется содержимым AL.

7) Префиксные команды "повторять, пока равно" и "повторять, пока не равно".

REPE  < команда >

RE PNE   < команда ^

Префиксные команды используются совместно с командами С MPS и SCAS. Префикс REPE означает повторять, пока содержимое регистра СХ не равно нулю и значение флажка нуля равно единице, a RE PNE - повторять, пока содержимое регистра CX не равно нулю и значение флажка нуля равно нулю.

Логические команды.

NOT < операнд >  - логическое НЕ;

AND <операнд 1>, <операнд 2> - лигическое И;

OR <операнд 1>, <операнд 2> - логическое ИЛИ;

XOR <операнд 1>, <операнд 2> - исключающее ИЛИ;

TEST <операнд 1>, <операнд 2> - И без записи результата.

Операнды байты или слова.

Пример. Выделить из числа в AL первый бит:

And al, 10000000 B

Команды сдвига.

< код операции > <операнд>, <счетчик> 

Счетчик записывается в регистр СL. Если счетчик равен 1, то его можно записать в команду.

Коды команд сдвига:

SAL - сдвиг влево арифметический;

SHL - сдвиг влево логический;

SAR - сдвиг вправо арифметический;

SHR - сдвиг вправо логический;

ROL - сдвиг влево циклический;

ROR - сдвиг вправо циклический;

RCL - сдвиг циклический влево с флагом переноса;

RCR - сдвиг циклический вправо с флагом переноса.

Пример. Умножить число в AX на 10:

Mov bx, ax

Shl   ax, 1

Shl   ax, 1

Add ax, bx

shl ax, 1

Команды ввода - вывода.

Обмен данными с внешней средой осуществляемся с помощью следующих команд:

IN <регистр>, <порт> (ввод из порта в регистр),

IN <регистр >, D X (ввод из порта, номер которого указан в регистре D X в регистр);

OUT  <порт>, <регистр> (вывод содержимого регистра в порт),

OUT D X, <регистр>      (вывод содержимого регистра в порт, номер которого указан в регистре DX).

В качестве регистра можно указать AL или AX (соответственно будет обрабатываться байт или два байта). Порт отождествляется с некоторым внешним устройством (0...255).

Однако при организации ввода - вывода помимо самой операции необходимо осуществить ряд дополнительных действий, например, проверить готовность устройства. В связи с этим для типовых устройств разработаны стандартные программы организации ввода - вывода, которые вызываются по команде прерывания int 21 h.

В таблице 1 приведен перечень основные функции, реализуемые подпрограммами ввода - вывода, и их коды. Код функции должен передаваться в подпрограмму в регистре AH.

Таблица 1

Код функции Функция
01 Ввод с клавиатуры одного символа в регистр AL (с проверкой на Ctrl-Break, с ожиданием, с эхо)
02 Вывод одного символа на экран дисплея из регистра DL (с проверкой на Ctrl-Break)
06 Непосредственный ввод - вывод: ввод в регистр AL (без ожидания, без эхо, без проверки на Ctrl-Break, регистр DL должен содержать 0FFH), вывод из регистра DL (без проверки на Ctrl-Break).
07 Ввод в регистр AL (без проверки на Ctrl-Break, с ожиданием, без эхо)
08 Ввод в регистр AL (с проверкой на Ctrl-Break, с ожиданием, без эхо)
09 Вывод строки на экран (DS:DX - адрес строки, которая должна завершаться символом "$")
 10(0Ah) Ввод строки в буфер (DS:DX - адрес буфера, первый байт которого должен содержать размер буфера, после ввода - второй байт содержит количество введенных символов)
11(0Bh) Чтение состояния клавиатуры (если буфер пуст, то AL=0, иначе AL=0FFh)

 

Управление

вводом/выводом и файловые системы

Необходимость обеспечить программам возможность осуществлять обмен дан­ными с внешними устройствами и при этом не включать в каждую двоичную программу соответствующий двоичный код, осуществляющий собственно управ­ление устройствами ввода/вывода, привела разработчиков к созданию системно­го программного обеспечения и, в частности, самих операционных систем. Про­граммирование задач управления вводом/выводом является наиболее сложным и трудоемким, требующим очень высокой квалификации. Поэтому код, позво­ляющий осуществлять операции ввода/вывода, стали оформлять в виде систем­ных библиотечных процедур; потом его стали включать не в системы програм­мирования, а в операционную систему с тем, чтобы в каждую отдельно взятую программу его не вставлять, а только позволить обращаться к такому коду. Сис­темы программирования стали генерировать обращения к этому системному коду ввода/вывода и осуществлять только подготовку к собственно операциям вво­да/вывода, то есть автоматизировать преобразование данных к соответствую­щему формату, понятному устройствам, избавляя прикладных программистов от этой сложной и трудоемкой работы. Другими словами, системы программиро­вания вставляют в машинный код необходимые библиотечные подпрограммы ввода/вывода и обращения к тем системным программным модулям, которые, собственно, и управляют операциями обмена между оперативной памятью и внеш­ними устройствами. Таким образом, управление вводом/выводом — это одна из основных функций любой ОС.

Основные понятия и концепции организации ввода/вывода в ОС

Ввод/вывод считается одной из самых сложных областей проекти­рования операционных систем, в которой сложно применить общий подход из-за изобилия частных методов. Сложность возникает из-за огромного числа уст­ройств ввода/вывода разнообразной природы, которые должна поддерживать ОС. При этом перед создателями ОС встает очень непростая задача — не только обеспечить эффективное управление устройствами ввода/вывода, но и создать удобный и эффективный виртуальный интерфейс устройств ввода/вывода, по­зволяющий прикладным программистам просто считывать или сохранять дан­ные, не обращая внимание на специфику устройств и проблемы распределения устройств между выполняющимися задачами. Система ввода/вывода, способная объединить в одной модели широкий набор устройств, должна быть универсаль­ной. Она должна учитывать потребности существующих устройств, от простой мыши до клавиатур, принтеров, графических дисплеев, дисковых накопителей, компакт-дисков и даже сетей. С другой стороны, необходимо обеспечить доступ к устройствам ввода/вывода для множества параллельно выполняющихся задач, причем так, чтобы они как можно меньше мешали друг другу. Поэтому самым главным является следующий принцип: любые операции по управлению вводом/выводом объявляются привилегированными и могут вы­полняться только кодом самой ОС. Для обеспечения этого принципа в большин­стве процессоров даже вводятся режимы пользователя и супервизора. Как пра­вило, в режиме супервизора выполнение команд ввода/вывода разрешено, а в пользовательском режиме — запрещено. Использование команд ввода/вывода в пользовательском режиме вызывает исключение и управление через механизм прерываний передается коду ОС. Хотя возможны и более сложные системы, в которых в ряде случаев пользовательским программам разрешено непосредст­венное выполнение команд ввода/вывода.

Помимо разделяемых устройств ввода/вывода существуют неразделяемые устройства. Примерами разделяемых устройств могут служить накопитель на магнитных дисках, устройство чтения компакт-дисков. Это устройства с прямым доступом. Примеры неразделяемых устройств — принтер. Операционные системы должны управлять и теми и другими устройствами, предоставляя возможность параллельно решающимся задачам использовать различные устройства ввода/вывода.

Прикладные программы (а в общем случае — все обрабатываю­щие программы) не могут непосредственно связываться с устройствами ввода/ вывода независимо от использования устройств (монопольно или совместно). Установив соответствующие значения параметров в запросе на ввод/вывод, опре­деляющих требуемую операцию и количество потребляемых ресурсов, они могут передать управление супервизору ввода/вывода, который и запускает необходи­мые логические и физические операции.

     Для организации использования многими параллельно выполняющимися задачами устройств ввода/вывода, которые не могут быть разделяемыми, вводится понятие виртуальных устройств. Использование принципа виртуализации позволяет повысить эффективность вы­числительной системы.

Вообще говоря, понятие виртуального устройства шире, нежели использование этого термина для обозначения спулинга (SPOOLing — simultaneous peripheral operation on-line, то есть имитация работы с устройством в режиме «он-лайн»). Главная задача спулинга — создать видимость параллельного разделения устрой­ства ввода/вывода с последовательным доступом, которое фактически должно использоваться только монопольно и быть закрепленным. Например, мы уже го­ворили, что в случае, когда несколько приложений должны выводить на печать результаты своей работы, если разрешить каждому такому приложению печатать строку по первому же требованию, то это приведет к потоку строк, не представ­ляющих никакой ценности. Однако можно каждому вычислительному процессу предоставлять не реальный, а виртуальный принтер и поток выводимых симво­лов (или управляющих кодов для их печати) сначала направлять в специальный файл на магнитном диске. Затем, по окончании виртуальной печати, в соответствии с принятой дисциплиной обслуживания и приоритетами приложений вы­водить содержимое спул-файла на принтер. Системный процесс, который управ­ляет спул-файлом, называется спулером (spool-reader или spool-writer).

 

Основные системные таблицы ввода/вывода

Каждая ОС имеет свои таблицы ввода/вывода, их состав (количество и назначе­ние каждой таблицы) может сильно отличаться. В некоторых ОС вместо таблиц создаются списки, хотя использование статических структур данных для органи­зации ввода/вывода, как правило, приводит к большему быстродействию.

Исходя из принципа управления вводом/выводом через супервизор ОС и учи­тывая, что драйверы устройств ввода/вывода используют механизм прерываний для установления обратной связи центральной части с внешними устройствами, можно сделать вывод о необходимости создания по крайней мере трех систем­ных таблиц.

Первая таблица (или список) содержит информацию обо всех устройствах вво­да/вывода, подключенных к вычислительной системе. Назовем ее условно таб­ лицей оборудования (equipment table), а каждый элемент этой таблицы пусть на­зывается UCB (unit control block, блок управления устройством ввода/вывода). Каждый элемент UCB таблицы оборудования, как правило, содержит следую­щую информацию об устройстве:

· тип устройства, его конкретная модель, символическое имя и характеристики устройства;

· как это устройство подключено (через какой интерфейс, к какому разъему, какие порты и линия запроса прерывания используются и т. д.);

· номер и адрес канала (и подканала), если такие используются для управле­ния устройством;

· указание на драйвер, который должен управлять этим устройством, адрес секции запуска и секции продолжения драйвера;

· информация о том, используется или нет буферирование при обмене данны­ми с этим устройством, «имя» (или просто адрес) буфера, если такой выделя­ется из системной области памяти;

· установка тайм-аута и ячейки для счетчика тайм-аута; а состояние устройства;

· поле указателя для связи задач, ожидающих устройство, и, возможно, много еще каких сведений.

Вторая таблица предназначена для реализации еще одного принципа виртуа­лизации устройств ввода/вывода — независимости от устройства. Желательно, чтобы программист не был озабочен учетом конкретных параметров (и/или воз­можностей) того или иного устройства ввода/вывода, которое установлено (или не установлено) в компьютер. Для него должны быть важны только самые об­щие возможности, характерные для данного класса устройств ввода/вывода, ко­торыми он желает воспользоваться. Например, принтер должен уметь выводить (печатать) символы или графическое изображение. А накопитель на магнитных дисках — считывать или записывать по указанному адресу порцию данных. Хотя чаще всего программист и не использует прямую адреса­цию при работе с магнитными дисками, а работает на уровне файловой системы. Однако в таком случае уже разработчики файловой системы не должны зависеть от того, накопитель какого конкретного типа и модели, а также какого производителя используется в данном конкретном компьютере. Важным должен быть только сам факт существования накопителя, имеющего некоторое количество цилиндров, головок чтения/записи и секторов на дорожке магнитного дискa. Упомянутые значения количества цилиндров, головок и секторов должны быть взяты из элемента таблицы оборудования. При этом для программиста так­же не должно иметь значения, каким образом то или иное устройство подключе­но к вычислительной системе, а не только какая конкретная модель устройства используется. Поэтому в запросе на ввод/вывод программист указывает именно логическое имя устройства. Действительное устройство, которое сопоставляется виртуальному (логическому), выбирается супервизором с помощью таблицы, о которой мы сейчас говорим. Итак, способ подключения устройства, его кон­кретная модель и соответствующий ей драйвер содержатся в уже рассмотренной таблице оборудования. Но для того, чтобы связать некоторое виртуальное уст­ройство, использованное программистом при создании приложения с системной таблицей, отображающей информацию о том, какое конкретно устройство и ка­ким образом подключено к компьютеру, используется вторая системная табли­ца. Назовем ее условно таблицей описания виртуальных логических устройств.

Наконец, третья таблица необходима для организации обратной связи между центральной частью и устройствами ввода/вывода. Это таблица прерываний, ко­торая указывает для каждого сигнала запроса на прерывание тот элемент UCB, который сопоставлен данному устройству, подключенному так, что оно исполь­зует настоящую линию (сигнал) прерывания. Как системная таблица ввода/вы­вода, таблица прерываний может в явном виде и не присутствовать. В современных сложных ОС имеется гораздо больше системных таблиц или списков, используемых для организации процессами управления операциями ввода/вывода. Например, одной из возможных и часто реализуемых информа­ционных структур, сопровождающих практически каждый запрос на ввод/вывод, является блок управления данными (data control block, DCB). Назначение этого DCB — подключение препроцессоров к процессу подготовки данных на ввод/вывод, то есть учет конкретных технических характеристик и используе­мых преобразований. Это необходимо для того, чтобы имеющееся устройство получало не какие-то непонятные ему коды либо форматы данных, которые не соответствуют режиму его работы, а коды, созданные специально под данное устройство и используемый в настоящий момент формат представления данных.

 

Файловые системы



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 26; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.146.105.137 (0.147 с.)