На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 3 / Блок начального распределения памяти .EXE Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Блок начального распределения памяти .EXE

В примерах, представленных до сих пор, считалось само собой разумеющимся, что MS-DOS при загрузке программы в память распределяет всю оставшуюся память для этой программы. Так, в примере SHOUMEM, показанном на Рис. 3-4, для программы SHOWMEM назначен последний и наибольший блок памяти. Это явление было рассмотрено в главе 2, в которой для программ, приведенных в листингах 2 -12 и 2-13, была использована функция модификации блока распределения памяти (функция 4Ah). Но мы намекали и на другие способы получения свободной памяти для программ типа .EXE. Рис. 3-6 показывает программу типа .EXE, которая имеет большой блок доступной памяти, а последний элемент таблицы 3-3 говорит о том, что размер блока начального распределения программы .EXE может быть изменен. Как это получается?


Заголовок файла типа .EXE содержит два элемента, которые управляют точным предоставлением памяти программе при ее загрузке. Этими двумя элементами являются MinAlloc - минимальное распределение памяти (по смещению 0Ah) и MaxAlloc - максимальное распределение памяти (по смещению 0Сh). Элемент MinAlloc сообщает загрузчику о том, какой объем памяти (в 16-байтовых параграфах) должна иметь программа для выполнения, т.е. сколько байтов использует программа на самом деле. Элемент MaxAlloc, с другой стороны, сообщает загрузчику количество параграфов памяти, которое программа требует распределить для нее.


Компоновщик MS-DOS обычно устанавливает значение элемента MaxAlloc в 0FFFFh, указывающее на то, что программа желает почти 1 Мбайт памяти. Т.к. MS-DOS не может может иметь мегабайт памяти, то она выделяет программе всю оставшуюся память. Однако, если бы мы указали значение элемента MaxAlloc, равное значению элемента MinAlloc, то программа получила бы требуемую ей память, а оставшаяся часть была бы доступна для распределения. Для этого имеется два очень простых способа.


Языки программирования фирмы "Майкрософт", включая MASM, поставляются с утилитой, называемой EXEMOD. Эта утилита может быть использована для отображения и модификации заголовка программы типа .EXE. Рис.3-9 показывает, как необходимо выполнять использование утилиты EXEMOD для получения дампа и затем модификации параметра MaxAlloc. Можно удивиться, увидев, что в примере значение параметра MaxAlloc изменяется на значение 1, но из рассмотрения Рис.3-10 можно видеть, как на самом деле выполняется модификация размера памяти, требуемого для программы SHOWMEM, и как выполняется освобождение памяти. Модифицированный образ программы SHOWMEM в памяти очень похож на образ программы типа .EXE, приведенный на Рис.3-6, включая свободный блок.



               C> exemod c:\guide\examples\showmem.exe

         1     Microsoft R EXE File Header Utility Version 4.02
         2     Copyright c Microsoft Corp 1985-1987. All rights reserved.

               c:\guide\examples\showmem.exe       (hex)         (dec)

         3     EXE size (bytes)                        CC5          3269
         4     Minimum Load size (bytes)               AC5          2757
         5     Overlay number                            0             0
         6     Initial CS:IP                     0093:0000
         7     Initial SS:SP                     0013:0800          2048
         8     Minimum allocation (para)                 0             0
         9     Maximum allocation (para)              FFFF         65535
         10    Header size (para)                       20            32
         11    Relocation table offset                  1E            30
         12    Relocations entries                       1             1

              C> exemod c:\guide\examples\showmem.exe /max 1

         9    Maximum allocation (para)              FFFF         65535

                       Рис.3-9. Использование утилиты EXEMOD
                         для программных файлов типа .EXE:

1 - версия 4.02 утилиты заголовка файла типа EXE фирмы "Майкрософт"; 2 - авторское право фирмы "Майкрософт карпорэйшн" 1985-1987 гг. все права зарезервированы; 3 - размер EXE (в байтах); 4 - минимальный размер для загрузки (в байтах); 5 - номер перекрытия; 6 - начальное значение CS:IP; 7- начальное значение SS:SP; 8 - минимальное распределение; 9 - максимальное распределение; 10 - размер заголовка; 11 - смещение таблицы настройки; 12 - количество настраиваемых элементов.

Увидев, что значения MinAlloc и MaxAlloc равны нулю, Вы удивитесь. Если это имеет место, то действительный размер минимального распределения для программы будет равен размеру самой программы, и дополнительное пространство памяти не распределяется. 1 SM-ShowMem, Version 1.00 c Copyright 1988 2 MCB Size Owner Command Line



             ------------------------------------------------------------
             0A01   08D7   0008   DOS
             12D9   00D3   12DA   [ SHELL ]
             13AD   0003   0000   [ available ]
             13B1   0032   12DA   [ SHELL ]
             13E4   0004   13EA   c:\bin\RETRIEVE.COM
             13E9   00A9   13EA   c:\bin\RETEIEVE.COM
             1493   000F   14A4   s:\MODE.COM\*
             14A3   0017   14A4   s:\MODE.COM\*
             14BB   0010   14CD   c:\ws2000\SWITCH.COM
             14CC   0018   14CD   c:\ws2000\SWITCH.COM
             14E5   0011   14F8   c:\GUIDE\EXAMPLES\SHOWMEM.EXE
             14F7   00D1   14F8   c:\GUIDE\EXAMPLES\SHOWMEM.EXE
             15C9   8A36   0000   [ available ]
             <<<------------- End of Memory Block List ------------->>> 3

          Рис.3-10. Пример отображения из SHOWMEM с параметром MaxAlloc,
                        равным значению параметра MinAlloc:

1 - программа показа памяти - ShowMem, версия 1.00, авторское право 1988; 2 - блок управления памятью, размер, владелец, командная строка; 3 - конец списка блоков памяти.

Таким способом необходимо определять размер всех программных файлов .EXE, и даже учитывать размер EXEMOD при создании командных файлов. Однако, при создании файлов .EXE имеется другой способ управления параметром MaxAlloc - способ использования переключателя "/CPARMAXALLOC:nnn" (сокращенно: "/CP:nnn") компоновщика LINK, где nnn - значение параметра MaxAlloc, выраженное в параграфах. Например, программа SHOWMEM может быть образована со значением параметра максимального распределения, равным 1, путем использования следующей команды:



                      C> link /cp:1 showmem,,,stdlib.lib;

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz