Dos fn 49h освободить распределенный блок памяти


Содержание

Справочник программиста на персональном компьютере фирмы IBM. Системные ресурсы
Страница 15. Манипуляции с памятью

1.3.1 Манипуляции с памятью.

Когда MS DOS загружает программу, то она помещается в младшую
область памяти, сразу же за COMMAND.COM и установленными драйве-
рами устройств или другими утилитами, которые резидентны в памя-
ти. В этот момент времени вся память за программой отведена этой
программе. Если программе нужна память для создания области дан-
ных, то она может приближенно вычислить где в памяти кончается ее
код и затем поместить требуемую область данных в любое место за
концом кода. Для определения адреса конца программы поместите в
конце программы псевдосегмент типа:
ZSEG SEGMENT
;
ZSEG ENDS
В ассемблере IBM PC ZSEG будет последним сегментом, так как
сегменты располагаются в алфавитном порядке. С другими ассембле-
рами нужно действительно поместить эти строки в конце программы.
В самой программе достаточно поставить оператор MOV AX,ZSEG и AX
будет указывать на первый свободный сегмент памяти за программой.
Такой подход будет работать до тех пор, пока программа не
будет предполагать о наличии памяти, которой на самом деле нет.
Он не будет также работать в многопользовательской среде, когда
несколько программ могут делить между собой одну и ту же область
адресов. Для решения этой проблемы MS DOS имеет возможность отс-
леживать 640K системной памяти и отводить по требованию программы
блоки памяти любого размера. Блок памяти — это просто непрерывная
область памяти, его максимальный размер определяется размером
доступной памяти, в частности, он может быть больше одного сег-
мента (64K). Если затребован слишком большой блок, то DOS выдает
сообщение об ошибке. Любая возможность перекрытия блоков исключе-
на. Кроме того MS DOS может освобождать, урезать или расширять
существующие блоки. Хотя программа не обязана использовать эти
средства, но удобно и предусмотрительно делать это. Некоторые
функции DOS требуют, чтобы были использованы средства управления
памятью DOS, например, завершение резидентной программы [1.3.4]
или вызов другой программы из данной [1.3.2].
Прежде чем отвести память, существующий блок (вся память от
начала программы до конца) должен быть обрезан до размера прог-
раммы. Затем, при создании блока, DOS создает 16-байтный управ-
ляющий блок памяти, который расположен непосредственно перед
блоком памяти. Первые 5 байтов этого блока имеют следующее значе-
ние:
байт 0 ASCII 90 — если последний блок в цепочке, иначе
ASCII 77.
байты 1-2 0 если блок освобожден
байты 3-4 размер блока в 16-байтных параграфах
DOS обращается к блокам по цепочке. Адрес первого блока хра-
нится во внутренней переменной. Значение этой переменной позво-
ляет DOS определить положение первого отведенного блока, а из
информации, содержащейся в нем, может быть найден следующий блок
и т.д., как показано на рис. 1-4. Как только Вы начали использо-
вать систему распределения памяти DOS, то Вы обязаны придержи-
ваться ее. Если программа изменит содержимое управляющего блока,
то цепочка будет разорвана и DOS начнет выдавать сообщения об
ошибке.
MS DOS обеспечивает три функции распределения памяти, номера
от 48H до 4AH прерывания 21H. Функция 48H отводит блок памяти, а
49H — освобождает блок памяти. Третья функция («SETBLOCK») ме-
няет размер памяти, отведенной для программы; эта функция должна
быть использована перед двумя остальными. После ее выполнения
можно спокойно отводить и освобождать блоки памяти. Программа
должна освободить все отведенные ею блоки перед завершением.
Иначе эта память будет недоступной для последующего использова-
ния.

Средний уровень.

Все три функции распределения памяти прерывания 21H используют
16-битный адрес начала блока памяти, с которым они оперируют.
Этот адрес соответствует сегменту, с которого начинается блок
(блок всегда начинается со смещения 0 данного сегмента). Таким
образом реальный адрес ячейки начала блока равен этому адресу,
умноженному на 16. Также, для всех трех функций, BX содержит
число 16-байтных разделов памяти (параграфов), которые будут
отводиться или освобождаться. Если функция не может быть выполне-
на, то устанавливается флаг переноса, а в AX возвращается код
ошибки, объясняющий причину. Возможны три кода ошибки:
7 разрушен управляющий блок памяти
8 недостаточно памяти для выполнения функции
9 неверный адрес блока памяти
Функция отведения блока использует коды 7 и 8, а освобождения — 7
и 9, в то время как функция изменения блока использует все три
кода. В следующем примере сначала отводится блок, размером 1024
байта. При этом BX содержит требуемое число 16-байтных парагра-
фов, а при завершении стартовый адрес блока равен AX:0 (т.е.
смещение 0 в сегменте со значением, содержащимся в AX). Вторая
часть примера освобождает этот же блок, как и требуется при за-
вершении программы. В данном случае значение полученное в AX
помещается в ES. DOS следит за размером блока и знает какое коли-
чество параграфов надо освободить.
;—отведение блока размером 1024 байта
MOV AH,48H ;номер функции
MOV BX,64 ;требуем 64 параграфа
INT 21H ;пытаемся отвести блок
JC ERROR ;обрабатываем ошибку в случае неудачи
MOV BLOCK_SEG,AX;иначе сохраняем адрес блока
.
;—освобождаем тот же блок
MOV AX,BLOCK_SEG ;получаем стартовый адрес блока
MOV ES,AX ;помещаем его в ES
MOV AH,49H ;номер требуемой функции
INT 21H ;освобождаем блок памяти
Наконец, приведем пример использования функции 4AH. ES содер-
жит значение сегмента PSP, т.е. самого первого байта памяти, с
которого загружена программа. Это значение присваивается ES при
старте задачи. Для использования SETBLOCK надо либо вызывать эту
функцию в самом начале программы (прежде чем ES будет изменен),
либо сохранить его начальное значение для последующего использо-
вания.
BX содержит требуемый размер блока в 16-байтных параграфах.
Для определения этого размера поместите добавочный «искуственный»
сегмент в конец программы. В макроасссемблере IBM PC сегменты
располагаются в алфавитном порядке, поэтому Вы можете поместить
его в любое место программы, при условии, что его имя это что-то
вроде «ZSEG». В других ассемблерах действительно помещайте фик-
тивный сегмент в конец программы. Программа может прочитать пози-
цию этого сегмента и, сравнивая ее со стартовым сегментом, полу-
чить количество памяти, требуемое самой программе. В момент заг-
рузки программы и ES и DS содержат номер параграфа самого начала
программы в префиксе программного сегмента; для COM файлов CS
также указывает на эту позицию, но для EXE файлов это не так.
;—освобождение памяти (ES имеет значение при старте)
MOV BX,ZSEG ;получаем # параграфа конца программы + 1
MOV AX,ES ;получаем # параграфа начала программы
SUB BX,AX ;вычисляем размер программы в параграфах
MOV AH,4AH ;номер функции
INT 21H ;освобождаем память
JC MEMORY_ERROR ;проверяем на ошибку
;—
ZSEG SEGMENT
ZSEG ENDS

Dos fn 49h: освободить распределенный блок памяти

Автор: Рустам Гадеев, 15 May 98

Если вы заметили в документе
опечатки или неточности перевода,
просьба сообщить о них!
Перевод на русский язык и оформление:
Валерий Вотинцев

3.2. РАСШИРЕННЫЙ ИНТЕРФЕЙС DOS INT 21H (EXTENDED DOS API)

Перечень поддерживаемых функций:

09h Вывод строки на консоль Write string to console
1Ah Установить адрес DTA (disk transfer area) Set disk transfer area address
1Bh Получить характеристики текущего диска Get allocation information for default drive
1Ch Получить характеристики указанного диска Get allocation information for specific drive
1Fh Получить DPB (drive parameter block) для текущего диска Get drive parameter block for default drive
25h Установить обработчик прерывания (Set interrupt vector) Set interrupt vector
2Fh Получить адрес DTA (disk transfer area) Get disk transfer area address
32h Получить DPB (drive parameter block) для указанного диска Get drive parameter block for specific drive
34h Получить адрес флага InDos Get address of InDos flag
35h Получить адрес обработчика прерывания Get interrupt vector
39h Создать каталог (директорий) Create subdirectory
3Ah Удалить каталог (директорий) Remove subdirectory
3Bh Изменить текущий каталог Change current directory
3Ch Создать новый файл Create new file
3Dh Открыть существующий файл Open existing file
3Fh Чтение из файла Read from file
40h Запись в файл Write to file
41h Удалить файл с диска Delete file
43h Получить/Установить атрибуты файла Get/set file attributes
44h IOCTL IOCTL
47h Получить имя текущего каталога Get current directory
48h Выделить блок памяти DOS Allocate DOS memory block
49h Освободить блок памяти DOS Free DOS memory block
4Ah Изменить размер блока памяти DOS Resize DOS memory block
4Bh Загрузить и выполнить программы Load and execute child program
4Eh Найти первый файл по маске (Find first) Find first matching file
4Fh Найти следующий файл по маске (Find next) Find next matching file
56h Переименовать файл Rename file
5Ah Создать временный файл Create temporary file
5Bh Создать новый файл Create new file

Подробное описание функций WDOSX для расширенного интерфейса DOS INT 21h:

9h — Вывод строки на консоль

1Ah — Установить адрес DTA (disk transfer area)

1Bh — Получить характеристики текущего диска

MS-DOS для программиста

6.4. Оперативная память

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

Фирма IBM в своем первом персональном компьютере IBM PC использовала процессор Intel 8086, способный непосредственно адресовать 1024 Кбайт оперативной памяти. Из этого адресного пространства фирма IBM использовала для операционной системы и программ 640 Кбайт памяти, зарезервировав оставшиеся 384 Кбайт для системного постоянного запоминающего устройства, дисплейного адаптера и другой аппаратуры.

Однако по мере того, как компьютеры становились все мощнее и мощнее, для них находились новые задачи, требующие все большего объема оперативной памяти. Первоначально заложенного в архитектуру IBM PC объема памяти программ (640 Кбайт) стало недостаточно для решения сложных задач.

С появлением процессора Intel 80286, способного адресовать до 16 Мбайт оперативной памяти, возникли предпосылки для расширения доступного программам адресного пространства. Архитектура компьютера IBM PC/AT позволяет использовать для программ все 16 Мбайт памяти.

Казалось бы, все хорошо, однако даже если ваш компьютер содержит 16 Мбайт оперативной памяти, операционная система MS-DOS без принятия специальных мер может использовать для себя и программ только первые 640 Кбайт. При этом программам пользователя достается обычно не более 500 — 550 Кбайт основной оперативной памяти, остальная память используется MS-DOS для своих собственных нужд.

Это связано с тем, что MS-DOS использует так называемый реальный режим работы процессора 80286. В реальном режиме процессор 80286 становится несколько улучшенным аналогом старого процессора 8086, и может адресовать только первые 1024 Кбайт памяти.

Возникает странная ситуация, когда память есть, но пользоваться ей нельзя!

Распределение памяти в MS-DOS

Для того, чтобы как-то задействовать память, расположенную выше границы 1024 Кбайт (эту память называют расширенной), в старых версиях MS-DOS использовались драйверы электронного диска ramdrive.sys и кеш дисковой памяти smartdrv.sys. Драйвер электронного диска предназначен для организации быстродействующего квазидиска. Этот диск ведет себя так же, как и обычный, но за счет того, что данные пересылаются в оперативную память, такой диск работает очень быстро.

Начиная с версии 5.0 операционная система MS-DOS может использовать расширенную память и для решения других задач.

В частности, в расширенной памяти (вернее, в ее небольшой начальной части размером около 64 Кбайт, называющейся верхней памятью) могут располагаться модули, буферы и рабочие области самой операционной системы. Если в компьютере используется процессор i386 или i486, можно поместить в расширенную память резидентные программы и драйверы.

Если расположить в расширенной памяти MS-DOS резидентные программы и драйверы, для программ останется порядка 600 — 620 Кбайт памяти. Это на 100 — 140 Кбайт больше, чем при использовании старых версий MS-DOS.

А если ваша программа имеет размер 2 Мбайт и к тому же ей требуется обрабатывать массивы данных размером в 1 Мбайт?

Для решения таких задач в среде MS-DOS можно использовать дополнительную память. Эта память располагается на отдельной плате, которая вставляется в слот расширения материнской платы компьютера. Дополнительная память может быть установлена даже в компьютерах, выполненных на базе процессоров 8086 или 8088, которые не могут адресовать память за границей одного Мбайта. Как это может быть?

Здесь все дело в том, что дополнительная память (которая может по размеру достигать 16 или даже 32 Мбайт) отображается с помощью специальных схем в область памяти, лежащую ниже границы 1024 Кбайт, то есть в стандартную память. Для работы с расширенной памятью выделяются 4 окна в области адресов выше границы 640 Кбайт, но ниже 1024 Кбайт. Причем общий размер этих окон составляет 64 Кбайт.

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

При необходимости окна могут двигаться по дополнительной памяти, позволяя программам адресовать весь объем дополнительной памяти.

Запомните: расширенная память и дополнительная память — разные вещи!

  • Расширенная память (extended memory) — лежит в адресном пространстве процессора выше границы 1024 Кбайт, непосредственно адресуется процессорами 80286/i386/i486/Pentium в так называемом защищенном режиме. Операционная система MS-DOS не может непосредственно использовать расширенную память для загрузки и выполнения программ. Вы можете использовать часть расширенной памяти для размещения ядра MS-DOS, системных буферов, резидентных программ и драйверов. Расширенная память располагается непосредственно на основной плате компьютера.
  • Дополнительная память (expanded memory) — отображается в окна, расположенные в адресном пространстве ниже границы 1024 Кбайт, то есть в стандартную память. Эта память доступна MS-DOS и программам, работающим в реальном режиме, то есть в дополнительную память могут загружаться программы и эти программы могут там выполняться под управлением MS-DOS. Дополнительная память располагается на отдельной плате, которая вставляется в слоты расширения основной платы компьютера. Для работы дополнительной памяти в файле config.sys должен быть установлен специальный драйвер, который поставляется вместе с платой памяти.

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

Для иллюстрации сказанного выше на рис. 6.15 изображена упрощенная карта распределения оперативной памяти .

Рис. 6.15. Упрощенная схема распределения оперативной памяти

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

Область от 640 до 1024 Кбайт зарезервирована фирмой IBM для аппаратного обеспечения. В ней находятся:

  • память видеоадаптера (адреса от A000h:0000h до BFFFh:FFFFh);
  • ПЗУ для обслуживания видеоадаптеров, дисков и другой аппаратуры (адреса от C000h:0000h до EFFFh:FFFFh);
  • BIOS (адреса от F000h:0000h до FFFFh:000Fh).

Память с адресами от 640 до 1024 Кбайт — это зарезервированная память, она играет ключевую роль в механизме расположения драйверов и резидентных программ в расширенной памяти. Эта память также используется драйверами дополнительной памяти.

Как правило, зарезервированная память задействована не полностью, в ней есть свободные области. Эти свободные области и используются при работе с расширенной или дополнительной памятью.

Драйвер emm386.exe , входящий в MS-DOS, отображает свободные области на расширенную память, пользуясь виртуальным режимом работы процессоров i386, i486 или Pentium (режим виртуального процессора 8086). К сожалению, в этой книге нет места для детального описания виртуального режима работы. Для нас важно, что процессор, находясь в виртуальном режиме при использовании драйвера emm386.exe адресуется к свободным областям зарезервированной памяти. При этом процессор использует механизм адресации, соответствующий реальному режиму работы. Однако на эти свободные области зарезервированной памяти отображаются участки расширенной памяти, находящиеся выше границы 1024 Кбайт.


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

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

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

Илон Маск рекомендует:  Кс языки и грамматики

Область от 1024 Кбайт и выше — это расширенная память. Ее начальный участок от 1024 до 1088 Кбайт — область старшей памяти (High Memory Area — HMA ). Именно в эту область MS-DOS может помещать значительную часть своего ядра и области данных. Интересной особенностью области HMA является то, что она доступна для процессора, работающего в реальном режиме, то есть как раз в том режиме, который использует MS-DOS.

Как такое может быть? Для того, чтобы это понять, необходимо вспомнить механизм сегментной адресации памяти, используемый процессорами серии Intel. Физический адрес получается из двух компонент — сегментного адреса и смещения. Каждая компонента — двухбайтовая. Для вычисления адреса в реальном режиме работы процессора к сегментной компоненте, сдвинутой влево на четыре бита, прибавляется компонента смещения.

Например, пусть у нас имеется логический адрес 1234h:0005h. Сегментный адрес равен 1234h, а смещение — 0005h. Сдвигаем сегментный адрес влево на четыре бита, получаем 12340h. Затем прибавляем смещение 0005h и получаем физический адрес 12345h.

Задавая какое-нибудь значение сегментного адреса и меняя смещение, мы можем адресоваться к любому сегменту памяти размером 64 Кбайт в пределах первого Мбайт адресного пространства.

А что получится, если задать сегментный адрес FFFFh, то есть самое большое значение для сегментного адреса?

Очевидно, что конец области оперативной памяти, простирающейся от 0 до 1024 Кбайт, имеет адрес FFFFh:000Fh, так как этому логическому адресу соответствует физический адрес FFFFFh. Адрес FFFFFh — это самый большой адрес, который может быть задан при использовании 20-разрядной адресации. А реальный режим работы процессора использует именно 20-разрядную адресацию.

Зададим себе вопрос: что произойдет, если, например, при записи в память будет указан логический адрес FFFFh:0010h?

Если в вашем компьютере установлен процессор 8086 или 8088, то произойдет запись в самую первую ячейку оперативной памяти, имеющую физический адрес 00000h, так как перенос из девятнадцатого разряда в двадцатый будет игнорирован (адресные разряды в процессоре 8086 или 8088 нумеруются от 0 до 19).

Процессоры 80286, i386, i486 и Pentium имеют большее количество адресных линий, поэтому перенос в двадцатый разряд не будет потерян. Произойдет адресация памяти за пределами первого Мбайта!

За счет двадцатого разряда адресной шины процессор в реальном режиме получает доступ к памяти в диапазоне адресов от FFFFh:0010h до FFFFh:FFFFh. Это почти 64 Кбайт (без шестнадцати байт). Именно эти 64 Кбайт MS-DOS может использовать для размещения своего ядра и областей данных. Все что вам нужно для того чтобы использовать таким образом область старшей памяти HMA — это две строки в файле config.sys :

Как использовать всю доступную память

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

IBM PC или IBM PC/XT

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

Что еще вы можете сделать для увеличения объема доступной программам оперативной памяти? Можно сократить до минимума количество используемых драйверов и резидентных программ.

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

Драйвер Назначение драйвера и рекомендации по использованию
ega.sys Сохранение текущего состояния видеоадаптера EGA. Этот драйвер вам нужен только в том случае, если вы работаете с оболочкой DOSSHELL или Windows и при этом ваш компьютер оснащен видеоадаптером EGA
country.sys Этот драйвер нужен вам только в одном случае — если вы используете интернациональную поддержку, встроенную в MS-DOS, например, работаете с символами кириллицы
display.sys Аналогично предыдущему драйверу
keyboard.sys Аналогично предыдущему драйверу
printer.sys Аналогично предыдущему драйверу
himem.sys Драйвер предназначен для управления расширенной памятью. Он бесполезен на тех компьютерах, в которых отсутствует расширенная память. В частности, на компьютерах IBM PC и IBM PC/XT
ansi.sys Драйвер обеспечивает расширенное управление консолью и используется достаточно редко. Подключайте его только в том случае, если он действительно необходим для правильной работы используемых вами программ, о чем можно узнать из документации на программы
ramdrive.sys Этот драйвер предназначен для организации электронного диска в оперативной памяти. Используйте его только в том случае, когда в компьютере имеется расширенная или дополнительная память достаточного объема. Учтите, что более предпочтительным способом увеличения быстродействия дисковой подсистемы является кэширование дисковой памяти
smartdrv.exe Драйвер нужен для организации кеширования дисковой памяти. Его использование оправдано только на тех компьютерах, которые имеют расширенную или дополнительную память
driver.sys Этот редко используемый драйвер предназначен для поддержки нестандартных или внешних НГМД
setver.exe Драйвер позволяет «обмануть» программы, не рассчитанные на использование MS-DOS версии 6.22. Когда такие программы пытаются определить версию MS-DOS, драйвер setver.exe возвращает заранее оговоренное для каждой программы значение, например, 3.30. Если вы не запускаете программы, рассчитанные на конкретную версию MS-DOS, у вас нет необходимости использовать этот драйвер
emm386.exe Этот драйвер используется для управления расширенной памятью в компьютерах, выполненных на базе процессоров i386, i486 или Pentium. Он совершенно бесполезен, если ваш компьютер содержит процессоры 8086, 8088, NEC20 или 80286

IBM PC/AT с процессором 80286

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

  • ядро операционной системы MS-DOS и ее буферы можно перенести в область адресов, лежащую выше границы 1024 Кбайт. При этом доступная для программ область оперативной памяти увеличится на несколько десятков Кбайт;
  • компьютер IBM PC/AT с процессором 80286 обычно имеет по крайней мере 384 Кбайт расширенной памяти. Эту память лучше всего задействовать для организации кеширования дисков. Кэширование дисков улучшит производительность дисковой подсистемы компьютера;
  • если вы располагаете расширенной памятью размером в несколько Мбайт, имеет смысл увеличить размер кеша до 2-4 Мбайт. Кроме того, можно организовать в расширенной памяти электронный диск ;
  • если размер расширенной памяти составляет 384 Кбайт, но имеется еще и дополнительная память, вы можете организовать кеш в расширенной памяти и электронный диск в дополнительной. Если вы работаете с программным обеспечением, использующим дополнительную память, лучше ограничиться дисковым кешем в расширенной памяти.

Первое, что необходимо сделать при оптимизации использования памяти — перенести ядро операционной системы MS-DOS, ее буферы и рабочие области в область адресов, лежащую выше границы 1024 Кбайт. Эта возможность появилась в MS-DOS начиная с версии 5.0.

После установки MS-DOS на компьютере IBM PC/AT файл config.sys будет содержать следующие две строки:

Первая строка нужна для подключения драйвера himem.sys , управляющего расширенной памятью. Этот драйвер необходим для размещения MS-DOS выше границы 1024 Кбайт. Вторая строка указывает, что MS-DOS и все ее рабочие области должны быть размещены в расширенной памяти.

Учтите, что эти две строки должны располагаться в файле config.sys именно в том порядке, в котором они были приведены выше — вначале необходимо подключить драйвер himem.sys , а затем указать MS-DOS о необходимости загрузки ее ядра и областей данных в старшие адреса памяти строкой DOS=HIGH.

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

IBM PC/AT с процессорами i386, i486 и Pentium

Если ваш компьютер содержит процессор i386, i486 или Pentium, к перечисленным выше возможностям добавляется еще две:

  • вы можете разместить практически все используемые драйверы и резидентные программы в расширенной памяти. При этом объем памяти, доступной прикладным программам, составит 618 — 620 Кбайт;
  • вам становится доступна эмуляция дополнительной памяти с использованием расширенной памяти.

Остановимся подробнее на второй возможности.

Обычно компьютеры с процессорами i386, i486 или Pentium оснащены расширенной памятью объемом от 2 до 16 Мбайт (вам могут встретиться компьютеры с еще большим объемом расширенной памяти). Однако все еще встречаются программы рассчитаны на использование дополнительной памяти.

Получается, что у вас есть очень много расширенной памяти, но вам-то нужна дополнительная! Как быть в этом случае? Не покупать же еще и плату дополнительной памяти!

В этом случае необходимо воспользоваться драйвером emm386.exe , входящим в состав MS-DOS. Этот драйвер использует часть расширенной памяти для эмуляции в ней дополнительной памяти. То есть у вас становится меньше расширенной памяти, но появляется дополнительная.

Если вы — обладатель компьютера с процессором 80386 или 80486, вам доступна возможность переноса драйверов и резидентных программ в расширенную память, а также эмуляция дополнительной памяти с использованием расширенной памяти.

Для реализации этих возможностей подключите драйвер emm386.exe :

Эта строка должна располагаться в файле config.sys после строки, подключающей драйвер himem.sys .

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

Если вы не укажите размер эмулируемой дополнительной памяти, будет использовано значение по умолчанию — 256 Кбайт.

Для того, чтобы полностью отключить эмуляцию дополнительной памяти, задайте параметр NOEMS:

В этом случае драйвер emm386.exe будет использоваться только для загрузки драйверов и резидентных программ в расширенную память.

Однако даже если вы подключите драйвер emm386.exe , ваши резидентные программы и драйверы не попадут автоматически в расширенную память. Для того, чтобы разместить драйверы и резидентные программы в расширенной памяти, вам необходимо сделать следующее:

  • подключить драйвер himem.sys ;
  • поместить в файл config.sys строку «DOS=HIGH,UMB»;
  • для загрузки драйверов вместо оператора «DEVICE=» использовать оператор «DEVICEHIGH =»;
  • для загрузки резидентных программ в файле autoexec.bat использовать команду LOADHIGH , передав ей в качестве параметра имя и параметры загружаемой резидентной программы.


Для примера приведем образец файла config.sys , в котором подключен драйвер emm386.exe :

В первой строке подключается драйвер himem.sys , необходимый для управления расширенной памятью. Во второй строке подключается драйвер emm386.exe , который используется для эмуляции двух Мбайт дополнительной памяти и для загрузки резидентных программ и драйверов в расширенную память. В третьей строке указывается, что MS-DOS должен быть загружен в верхние адреса памяти, и кроме того, что должна быть использована возможность размещения драйверов и резидентных программ в расширенной памяти.

Последние две строки — пример размещения драйверов в расширенной памяти.

Для загрузки в расширенную память резидентных программ воспользуйтесь командой LOADHIGH или LH . Приведем фрагмент файла autoexec.bat, в котором используется загрузка резидентных программ в расширенную память:

Первая строка демонстрирует загрузку в расширенную память драйвера клавиатуры, вторая — драйвера мыши.

Отметим еще один важный момент, связанный с использованием драйвера emm386.exe .

В состав MS-DOS входит программа mem.exe , предназначенная для исследования оперативной памяти. Запустив ее с параметром /f, вы увидите на экране примерно следующее:

Программа отображает объемы свободных блоков стандартной памяти и блоков верхней памяти.

Обратите внимание, что область верхних блоков памяти фрагментирована. В ней выделяются области с номерами 1 и 2.

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

Зная объем оперативной памяти, необходимый для драйверов и резидентных программ, вы можете расположить их в верхних блоках памяти оптимальным образом, указав для каждого драйвера или резидентной программы нужную область. Для определения объема резидентной части драйверов и резидентных программ вы можете использовать все ту же программу mem.exe , запустив ее с параметром /D.

Если имеется несколько свободных блоков верхней памяти и десяток драйверов, а также резидентных программ, «ручное» их размещение в областях верхней памяти может отнять много времени. К счастью, в состав MS-DOS входит программа memmaker.exe , выполняющая такое размещение в автоматическом режиме. Иногда после автоматической оптимизации бывает полезно выполнить «ручную доводку», перемести некоторые резидентные программы в другие области верхней памяти.

Детальное обсуждение программы memmaker.exe вы сможете найти во втором томе нашей серии книг «Персональный компьютер — шаг за шагом», который называется «Операционная система Microsoft Windows . Руководство пользователя». Заметим только, что программа memmaker.exe добавляет к номеру области еще и размер резидентной части драйвера или программы:

Быстродействие оперативной памяти

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

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

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

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

SETUP-программа может запускаться при включении компьютера (если нажать определенную клавишу, обычно ), либо эта программа может поставляться на дискете вместе с компьютером.

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

Это особенно необходимо, если в вашем компьютере установлен процессор i386 или i486. Такие компьютеры обычно комплектуются быстрой памятью. И если в CMOS-памяти указано, что надо вставлять циклы ожидания при работе с памятью, компьютер не будет работать с максимальной производительностью.

Другая возможность повышения скорости работы с памятью, но на этот раз с постоянной памятью (BIOS), часто имеется в компьютерах, выполненных на процессорах i386 или i486. Эта возможность заключается в копировании содержимого относительно медленной постоянной памяти BIOS в специальную область быстродействующей оперативной памяти с последующим преобразованием адресов. Используемая область памяти имеет специальное название — теневая память.

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

Будет выполняться копирование BIOS в теневую память или нет — зависит от установки определенной ячейки CMOS-памяти. Для выбора правильного режима вам необходимо воспользоваться SETUP-программой.

Как правило, SETUP-программа описывается в документации на основную плату компьютера. Возможность изменения количества тактов ожидания и режим теневой памяти обычно имеются только в компьютерах, выполненных на процессорах i386, i486 и Pentium, однако бывают и исключения. Например, модели компьютеров фирмы SUMMIT, выполненные на основе процессора 80286, могут работать без тактов ожидания. В них также имеется возможность использования теневой памяти.

Создаем вирус и антивирус (38 стр.)

AL=0Fh – установить логическое устройство

Версии: DOS 2.00 и выше. DOS, функция 45h Дублировать описатель файла

BX – существующий описатель файла

CF=0, если функция выполнена успешно

AX – новый описатель файла, дублирующий оригинал

CF=1, если при выполнении функции возникли ошибки

Описание. Создает дополнительный описатель файла, ссылающийся на тот же поток ввода/вывода, что и существующий описатель. Любое продвижение указателя чтения/записи одного описателя (включая любые операции чтения, записи или перемещения указателя посредством функции 42h) действует на его дубликат.

Версии: DOS 2.00 и выше. DOS, функция 46h Переназначить описатель

BX – целевой описатель файла (должен уже существовать)

CX – исходный описатель файла (должен уже существовать)

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

Описание. Заставляет описатель файла (handle) ссылаться на другой файл или устройство. Если описатель в CX (источник) открыт, он закрывается, а затем становится дубликатом описателя в BX (назначения). Иными словами, описатели в CX и BX будут ссылаться на один и тот же физический файл или устройство.

Версии: DOS 2.00 и выше. DOS, функция 47h Получить текущее оглавление DOS

DS:SI – адрес локального буфера для результирующего пути – 64 байта

DL – номер диска (0 – текущий, 1 – A и так далее)

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

Описание. В буфер по адресу DS:SI помещается в форме ASCIZ путь текущего оглавления для диска, указанного в DL. Путь возвращается в формате: «путь\оглавление»,0. Впереди не подставляется буква диска, а сзади не подставляется символ «\». Например, если текущим является корневое оглавление, эта функция вернет пустую строку (DS: [SI]=0).


Версии: DOS 2.00 и выше. DOS, функция 48h Выделить память

BX – запрошенное количество памяти в 16-байтных параграфах

CF=0, если функция выполнена успешно

AX – сегментный адрес распределенного блока

CF=1, если при выполнении функции возникли ошибки

BX – размер максимального доступного блока памяти (в параграфах)

Описание. Распределяет блок памяти длиной BX параграфов, возвращая сегментный адрес этого блока в AX (блок начинается с AX:0000). Если распределение неудачно, устанавливается флаг CF, в AX возвращается код ошибки, а BX содержит максимальный размер доступной для распределения памяти (в параграфах). Чтобы определить наибольший доступный блок, общепринято устанавливать BX=FFFFh перед вызовом. Распределение завершится с ошибкой, возвратив размер максимального блока памяти в BX.

Версии: DOS 2.00 и выше. DOS, функция 49h Освободить блок памяти

ES – сегментный адрес освобождаемого блока памяти

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

Описание. Освобождает блок памяти, начинающийся с адреса ES:0000. Этот блок становится доступным для других запросов системы. Вообще говоря, нужно освобождать лишь те блоки памяти, которые получены через функцию 48h (распределить память). Родитель отвечает за освобождение памяти порожденных процессов. Тем не менее, ничто не препятствует освобождать память чужих процессов.

Илон Маск рекомендует:  Четвертый borland с и его окружение l

Версии: DOS 2.00 и выше. DOS, функция 4Ah Изменить размер блока памяти

ES – сегмент распределенного блока памяти

BX – нужный размер блока в 16-байтных параграфах

CF=0, если функция выполнена успешно

CF=1, если при выполнении функции возникли ошибки

BX – размер максимального доступного блока памяти (в параграфах)

Описание. Изменяет размер существующего блока памяти. Когда программа получает управление, функция 4Bh уже распределила блок памяти, начиная с PSP, который содержит всю доступную память. Чтобы освободить память для запуска порождаемых процессов, блок памяти, начинающийся с PSP, необходимо сначала сжать.

Функция 31h и INT 27h (TSR) сжимают блок по адресу PSP.

Версии: DOS 2.00 и выше.

DOS, функция 4Bh Выполнить или загрузить программу

DS:DX – адрес строки ASCIZ с именем файла, содержащего программу

ES:BX – адрес EPB (блока параметров EXEC)

AL=00h – загрузить и выполнить

AL=01h – загрузить, но не выполнять

AL=03h – загрузить программный оверлей

CF=0, если функция выполнена успешно

BX, DX не сохранены

CF=1, если при выполнении функции возникли ошибки

Описание. Данная функция загружает в память и запускает программу, имя которой указано в регистрах DS:DX. Запущенная программа после завершения работы возвратит управление запускаемой. Если диск или путь не указаны, принимаются значения по умолчанию. ES:BX указывает на блок памяти, подготовленный как EPB, формат которого зависит от запрошенной подфункции в AL.

Версии: DOS 2.00 и выше. DOS, функция 4Ch Завершить программу

Описание. Возвращает управление от порожденного процесса его родителю, устанавливая код выхода (его можно опросить функцией 4Dh). Управление передается по адресу завершения в PSP завершающейся программы. Векторы Ctrl-Break и Critical Error восстанавливаются к старым адресам, сохраненным в родительском PSP.

Примечание. Значение ERRORLEVEL (используемое в пакетных файлах DOS) можно использовать для проверки кода выхода самой последней программы.

Версии: DOS 2.00 и выше. DOS, функция 4Dh Получить код выхода программы

AH – код выхода последнего завершившегося процесса

AH=00h – нормальное завершение

AH=01h – завершение через Ctrl-Break INT 23h

AH=02h – завершение по критической ошибке устройства INT 24h

AH=03h – завершение через функцию 31h

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

Версии: DOS 2.00 и выше. DOS, функция 4Eh Найти первый совпадающий файл

DS:DX – адрес строки ASCIZ с именем файла (допускается использовать символы «?» и «*»)

CX – атрибут файла для сравнения


CF=0, если функция выполнена успешно

DTA заполнена данными (Таблица Б-10)

CF=1, если при выполнении функции возникли ошибки

Описание. Если диск и/или путь не указаны, принимаются значения по умолчанию. Обобщенные символы «*» и «?» допускается использовать в имени файла и расширении.

Версии: DOS 2.00 и выше. DOS, функция 4Fh Найти следующий совпадающий файл

DS:DX – адрес данных, возвращенных предыдущей 4Eh (Найти первый файл)

Таблица Б-10. Формат данных в DTA

CF=0, если функция выполнена успешно

DTA заполнена данными

CF=1, если при выполнении функции возникли ошибки

Описание. Эту функцию можно использовать после вызова 4Eh. Следующее имя файла, совпадающее по обобщенному имени и атрибуту файла, копируется в буфер по адресу DS:DX вместе с другой информацией (Таблица Б-10).

Примечание. Параметр DS:DX добавлен в DOS 3.0.

Версии: DOS 2.00 и выше. DOS, функция 52h Получить адрес векторной таблицы связи (Официально не документирована)

Выход: ES:BX – адрес векторной таблицы связи (Таблица Б-11)

Описание. Данная функция возвращает адрес векторной таблицы связи.

Версии: DOS 2.00 и выше. DOS, функция 54h Получить переключатель верификации DOS

AL=00h, если верификация выключена (OFF)

AL=01h, если верификация включена (ON)

Описание. Возвращает текущий статус верификации записи DOS. Если в AL возвращается 1, то DOS считывает обратно каждый сектор, записываемый на диск, чтобы проверить правильность записи. Функция DOS 2Eh позволяет установить/изменить режим верификации.

Версии: DOS 2.00 и выше. Таблица Б-11. Формат векторной таблицы связи

DOS, функция 56h Переименовать/переместить файл

INT 20H: завершить программу

Это прерывание используется для выхода из программы и возврата управления родительскому процессу (обычно интерпретатору команд DOS — COMMAND.COM). Оно восстанавливает значения управляющих векторов INT 22H INT 23H INT 24H Оно также сбрасывает все файловые буфера (если длина файла изменилась, то файл должен быть предварительно закрыт).

Важно:

Регистр CS должен содержать значение PSP завершающегося процесса. Если ваш CS не равен PSP, вы можете выдать JMP или RET на PSP:0000.

Рекомендуется использовать функцию 4cH Terminate, чтобы избежать трудностей, связанных с неравенством CS и PSP. Она позволяет также задать код выхода. Программы COM-формата обычно выполняются при CS=PSP, так что им можно выдавать INT 20H в любой момент. EXE-программы могут выдавать FAR JMP или FAR RET, чтобы передать управление на PSP:0000, где содержится инструкция INT 20H.

INT 21H: сервис DOS

Это прерывание служит главным входом большинства функций DOS.

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

  • Функция DOS 00H: завершить программу
  • Функция DOS 01H: ввод с клавиатуры **
  • Функция DOS 02H: вывод на дисплей**
  • Функция DOS 03H: ввод AUX
  • Функция DOS 04H: вывод AUX
  • Функция DOS 06H: Обмен с консолью*
  • Функция DOS 07H: Нефильтрующий консольный ввод без эха*
  • Функция DOS 08H: Консольный ввод без эха*
  • Функция DOS 09H: Выдать строку***
  • Функция DOS 0aH: буферизованный ввод строки*
  • Функция DOS 0bH: проверить статус ввода*
  • Функция DOS 0cH: ввод с очисткой*
  • Функция DOS 0dH: Сбросить диск*
  • Функция DOS 0eH: Выбрать умалчиваемый диск DOS
  • Функция DOS 0fH: открыть файл через FCB
  • Функция DOS 10H: Закрыть файл через FCB
  • Функция DOS 11H: Найти 1-й совпадающий файл через FCB
  • Функция DOS 12H: Найти следующий совпадающий файл через FCB
  • Функция DOS 13H: Удалить файл через FCB
  • Функция DOS 14H: читать последовательный файл через FCB
  • Функция DOS 15H: писать последовательный файл через FCB
  • Функция DOS 16H: создать файл через FCB
  • Функция DOS 17H: Переименовать файл через FCB
  • Функция DOS 19H: дать умалчиваемый диск DOS
  • Функция DOS 1aH: установить адрес DTA*
  • Функция DOS 1bH: дать информацию FAT (текущий диск)*
  • Функция DOS 1cH: дать информацию FAT (любой диск)*
  • Функция DOS 21H: читать запись произвольного файла
  • Функция DOS 22H: писать запись произвольного файла
  • Функция DOS 23H: дать размер файла через FCB*
  • Функция DOS 24H: установить адрес блока произвольного файла
  • Функция DOS 25H: установить вектор прерывания***
  • Функция DOS 26H: создать префикс программного сегмента
  • Функция DOS 27H: читать блок произвольного файла**
  • Функция DOS 28H: писать блок произвольного файла
  • Функция DOS 29H: Разобрать имя файла
  • Функция DOS 2aH: дать дату DOS*
  • Функция DOS 2bH: установить дату DOS*
  • Функция DOS 2cH: дать время DOS*
  • Функция DOS 2dH: установить время DOS*
  • Функция DOS 2eH: установить/сбросить переключатель верификации
  • Функция DOS 2fH: дать текущий DTA
  • Функция DOS 30H: дать номер версии DOS*
  • Функция DOS 31H: завершиться и остаться резидентным — KEEP*
  • Функция DOS 32H: дать дисковую информацию DOS (недокументировано)
  • Функция DOS 33H: установить/опросить уровень контроля прерывания DOS*
  • Функция DOS 34H: адрес статуса реентерабельности DOS
  • Функция DOS 35H: дать вектор прерывания***
  • Функция DOS 36H: дать свободную память диска*
  • Функция DOS 37H: установить/опросить символ-переключатель (недокументировано)
  • Функция DOS 38H: дать/установить информацию страны
  • Функция DOS 39H: создать новое оглавление — MKDIR
  • Функция DOS 3aH: Удалить оглавление — RMDIR
  • Функция DOS 3bH: установить умалчиваемое оглавление DOS — CHDIR
  • Функция DOS 3cH: создать описатель файла
  • Функция DOS 3dH: открыть описатель файла
  • Функция DOS 3eH: Закрыть описатель файла
  • Функция DOS 3fH: читать файл через описатель
  • Функция DOS 40H: писать в файл через описатель
  • Функция DOS 41H: Удалить файл*
  • Функция DOS 42H: установить указатель файла — LSEEK
  • Функция Функция DOS 43H: установить/опросить атрибут файла — CHMOD*
  • Функция DOS 44H: управление вводом-выводом устройства — IOCTL
  • Функция DOS 45H: Дублировать описатель файла — DUP
  • Функция DOS 46H: переназначить описатель — FORCDUP
  • Функция DOS 47H: дать умалчиваемое оглавление DOS
  • Функция DOS 48H: распределить память (дать размер памяти)
  • Функция DOS 49H: Освободить блок распределенной памяти***
  • Функция DOS 4aH: Сжать или расширить блок памяти
  • Функция DOS 4bH: выполнить или загрузить программу — EXEC
  • Функция DOS 4cH: завершить программу — EXIT
  • Функция DOS 4dH: дать код выхода программы — WAIT
  • Функция DOS 4eH: Найти 1-й совпадающий файл
  • Функция DOS 4fH: Найти следующий совпадающий файл
  • Функция DOS 54H: дать переключатель верификации DOS
  • Функция DOS 56H: Переименовать/переместить файл*
  • Функция DOS 57H: установить/опросить время/дату файла*
  • Функция DOS 59H: дать расширенную информацию об ошибке
  • Функция DOS 5aH: создать уникальный временный файл
  • Функция DOS 5bH: создать новый файл*
  • Функция DOS 5cH: блокировать/разблокировать доступ к файлу
  • Функция DOS 5eH: различные сетевые функции
  • Функция DOS 5fH: переназначение устройств в сети
  • Функция DOS 62H: дать адрес префикса программного сегмента**

Краткие теоретические сведения. В MS-DOS реализовано управление памятью без организации вирту­аль­ного адресного пространства, но с распределением блоков переменной длины

В MS-DOS реализовано управление памятью без организации вирту­аль­ного адресного пространства, но с распределением блоков переменной длины. Базовые механизмы ОС опираются только на средства реального режима процессоров x86, и лишь для работы с «верхней» памятью используются осо­бенности адресации 286+ и переключение в защищенный/виртуальный режим.

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

Каждый блок предваряется управляющим блоком (MCB — Memory Control Block), который занимает ровно один параграф и содержит поля:

байт 0 – опознавательный маркер блока: 5Ah (‘Z’) – для последнего блока списка, 4Dh (‘M’) – для всех остальных;

байты 1..2 – сегментный адрес PSP программы – владельца блока (в MS-DOS адрес PSP играет роль PID – идентификатора загруженной программы);

байты 3..4 – размер блока в параграфах, при отсутствии «зазоров» между блоками в списке это значение является «относительной» ссылкой на следующий блок (размер самого MCB в этом поле не учитывается!);

байты 8..15 – имя программы – владельца блока.

Поля P – кэш FCB и так далее (эта информация считается недокументированной).

Зная адрес одного из блоков, можно просканировать все последующие до конца списка. DOS хранит адрес первого блока в специальной структуре или DIB – DOS Info Block (она же List of Lists). Адрес DIB возвращает в регистрах ES:BX недокументированная функция int 21h AH = 52h. Слово по адресу ES:BX‑2 содержит сегментный адрес первого в списке MCB.

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

– наличие маркера MCB;


– владельцем блока является он сам, то есть PID владельца указывает на следующий после MCB параграф;

– блок содержит PSP – начинается с команды int 20h.

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

Других структур для описания распределяемой памяти не предусмотрено, вся необходимая информация получается, в том числе и системой, путем скани­рования списка MCB, поэтому любые изменения в ней отражаются на работе всей системы. Так, уменьшение значения в поле размера последнего MCB приводит к изменению объема памяти, контролируемой DOS, и появ­лению «невидимой» области.

В общем случае, ОС должна обеспечить: выделение блока памяти по запросу прикладной программы, освобождение блока, перераспределение ранее выделенного блока (изменение размера), а также учёт свободной и занятой памяти, дефрагментацию блоков и другие сервисные функции.

В MS-DOS предусмотрены три основные функции прерывания int 21h:

AH = 48h – выделение блока памяти. На входе: BX – размер блока в параграфах. На выходе: AX – сегментный адрес выделенного блока, BX – макси­мальный доступный размер этого блока.

AH = 49h – освобождение блока. На входе: ES – сегментный адрес блока.

AH = 4Ah – изменение размера ранее выделенного блока. На входе: ES – сегментный адрес блока, BX – новый размер блока в параграфах. На выходе: BX – максимальный доступный размер этого блока.

Все функции при возникновении ошибки устанавливают флаг CF и возвращают ее код в AX.

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

Контрольные вопросы

1. Организация памяти в MS-DOS.

2. Структура MCB блока.

4. Функции для создания, удаления и изменения размера блока.

5. Организация сложных динамических структур данных.

Варианты заданий

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

3.3.2. Создать динамический массив для хранения строк. Массив должен представлять собой указатели на блоки памяти, в которых хранятся строки. При добавлении элемента необходимо проверить, есть ли для него место. Если весь массив занят, его необходимо выделить заново, увеличив размер вдвое, и ско­пировать туда старое содержимое. Пользователю должны быть доступны сле­дующие функции: добавить строку в конец массива, установить новую строку в определенный элемент массива (с указанным индексом), удалить строку с ука­занным индексом, очистить массив, показать содержимое массива (храни­мые строки) на экране.

3.3.3. Создать двоичное дерево, хранящее числа. Каждый элемент дерева должен хранить число и «левую» и «правую» ссылки на нижестоящие элементы. Необходимо реализовать алгоритмы добавления числа в двоичное дерево и удаления числа из него. Пользователю должны быть доступны следу­ющие функции: добавить число, удалить число, очистить дерево, показать содержимое дерева на экране. При выводе на экран показывать дерево в виде строки вида: содержимое родителя (содержимое левой ветви, содержимое пра­вой ветви); для каждой из ветвей функция вывода должна быть вызвана рекур­сивно.

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

3.3.5. Реализовать выделение и освобождение блоков памяти без обраще­ний к функциям DOS.

3.3.6. Реализовать перераспределение блока памяти; в случае невозмож­ности увеличить размер блока попытаться переместить его на новое место (текущее содержимое блока копируется).

3.3.7. Объединяет функции вариантов 4..6, допол­няется интерактивным интерфейсом, позволяющим выбирать функции (повышенной сложности).

Лабораторная работа №4
Обработчики прерываний

Цели работы:

1) изучить поддержку прерываний и их использование;

2) научиться создавать и использовать собственные обработчики пре­ры­ваний;

3) научиться создавать и отлаживать резидентные программы.

Дата добавления: 2020-11-12 ; просмотров: 323 | Нарушение авторских прав

3. Распределение оперативной памяти в ms-dos

MS-DOS – это однопрограммная операционная система. В ней можно организовать запуск резидентных задач, но в целом она предназначена только для выполнения одного вычислительного процесса. Поэтому распределение памяти в ней построено по простой схеме (рис. 6).

В состав операционной систем MS-DOS входят следующие основные компоненты:

модуль расширения BIOS – файл io.sys;

основной базовый модуль обработки прерываний DOS – файл msdos.sys. Этот файл реализует работу файловой системы DOS;

командный процессор (интерпретатор команд) – файл command.com;

утилиты и драйверы, расширяющие возможности системы;

п рограмма загрузкиMS-DOS – загрузочная запись (boot record).

Рис. 6 Распределение оперативной памяти в ОС MS DOS

Распределение памяти в ОС MS-DOS начинается с первых 640 Кбайт. Однако полный объем памяти, используемый системой для работы, может быть расширен до 1 Мбайта с помощью драйвера himem.sys. Для этого необходимо в файл конфигурации операционной системы config.sys добавить строку: device=_путь_\himem.sys. Для разрешения размещения части кода ядра DOS и заданий пользователя в области памяти свыше 640 Кб необходимо в config.sys добавить строку: dos=high,umb. Для загрузки драйверов и резидентных прогарам в верхнюю память компьютера используется драйвер верхней памяти emm386.exe. А для указания конкретных программ, которые должны размещаться в этой области перед заданием пути к их размещению необходимо дописать devicehigh и lh в файле autoexec.bat. Для контроля за правильность загрузки оперативной памяти в MS DOS используется программа mem.ехе. Просмотреть загрузку оперативной памяти можно также из окна файлового менеджера (например, vc.com) нажав сочетание клавиш: Alt+F5.

4. Распределение оперативной памяти в Windows nt

В операционных системах Windows NT тоже используется плоская модель па­мяти. Заметим, что Windows NT 4.0 Server практически не отличается от Win­dows NT 4.0 Workstation; разница лишь в наличии у сервера некоторых дополни­тельных служб, дополнительных утилит для управления доменом и несколько иных значений в настройках системного реестра. Однако схема распределения возможного виртуального адресного пространства в системах Windows NT рази­тельно отличается от модели памяти Windows 95/98. Прежде всего, в отличие от Windows 95/98 в гораздо большей степени используется ряд серьезных аппарат­ных средств защиты, имеющихся в микропроцессорах, а также применено прин­ципиально другое логическое распределение адресного пространства (рис. 7).

Илон Маск рекомендует:  Dos fn 3bh установить умалчиваемое оглавление dos chdir

Прикладные программы обращаются к DLL, которые перенаправляют обращение к системе

Этот системный код находится в своем собственном адресном пространстве и недоступен вызывающим его процессам


Рис. 7 Распределение памяти в ОС Windows NT

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

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

Прикладным программам выделяется 2 Гбайт локального (собственного) линей­ного (неструктурированного) адресного пространства от границы 640 Кбайт до 2 Гбайт (первые 640 Кбайт полностью недоступны). Прикладные программы изо­лированы друг от друга, хотя могут общаться через буфер обмена (clipboard), ме­ханизмы DDE (механизм динамического обмена данными) и OLE (механизм связи и внедрения объектов).

В верхней части каждой 2-гигабайтной области прикладной программы разме­щен код системных DLL кольца 3, который выполняет перенаправление вызовов в совершенно изолированное адресное пространство, где содержится уже собст­венно системный код. Этот системный код, выступающий как сервер-процесс (server process), проверяет значения параметров, исполняет запрошенную функ­цию и пересылает результаты назад в адресное пространство прикладной про­граммы. Хотя сервер-процесс сам по себе остается процессом прикладного уровня, он полностью защищен от вызывающей его прикладной программы и изолиро­ван от нее.

Между отметками 2 и 4 Гбайт расположены низкоуровневые системные компо­ненты Windows NT кольца 0, в том числе ядро, планировщик потоков и диспетчер виртуальной памяти. Системные страницы в этой области наделены привиле­гиями супервизора, которые задаются физическими схемами кольцевой защиты процессора. Это делает низкоуровневый системный код невидимым и недоступ­ным для записи для программ прикладного уровня, но приводит к падению про­изводительности во время переходов между кольцами.

Для 16-разрядных прикладных Windows-программ ОС Windows NT реализует сеансы Windows on Windows (WOW). В отличие от Windows 95/98 ОС Win­dows NT дает возможность выполнять 16-разрядные программы Windows инди­видуально в собственных пространствах памяти или совместно в разделяемом адресном пространстве. Почти во всех случаях 16-и 32-разрядные прикладные программы Windows могут свободно взаимодействовать, используя OLE, неза­висимо от того, выполняются они в отдельной или общей памяти. Собственные прикладные программы и сеансы WOW выполняются в режиме вытесняющей многозадачности, основанной на управлении отдельными потоками. Множест­венные 16-разрядные прикладные программы Windows в одном сеансе WOW выполняются в соответствии с кооперативной моделью многозадачности. Win­dows NT может также выполнять в многозадачном режиме несколько сеансов DOS. Поскольку Windows NT имеет полностью 32-разрядную архитектуру, не существует теоретических ограничений на ресурсы GDI (интерфейс графических устройств) и USER.

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

Процессами выделения памяти, ее резервирования, освобождения и подкачки управляет диспетчер виртуальной памяти Windows NT (Windows NT virtual memory manager, VMM). В своей работе этот компонент реализует сложную стратегию учета требований к коду и данным процесса для минимизации досту­па к диску, поскольку реализация виртуальной памяти часто приводит к боль­шому количеству дисковых операций.

Каждая виртуальная страница памяти, отображаемая на физическую страницу, переносится в так называемый страничный фрейм (page frame). Прежде чем код или данные можно будет переместить с диска в память, диспетчер виртуальной памяти (модуль VMM) должен найти или создать свободный страничный фрейм или фрейм, заполненный нулями. Заметим, что заполнение страниц нулями пред­ставляет собой одно из требований стандарта на системы безопасности уровня С2 , принятого правительством США. Страничные фреймы должны заполняться нулями для того, чтобы исключить возможность использования их предыдущего содержимого другими процессами. Чтобы фрейм можно было освободить, необ­ходимо скопировать на диск изменения в его странице данных, и только после этого фрейм можно будет повторно использовать. Программы, как правило, не меняют страницы кода. Страницы кода, в которые программы не внесли измене­ний, можно удалить.

Диспетчер виртуальной памяти может быстро и относительно легко удовлетво­рить программные прерывания типа «ошибка страницы» (page fault). Что каса­ется аппаратных прерываний типа «ошибка страницы», то они приводят к подкачке (paging), которая снижает производительность системы. Мы уже говорили о том, что в Windows NT, к большому сожалению, выбрана дисциплина FIFO для замещения страниц, а не более эффективные дисциплины LRU и LFU.

Когда процесс использует код или данные, находящиеся в физической памяти, система резервирует место для этой страницы в файле подкачки Pagefile.sys на диске. Это делается с расчетом на тот случай, что данные потребуется выгрузить на диск. Файл Pagefile.sys представляет собой зарезервированный блок дисково­го пространства, который используется для выгрузки страниц, помеченных как «грязные», при необходимости освобождения физической памяти. Заметим, что этот файл может быть как непрерывным, так и фрагментированным; он может быть расположен на системном диске либо на любом другом и даже на несколь­ких дисках. Размер этого страничного файла ограничивает объем данных, кото­рые могут храниться во внешней памяти при использовании механизмов вирту­альной памяти.

Вся виртуальная память в Windows NT подразделяется на классы: зарезервиро­ванную (reserved), выделенную (committed) и доступную (available).

Зарезервированная память представляет собой набор непрерывных адресов, которые диспетчер виртуальной памяти (VMM) выделяет для процесса, но не учитывает в общей квоте памяти процесса до тех пор, пока она не будет фактически использована. Когда процессу требуется выполнить запись в па­мять, ему выделяется нужный объем из зарезервированной памяти. Если про­цессу потребуется больший объем памяти, то дополнительная память может быть одновременно зарезервирована и использована, если в системе имеется доступная память

Память выделена, если диспетчер VMM резервирует для нее место в файле Pagefile.sys на тот случай, когда потребуется выгрузить содержимое памяти на диск. Объем выделенной памяти процесса характеризует фактически по­требляемый им объем памяти. Выделенная память ограничивается размером файла подкачки. Предельный объем выделенной памяти в системе (commit limit) определяется тем, какой объем памяти можно выделить процессам без увеличения размеров файла подкачки. Если в системе имеется достаточный объем дискового пространства, то файл подкачки может быть увеличен и тем самым будет расширен предельный объем выделенной памяти.

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

Dos fn 49h: освободить распределенный блок памяти

Создание программ на языке Assembler.

[администратор рассылки: Лысков Игорь Витальевич (Старший модератор)]

Лучшие эксперты в этом разделе

Коцюрбенко Алексей Владимирович
Статус: Модератор
Рейтинг: 1154
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 457
solowey
Статус: Бакалавр
Рейтинг: 235
Перейти к консультации №:

Разбирался в программе, которая выводит список блоков памяти MS-DOS, по книжке Фролова. Но там код на С. Хотелось бы получить код на ассемблере. И желательно для вывода информации о блоке использовать средства BIOS.
Разъяните подробно как написать на ассемблере.

Состояние: Консультация закрыта

Здравствуйте, Jnshish!
Как я правильно понимаю, то для вывода информации о блоках памяти (А теперь внимательно) в ДОС, в BIOS не должно быть никаких функций. BIOS оправдывает своё название (Базавая система ввода вывода) и содержит только функции для работы с устройствами.
Насчёт инфы по блокам памяти:
До сих пор, если требовалось создать массив данных в памяти, мы просто обращались к памяти за концом программы, считая, что там есть еще хотя бы 64 килобайта свободной памяти. Разумеется, как и во всех операционных системах, в DOS есть средства управления распределением памяти — выделение блока (аналог стандартной функции языка С malloc), изменение его размеров (аналог realloc) и освобождение (free).

Функция DOS 48h — Выделить память

Ввод: АН = 48h
ВХ = размер блока в 16-байтных параграфах
Вывод: CF = 0, если блок выделен
АХ = сегментный адрес выделенного блока
CF = 1, если произошла ошибка:
АХ = 7 — блоки управления памятью разрушены
АХ = 8 — недостаточно памяти:
ВХ = размер максимального доступного блока
Эта функция с большим значением в ВХ (обычно FFFFh) используется для определения размера самого большого доступного блока памяти.

Функция DOS 49h — Освободить память

Ввод: АН = 49h
ES = сегментный адрес освобождаемого блока
Вывод: CF = 0, если блок освобожден
CF = 1:
АХ = 7, если блоки управления памятью разрушены,
АХ = 9, если в ES содержится неверный адрес
Эта функция не позволит освободить блок памяти, которым текущая программа не владеет, но с помощью функции DOS 50h (AX = 50h, ВХ = сегментный адрес PSP процесса) программа может «притвориться» любым другим процессом.

Функция DOS 4Ah — Изменить размер блока памяти

Ввод: АН = 4Ah
ВХ = новый размер в 16-байтных параграфах
ES = сегментный адрес модифицируемого блока
Вывод: CF = 0, если размер блока изменен
CF = 1:
АХ = 7, если блоки управления памятью разрушены,
АХ = 8, если не хватает памяти (при увеличении),
АХ = 9, если ES содержит неверный адрес
ВХ = максимальный размер, доступный для этого блока
Если для увеличения блока не хватило памяти, DOS увеличивает его до возможного предела.

