|
|
|
|
Блок начального распределения памяти .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;
|
|
|