|
|
|
BlastFromThePast: MSDOS EXE relocation table: как пользовать.
|
|||
|---|---|---|---|
|
#18+
Граждане, не дайте умереть! Возникла насущная необходимость вспомнить, как загрузчик операционной системы MSDOS использует данные из relocation table заголовка MZ-EXE файла. Нужно описание как именно он это делает. Т.е. как используются данные из relocation table. А то гуглю-гуглю... А за давностью лет оно уже наверное настолько потеряло актуальность, что ничего кроме формата MZ и "it does a seek to the relocation offset and does a segment fixup" найти не могу. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2007, 00:43 |
|
||
|
BlastFromThePast: MSDOS EXE relocation table: как пользовать.
|
|||
|---|---|---|---|
|
#18+
Ладно, как-то неконкретно получилось. Исправляюсь: 1. MS-DOS: every program is linked as though it will be loaded at location zero. 2. Вот тут товарищ написал: Поэтому при загрузке программы к каждому сегментному адресу прибавляется значение начального сегмента программы. Этот процесс и называют настройкой адресов. Для получения такой информации система использует таблицу настройки 3. Формат элементов relocation table: Код: plaintext 1. 2. 3. Вопрос: ну и чего делать-то, чтобы настройку адресов провести? Брать 4 байта оттуда, куда элемент RT указывает (segment:offset) и прибавлять значение, которое в этих 4-х байтах содержится? (соответственно для сегмента и для офсета) Или нечто иное? Просвятите плз... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2007, 01:26 |
|
||
|
BlastFromThePast: MSDOS EXE relocation table: как пользовать.
|
|||
|---|---|---|---|
|
#18+
Cтранно ты как-то мыслишь... Нужно прибавлять стартовый сегмент программы к слову, записанному по адресу, указанному в relocation table. Адрес, само собой, опять же относительный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2007, 01:32 |
|
||
|
BlastFromThePast: MSDOS EXE relocation table: как пользовать.
|
|||
|---|---|---|---|
|
#18+
P.S. Прочитал еще раз и понял, что почти слово в слово повторил "того товарища". Не знаю, как еще объяснить.... попробую. Вообще прочитай про загрузчик, это понятие универсальное. Для начала представь себе плоскую модель памяти: байты нумеруются с нуля и до N. Программа компилируется так, словно она ложится в память с байта 0. Загрузчик считывает программу в ячейки X0...X1 и прибавляет X0 в каждую ячейку, в которой хранится абсолютный адрес. Relocation table - и есть список таких ячеек. В MS-DOS адрес - двадцатибитовое значение, формирующееся из двух шестнадцатибитных: сегмента и смещения. Программа всегда грузится со смещением 0, то есть для адресации программы достаточно задать сегмент и прибавлять его к сегментной части адреса в программе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2007, 01:37 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=34903288&tid=1345746]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
7ms |
get forum data: |
3ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 279ms |
| total: | 405ms |

| 0 / 0 |