При запуске СОМ-программы загрузчик DOS выделяет самый большой доступный блок памяти для этой программы, так что при работе с основной памятью эти функции требуются редко (в основном для того, чтобы сократить выделенный программе блок памяти до минимума перед загрузкой другой программы), но уже в MS-DOS 5.0 и далее с помощью этих же функций можно выделять память в областях UMB — неиспользуемых участках памяти выше 640 Кб и ниже 1 Мб, для этого требуется сначала подключить UMB к менеджеру памяти и изменить стратегию выделения памяти с помощью функции DOS 58h.

Про UMB
Функция DOS 58h — Считать/изменить стратегию выделения памяти

Dos fn 49h: освободить распределенный блок памяти

Плохо смотрел значит, там все что нужно есть, даже больше чем тебе сейчас нужно знать

═══════════════════════════════════ ════════════════════╡ Функции DOS │
DOS Fn 00H: Завершить программу
DOS Fn 01H: Ввод с клавиатуры
DOS Fn 02H: Вывод на дисплей
DOS Fn 03H: Ввод AUX
DOS Fn 04H: Вывод AUX
DOS Fn 05H: Вывод на принтер
DOS Fn 06H: Обмен с консолью
DOS Fn 07H: Нефильтрующий консольный ввод без эха
DOS Fn 08H: Консольный ввод без эха
DOS Fn 09H: Выдать строку
DOS Fn 0aH: Буферизованный ввод строки
DOS Fn 0bH: Проверить статус ввода
DOS Fn 0cH: Ввод с очисткой
DOS Fn 0dH: Сбросить диск
DOS Fn 0eH: Выбрать умалчиваемый диск DOS
DOS Fn 0fH: Открыть файл через FCB
DOS Fn 10H: Закрыть файл через FCB
DOS Fn 11H: Найти 1-й совпадающий файл через FCB
DOS Fn 12H: Найти следующий совпадающий файл через FCB
DOS Fn 13H: Удалить файл через FCB
DOS Fn 14H: Читать последовательный файл через FCB
DOS Fn 15H: Писать последовательный файл через FCB
DOS Fn 16H: Создать файл через FCB
DOS Fn 17H: Переименовать файл через FCB
DOS Fn 19H: Дать умалчиваемый диск DOS
DOS Fn 1aH: Установить адрес DTA
DOS Fn 1bH: Дать информацию FAT (текущий диск)
DOS Fn 1cH: Дать информацию FAT (любой диск)
DOS Fn 21H: Читать запись произвольного файла
DOS Fn 22H: Писать запись произвольного файла
DOS Fn 23H: Дать размер файла через FCB
DOS Fn 24H: Установить адрес блока произвольного файла
DOS Fn 25H: Установить вектор прерывания
DOS Fn 26H: Создать префикс программного сегмента
DOS Fn 27H: Читать блок произвольного файла
DOS Fn 28H: Писать блок произвольного файла
DOS Fn 29H: Разобрать имя файла
DOS Fn 2aH: Дать дату DOS
DOS Fn 2bH: Установить дату DOS
DOS Fn 2cH: Дать время DOS
DOS Fn 2dH: Установить время DOS
DOS Fn 2eH: Установить/сбросить переключатель верификации
DOS Fn 2fH: Дать текущий DTA
DOS Fn 30H: Дать номер версии DOS
DOS Fn 31H: Завершиться и остаться резидентным — KEEP
DOS Fn 32H: Дать дисковую информацию DOS (недокументировано)
DOS Fn 33H: Установить/опросить уровень контроля прерывания DOS
DOS Fn 34H: Адрес статуса реентерабельности DOS
DOS Fn 35H: Дать вектор прерывания
DOS Fn 36H: Дать свободную память диска
DOS Fn 37H: Установить/опросить символ-переключатель (недокументировано)
DOS Fn 38H: Дать/Установить информацию страны
DOS Fn 39H: Создать новое оглавление — MKDIR
DOS Fn 3aH: Удалить оглавление — RMDIR
DOS Fn 3bH: Установить умалчиваемое оглавление DOS — CHDIR
DOS Fn 3cH: Создать описатель файла
DOS Fn 3dH: Открыть описатель файла
DOS Fn 3eH: Закрыть описатель файла
DOS Fn 3fH: Читать файл через описатель
DOS Fn 40H: Писать в файл через описатель
DOS Fn 41H: Удалить файл
DOS Fn 42H: Установить указатель файла — LSEEK
DOS Fn 43H: Установить/опросить атрибут файла — CHMOD
DOS Fn 44H: Управление вводом-выводом устройства — IOCTL
DOS Fn 45H: Дублировать описатель файла — DUP
DOS Fn 46H: Переназначить описатель — FORCDUP
DOS Fn 47H: Дать умалчиваемое оглавление DOS
DOS Fn 48H: Распределить память (дать размер памяти)
DOS Fn 49H: Освободить блок распределенной памяти
DOS Fn 4aH: Сжать или расширить блок памяти
DOS Fn 4bH: Выполнить или загрузить программу — EXEC
DOS Fn 4cH: Завершить программу — EXIT
DOS Fn 4dH: Дать код выхода программы — WAIT
DOS Fn 4eH: Найти 1-й совпадающий файл
DOS Fn 4fH: Найти следующий совпадающий файл
DOS Fn 54H: Дать переключатель верификации DOS
DOS Fn 56H: Переименовать/переместить файл
DOS Fn 57H: Установить/опросить время/дату файла
DOS Fn 59H: Дать расширенную информацию об ошибке
DOS Fn 5aH: Создать уникальный временный файл
DOS Fn 5bH: Создать новый файл
DOS Fn 5cH: Блокировать/разблокировать доступ к файлу
DOS Fn 5eH: Различные сетевые функции
DOS Fn 5fH: Переназначение устройств в сети
DOS Fn 62H: Дать адрес префикса программного сегмента
═══════════════════════════════════ ════════════════════╡ Прерывания DOS
INT 20H: Завершить программу
INT 21H: Функции DOS
INT 22H: Адрес завершения
INT 23H: Адрес выхода по Ctrl-Break
INT 24H: Обработчик критических ошибок
INT 25H/26H: Прямые дисковые чтение/запись
INT 27H: Завершиться и остаться резидентным
INT 28H: Квант времени DOS (недокументировано)
INT 2eH: Выполнить команду DOS (недокументировано)
INT 2fH: Мультиплексное прерывание

Dos fn 49h: освободить распределенный блок памяти

Автор: Рустам Гадеев, 15 May 98

Если вы заметили в документе
опечатки или неточности перевода,
просьба сообщить о них!
Перевод на русский язык и оформление:
Валерий Вотинцев

3.2. РАСШИРЕННЫЙ ИНТЕРФЕЙС DOS INT 21H (EXTENDED DOS API)

Перечень поддерживаемых функций:

09h Вывод строки на консоль Write string to console
1Ah Установить адрес DTA (disk transfer area) Set disk transfer area address
1Bh Получить характеристики текущего диска Get allocation information for default drive
1Ch Получить характеристики указанного диска Get allocation information for specific drive
1Fh Получить DPB (drive parameter block) для текущего диска Get drive parameter block for default drive
25h Установить обработчик прерывания (Set interrupt vector) Set interrupt vector
2Fh Получить адрес DTA (disk transfer area) Get disk transfer area address
32h Получить DPB (drive parameter block) для указанного диска Get drive parameter block for specific drive
34h Получить адрес флага InDos Get address of InDos flag
35h Получить адрес обработчика прерывания Get interrupt vector
39h Создать каталог (директорий) Create subdirectory
3Ah Удалить каталог (директорий) Remove subdirectory
3Bh Изменить текущий каталог Change current directory
3Ch Создать новый файл Create new file
3Dh Открыть существующий файл Open existing file
3Fh Чтение из файла Read from file
40h Запись в файл Write to file
41h Удалить файл с диска Delete file
43h Получить/Установить атрибуты файла Get/set file attributes
44h IOCTL IOCTL
47h Получить имя текущего каталога Get current directory
48h Выделить блок памяти DOS Allocate DOS memory block
49h Освободить блок памяти DOS Free DOS memory block
4Ah Изменить размер блока памяти DOS Resize DOS memory block
4Bh Загрузить и выполнить программы Load and execute child program
4Eh Найти первый файл по маске (Find first) Find first matching file
4Fh Найти следующий файл по маске (Find next) Find next matching file
56h Переименовать файл Rename file
5Ah Создать временный файл Create temporary file
5Bh Создать новый файл Create new file

Подробное описание функций WDOSX для расширенного интерфейса DOS INT 21h:

9h — Вывод строки на консоль

1Ah — Установить адрес DTA (disk transfer area)

1Bh — Получить характеристики текущего диска

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL