vak: (Улыбка)
[personal profile] vak
Стартовый адрес программы в большинстве современных 32-битных операционных систем (Windows, Linux, BSD) равен 0x0400000? Понятно, что не ноль: чтобы обращение по нулевому указателю давало ошибку. Но почему именно 4 мегабайта? Этому есть вполне логичное объяснение.

В 64-битных системах другой начальный адрес, а именно 0x100000000 (4 гигабайта).

Date: 2014-10-14 08:17 (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner
Не надо путать заголовок EXE-файлв. который в файле и оставался, и Program Segment Prefix. Это разные вещи. У .com-файлов, кстати никакого заголовка не было. Просто кусок машинного кода, который загружается в память как есть, без всякой настройки адресов, и получает выполнение.

Date: 2014-10-14 08:24 (UTC)
From: [identity profile] b00ter.livejournal.com
М-м-м, тогда какой смысл смещать точку начала исполнения у беззаголовочного шмата кода?

Date: 2014-10-14 08:31 (UTC)
From: [identity profile] ircicq.livejournal.com
первые 256 байт имели служебное назначение, блок PSP
там хранилась командная строка, таблица открытых файлов ....

Date: 2014-10-14 08:34 (UTC)
From: [identity profile] b00ter.livejournal.com
Да, уже ткнули носом, спасибо. Я так понял, длина заголовка EXE - это просто "счастливое совпадение".

Date: 2014-10-14 08:38 (UTC)
From: [identity profile] dimorlus.livejournal.com
Длина у заголовка exe - любая, часть заголовка - это relocation table.

Date: 2014-10-14 08:43 (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner
Потому что операционной системе надо положить куда-нибдуь полезную информацию, которая должна быть доступна куску кода - таблицу файловых дескрипторов, командную строку указатель на environment,