EXE заголовок

Тема в разделе "WASM.BEGINNERS", создана пользователем tahir, 4 апр 2009.

  1. tahir

    tahir New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2009
    Сообщения:
    22
    Всем привет! Разбираюсь с заголовком EXE файла(DOS)
    Подскажите для чего нужна таблица настройки адресов ?

    Написал прогу для чтения заголовка, посмотрел на настройку адресов в таблице, она указывает на некий участок в программе, что это дает для программисту?
    Вирусу нужна эта таблица ?
    А если написать прогу чтобы она восстанавливала себя из памяти на диск, нужна таблица?
     
  2. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    tahir
    Когда ехешник состоит из нескольких сегментов (не обязательно 65536 байт длиной каждый), для доступа к каждому сегменту (как коду, так и данным) приходится применять абсолютную адресацию сегмента. К примеру - вызов процедуры в другом сегменте - call 1234:5678 - смещение в сегменте всегда известно, а абсолютный адрес сегмента (1234) - нет, его загрузчик ФС динамически вычисляет при загрузке проги в память. Поэтому по таблице в шапке ехешника и происходит настройка абсолютов в уже загруженной проге.
     
  3. tahir

    tahir New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2009
    Сообщения:
    22
    Спасибо!
    Это я понял, но получается система держит эти переменные держит где-то, заголовок не грузиться в память?
     
  4. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    tahir
    Система ничего в памяти не держит - считывает заголовок ехешника в память (всегда и обязательно), видит, сколько элементов надо настроить и согласно им считывает остальное от ехешника (причем не все, а только небходимое). Когда это положили в память, начинает корректировать абсолютные адреса сегментов. Когда коррекцию произвела (ведь ехешник может грузиться изначально по любому сегментгому адресу) - передает на него управление - он запускается.
     
  5. tahir

    tahir New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2009
    Сообщения:
    22
    Memphis
    интересно пообщаться с умными людьми...
    ведъ файл ехе считывается в память целиком , если не оверлей
    так ведъ, только код в один сегмент, данные в другой, стек в в третьем
     
  6. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    ДОС грузит в память, если память не изменяет, не весь ехешник, а ровно столько, сколько указано в его заголовке, после чего производит настройку в соответствии с адресом загрузки и запускает файл на выполнение.
     
  7. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    ... и винда кстати тоже
     
  8. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Некорректное утверждение. DOS резервирует N-ное количество параграфов, указанное в заголовке файла (не считая тех, что нужны для переменных среды и PSP), и в начало данной области загружает двоичный образ всех сегментов, после чего производит настройку сегментных адресов в пределах образа. Сегментов любого типа в файле может быть множество (в исполняемом файле они не различаются по типам, там лишь хранятся два указателя - точки входа и вершины стека), причем размером хоть по 16 байт.
     
  9. Memphis

    Memphis New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2008
    Сообщения:
    104
    tahir
    ведъ файл ехе считывается в память целиком , если не оверлей - да нет. ФС сама решает (правда, не знаю как), сколько кода надо положить в память. Пример - чистый ДОС (размер ОЗУ ограничен 10-ю сегментами). Запускаю, к примеру, Раровский SFX (ехешник), длиной пусть 30 МБ - разумеется, столько невозможно положить в ОЗУ за один присест - тем не менее, он успешно запускается и распаковывается.
     
  10. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    ну во первых в конце у него оверлей с архивом, а во вторых в заголовке программы имеются все необходимые данные, на тему распределения памяти и адреса запуска
     
  11. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Phantom_84
    только мне казалось что дос лишь принимает к сведению максимально необходимый размер памяти и отдает всю имеющуюся память в распоряжение программы. во всяком случае, чтобы запустить программу из программы с помощью функций доса нужно сначала освободить для нее память, не используемую текущей программой. это описано аж в 5 разных книгах, разных авторов по программированию под дос в разделах посвященных tsr-программам (Terminate and Stay Resident)
     
  12. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    а вот тут могу не согласиться. переменных среды располагаются в разных версиях доса в разных областях, но в основном это либо адреса ниже первых 64 Кб, либо 64 Кб выше 1-го Мб и в отличие от PSP не куда оттуда не деваются, а вот PSP приклеивается к программе как целый отдельный сегмент, который принадлежит лично ей и существует пока программа не завершится.
     
  13. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Для COM-программы - да, для EXE-программы в MZ-заголовке есть поле, указывающее необходимый размер памяти, и (если я не ошибаюсь) выделяется только необходимый размер, а остаток остаётся свободным.
     
  14. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Представьте там аж даже два такие поля, первое нужно чтобы иногда выдавать сообщение out of memory. а второе чтобы знать надо ли перемещать часть command.com на диск, чтобы освободить часть памяти. больше эти поля никак системой не интерпретируются, а системный загрузчик всегда сливает программе всю память (ибо одна задача. зачем системе еще может понадобится память)
     
  15. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Да неужели?
    Вот фрагмент из исходников DosBox, ответственный за выделение памяти при запуске:
    Код (Text):
    1.         /* Get Memory */       
    2.         Bit16u minsize,maxsize;Bit16u maxfree=0xffff;DOS_AllocateMemory(&pspseg,&maxfree);
    3.         if (iscom) {
    4.             minsize=0x1000;maxsize=0xffff;
    5.             if (machine==MCH_PCJR) {
    6.                 /* try to load file into memory below 96k */
    7.                 pos=0;DOS_SeekFile(fhandle,&pos,DOS_SEEK_SET); 
    8.                 Bit16u dataread=0x1800;
    9.                 DOS_ReadFile(fhandle,loadbuf,&dataread);
    10.                 if (dataread<0x1800) maxsize=dataread;
    11.                 if (minsize>maxsize) minsize=maxsize;
    12.             }
    13.         } else {    /* Exe size calculated from header */
    14.             minsize=long2para(imagesize+(head.minmemory<<4)+256);
    15.             if (head.maxmemory!=0) maxsize=long2para(imagesize+(head.maxmemory<<4)+256);
    16.             else maxsize=0xffff;
    17.         }
    18.         if (maxfree<minsize) {
    19.             DOS_SetError(DOSERR_INSUFFICIENT_MEMORY);
    20.             DOS_FreeMemory(envseg);
    21.             return false;
    22.         }
    23.         if (maxfree<maxsize) memsize=maxfree;
    24.         else memsize=maxsize;
    25.         if (!DOS_AllocateMemory(&pspseg,&memsize)) E_Exit("DOS:Exec error in memory");
    Тут прямо написано, что выделяемый размер памяти не превышает значения maxmemory из заголовка (может быть меньше, если свободной памяти меньше, но гарантированно не меньше minmemory). А DOSBox довольно точно эмулирует DOS.

    Added:
    Динамическая память (функции 48h/49h/4Ah) для этой задачи, естественно.