Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#15| Dragon God
Demon's Souls |#14| Flamelurker
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Стивенс Ал. Весь текст 495.21 Kb

Техника программирования на турбо-С

Предыдущая страница Следующая страница
1 ... 29 30 31 32 33 34 35  36 37 38 39 40 41 42 43

     Вызов прерывания для завершения процесса.(PSP:0)
     ------------------------------------------------

     Это поле   содержит   команду  INT  0x20;  это  сделано  для
поддержки программ,  перенесенных из CP/M в ДОС. В CP/M программа
завершает свое выполнение переходом на свой нулевой адрес.

     Сегментный адрес верхней границы памяти.(PSP:2)
     -----------------------------------------------

     При выполнении  программы ДОС выделяет ей участок памяти,  в
который программа загружается. Это поле содержит сегментный адрес
конца этого участка памяти.


     Адрес обработчика завершения.(PSP:0xa)
     --------------------------------------

     При выполнении программы ДОС запоминает  текущее  содержание
вектора прерывания  0х22 в этом поле.  После завершения программы
ДОС восстанавливает  значение,   используя   это   поле.   Вектор
прерывания  0х22  указывает  на  системный  обработчик завершения
программ.


     Адрес обработчика Ctrl-Break.(PSP:0xe)
     --------------------------------------

     При выполнении программы ДОС запоминает  текущее  содержание
вектора прерывания  0х23 в этом поле.  После завершения программы
ДОС  восстанавливает  значение,  используя   это   поле.   Вектор
прерывания 0х23 указывает на системный обработчик Ctrl-Break.


     Адрес обработчика критических ошибок.(PSP:0x12)
     -----------------------------------------------

     При выполнении  программы  ДОС запоминает текущее содержание
вектора прерывания 0х24 в этом поле.  После завершения  программы
ДОС   восстанавливает   значение,   используя  это  поле.  Вектор
прерывания 0х24 указывает  на  системный  обработчик  критических
ошибок.

     Отметим, что ДОС восстанавливает значения этих трех векторов
при завершении программы и объявлении себя резидентной.  Если TSR
надо перехватывать эти прерывания,  то придется присоединять себя
к ним при каждом вызове.


     Сегментный адрес PSP родителя.(PSP:0x16)
     ----------------------------------------

     Любая программа выполняется в  результате  обращения  другой
программы  к  ДОС.  Обычно  программой-отцом  является  командный
процессор ДОС (COMMAND.COM),  хотя  любая  программа  может  быть
родителем любой другой.  Это поле в PSP содержит сегментный адрес
PSP программы-отца.

     У командного процессора нет "папаши", поэтому это поле в PSP
командного процессора содержит сегментный адрес собственного PSP,
что является указателем на самого себя.

     Таблица указателей файлов.(PSP:0x18)
-----------------------------------------------------------------

     Это поле представляет  собой  массив  в  20  байт,каждый  из
которых представляет указатель файла(file handler).  При открытии
файла в программе ДОС возвращает  в  программу  номер  файла  для
использования  при  обращении к ДОС для записи в файл и чтения из
него.  (Программы на Си, использующие потоковый ввод-вывод, прямо
не  обращаются  к  этим  номерам - они используют указатель FILE,
определенный в stdio; однако стандартные библиотечные функции Си,
поддерживающие такой ввод-вывод, используют эти номера скрытым от
вызывающей программы способом.) Эти номера файлов - номера байт в
таблице   указателей  файлов,  а  элементы  этой  таблицы  хранят
значения,  указывающие  на  соответствующую  файлу  структуру   в
системных таблицах управления файлами.


     Сегментный адрес области системных параметров.(PSP:0x2c)
     --------------------------------------------------------

     Это поле   содержит   сегментный   адрес  области  системных
параметров,  создаваемой ДОС для выполняемой  программы.  Область
системных    параметров   -   это   выделенный   задаче   участок
памяти, который может быть освобожден,  если значения  параметров
не используются.


     Адрес стека на время вызова функции ДОС.(PSP:0x2e)
     --------------------------------------------------

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


     Размеры таблицы указателей файлов.(PSP:0x32)
     --------------------------------------------

     Это поле  содержит  счетчик  количества  вхождений в таблицу
указателей файлов. Обычно его значение равно 20. Заметим, что это
поле не используется в версиях ДОС до 3.0.


     Адрес таблицы указателей файлов.(PSP:0x32)
     ------------------------------------------

     Это поле  содержит  полный  (long)  адрес таблицы указателей
файлов;  сегмент этого адреса равен сегменту PSP;  а  смещение  -
0х18. Заметим, что это поле не используется в версиях ДОС до 3.0.

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

     Блок управления файлом #1.(PSP:0x5c)
     ------------------------------------

     Это поле  содержит блок управления файлом,  который строится
ДОС  в  случае,  если  в  командной  строке  в  качестве  первого
параметра было указано имя файла.


     Блок управления файлом #2.(PSP:0x6c)
     ------------------------------------

     Это поле  содержит блок управления файлом,  который строится
ДОС  в  случае,  если  в  командной  строке  в  качестве  второго
параметра было указано имя файла.

     Предыдущие два   поля   созданы   для   поддержки  программ,
конвертированных из CP/M.


     Остаток командной строки/Дисковый буфер.(PSP:80)
     ------------------------------------------------

     Последнее поле  также  создано  под  влиянием  CP/M.   После
запуска программы все, что находилось в командной строке, начиная
со второго символа после имени программы,  строится в виде строки
слов и  записывается  в  это  поле.  Лишние пробелы удаляются.  В
первый байт поля записывается количество символов в  этой строке.

     Во время  выполнения  программы  это  поле  служит  дисковым
буфером  для  работы  с  файлами  при  помощи старых функций ДОС,
использующих блоки   управления   файлами.   Это    поле    также
используется функциями ДОС, работающими с дисковыми каталогами.


     Контекстное переключение PSP.
     -----------------------------

     У каждой  программы  есть  свой PSP.  Но ДОС известен только
один PSP - находящийся перед  программой,  запущенной  последней.
Программа  в  ДОС может порождать выполнение другой программы,  и
программы-дети могут наследовать значения из  PSP  "папаши",  но,
так как ДОС знает только об одной активной задаче, то и только об
одном PSP.

     PSP содержит несколько интересных полей, но самое интересное
для   дальнейшего  обсуждения  -  это  массив  из  20  указателей
файлов. Программа может открыть  до  20  файлов  одновременно.  С
каждым   файлом  ассоциируется  указатель,  являющийся  элементом
массива в PSP.  В этом массиве есть место для  20  указателей,  и
первые пять из них отданы для логических устройств stdin, stdout,
stderr, stdaux,  stdprn.  При  открытии  файлов  новые  указатели
записываются  в  массив,  неиспользуемые  позиции  массива  имеют
значение -1. К файлам программа обращается по номерам указателя в
массиве,  а в элементе массива с таким номером хранится ссылка на
соответствующую  структуру  в   системных   таблицах   управления
файлами.

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

     Разрешить эту проблему можно следующим образом:

     - не  открывать файлов во время инициализации TSR-программы;
открывать их после вызова и прерывания  другой  программы.  Тогда
для  файлов  TSR-программы  будут  использоваться указатели в PSP
прерванной программы.

     - не использовать работу с  указателями  файлов  ДОС  2.0  и
выше. Пользоваться  FCB(File  Control  Block)  из  ДОС  1.1.  Эти
функции не используют PSP.  Таблицы FCB строятся в области данных
программы, использующих файлы.

     - переключить    системный    указатель   PSP   при   вызове
TSR-программы на ее PSP,  и после отработки вернуть все  на  свои
места.

     Каждое из этих решений имеет свои недостатки:

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

     - Использование     функций     с     FCB     имеет      два
недостатка. Во-первых,  файлы,  открываемые с помощью FCB, должны
быть в текущем подкаталоге. Пути для спецификации файла указывать
нельзя. Во-вторых,  все стандартные библиотечные функции Турбо Си
для работы с  файлами  предполагают  использование  более  гибких
указателей. Для  использования  FCB  вы  должны  создать функции,
эквивалентные стандартным open, close, read, write, fclose, fget,
fput, fprintf и т.д.

     - Не  имеется  документированной  функции  ДОС для изменения
адреса PSP.  Есть документированная функция для  чтения  текущего
PSP (INT 0x21, функция 0x62), но она доступна только в ДОС версии
3.0 и выше.  Две функции  ДОС  (0х50  и  0х51),  не  описанные  в
документации,  устанавливают  и  записывают  адрес  PSP,  но  они
недоступны для использования резидентными программами в ДОС 2.0 и
2.1. Они разделяют стек с некоторыми функциями ДОС, которые могут
быть прерваны   резидентной   программой.   Если    TSR-программа
использует   функции   0х50   и   0х51  в  этом  случае,  система
зависнет. Эти функции можно использовать только с ДОС  версий 3.0
и выше. Адрес PSP называется идентификатором процесса (Process ID
- PID).  Две скрытые функции ДОС носят название GetPID  (получить
идентификатор процесса)   и   SetPID   (установить  идентификатор
процесса).

     Ни одно из  этих  решений  не  является  удовлетворительным.
Необходимы работающие заменители функций GetPID и SetPID. Одно из
решений - экспериментально определить адрес,  куда ДОС записывает
PID. Этот  адрес,  конечно,  зависит  от  версии ДОС и может быть
уникальным даже при использовании одной версии ДОС. Использование
таких значений является опасным решением.

     Лучшим является  определение  адреса PID оперативно во время
выполнения TSR-программы.  Найти адреса, куда ДОС записывает PID,
можно, используя   следующую   процедуру.  Сначала,  текущий  PID
восстанавливается с  использованием  функции  GetPID.  Затем   по
памяти,  занимаемой  ДОС,  осуществляется  поиск  копии  значения
PID. Как только такое значение находится,  его адрес запоминается
и PID изменяется на какое-либо значение с помощью функции SetPID.
Значение по найденному адресу  анализируется  на  нахождение  там
нового значения.  Если  это так,  то обнаружен адрес,  куда в ДОС
записывается PID,  и он запоминается. Первоначальное значение PID
восстанавливается, и   поиск  продолжается.  Версии  ДОС  до  3.0
сохраняют PID в двух местах.  Версии от 3.0 и  выше  поддерживают
одно значение   PID.   Адреса   PID  и  PID  самой  TSR-программы
Предыдущая страница Следующая страница
1 ... 29 30 31 32 33 34 35  36 37 38 39 40 41 42 43
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама