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

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

Date: 2014-10-14 06:51 (UTC)
From: [identity profile] ircicq.livejournal.com
4MB - альтернативный размер страницы для x86

Date: 2014-10-14 07:06 (UTC)
From: [identity profile] archaicos.livejournal.com
Но появился-то он далеко не сразу. :)

Date: 2014-10-14 07:09 (UTC)
From: [identity profile] sab123.livejournal.com
Резервируется не только первая страница, а целый первый страничный директорий?

Date: 2014-10-14 07:27 (UTC)
From: [identity profile] raydac.livejournal.com
вспомнилась БК-0010 где стартовый адрес был с 1000 (в восьмиричной системе)

Date: 2014-10-14 07:28 (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner
А в MSDOS стартовый адрес (относительно начала сегмента) .com-программы был 0x100

Date: 2014-10-14 07:40 (UTC)
From: [identity profile] archaicos.livejournal.com
Ага. Так в Windows 3.xx было сделано, типа оптимизация. А потом расползлось дальше.
http://blogs.msdn.com/b/oldnewthing/archive/2014/10/03/10562176.aspx

Date: 2014-10-14 07:58 (UTC)
From: [identity profile] b00ter.livejournal.com
ЕМНИП, это было из-за заголовка EXE-файла.

Date: 2014-10-14 08:14 (UTC)
From: [identity profile] ircicq.livejournal.com
у .COM не было заголовка.
этот формат - наследие CP/M

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:22 (UTC)
From: [identity profile] b00ter.livejournal.com
У EXE он был. :)

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,

Date: 2014-10-14 08:47 (UTC)
From: [identity profile] archaicos.livejournal.com
У DOS'овского .EXE нет ограничения подобного тому, что есть у .COM.

Date: 2014-10-14 08:48 (UTC)
From: [identity profile] ibnteo.livejournal.com
Это потому, что первые 512 байт (01000) использовались для нужд процессора, адреса прерываний, стек возвратов и т.п. Некоторые программы загружались с адреса 0760, чтобы подменить адрес возврата в стеке на стартовый адрес программы (на самом деле нужно было его подменить по адресу 0766), то есть, были автозапускаемыми.

Date: 2014-10-14 13:58 (UTC)
From: [identity profile] eeeeeeeeeeeeee.livejournal.com
http://blogs.msdn.com/b/oldnewthing/archive/2014/10/03/10562176.aspx

Date: 2014-10-14 14:51 (UTC)
From: [identity profile] sab123.livejournal.com
Ну, кстати, в Виндовсе нынче бинарники грузятся на случайный (в некоторых пределах) адрес. Чтобы осложнить жизнь атакам переполнения стека, которые пишут на стек интересный адрес перехода.

Date: 2014-10-14 18:38 (UTC)
From: [identity profile] sagarasousuke.livejournal.com
...и всякий уважающий себя резидент норовил откусить излишек PSP и переехать :)))

Date: 2014-10-14 18:41 (UTC)
From: [identity profile] sagarasousuke.livejournal.com
не-не-не, Дэвид Блейн! заголовок EXE с информацией о сегментах и настройке адресов при загрузке это одно, а PSP процесса с контекстом (в т.ч. банальными "опциями командной строки" что передаются при запуске - верхние 128 байт PSP) - совсем иное.

Date: 2014-10-31 06:53 (UTC)
From: [identity profile] archaicos.livejournal.com
Кстати, проверил, в 32-битной Ubuntu 12.04LTS:

$ objdump -x /bin/bash

/bin/bash:     file format elf32-i386
/bin/bash
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x080604a8

Program Header:
    PHDR off    0x00000034 vaddr 0x08048034 paddr 0x08048034 align 2**2
         filesz 0x00000120 memsz 0x00000120 flags r-x
  INTERP off    0x00000154 vaddr 0x08048154 paddr 0x08048154 align 2**0
         filesz 0x00000013 memsz 0x00000013 flags r--
    LOAD off    0x00000000 vaddr 0x08048000 paddr 0x08048000 align 2**12
         filesz 0x000db884 memsz 0x000db884 flags r-x
    LOAD off    0x000dbf04 vaddr 0x08124f04 paddr 0x08124f04 align 2**12
         filesz 0x00004870 memsz 0x00009840 flags rw-
 DYNAMIC off    0x000dbf18 vaddr 0x08124f18 paddr 0x08124f18 align 2**2
         filesz 0x000000d8 memsz 0x000000d8 flags rw-
    NOTE off    0x00000168 vaddr 0x08048168 paddr 0x08048168 align 2**2
         filesz 0x00000044 memsz 0x00000044 flags r--
EH_FRAME off    0x000c35f8 vaddr 0x0810b5f8 paddr 0x0810b5f8 align 2**2
         filesz 0x00003d24 memsz 0x00003d24 flags r--
   STACK off    0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**2
         filesz 0x00000000 memsz 0x00000000 flags rw-
   RELRO off    0x000dbf04 vaddr 0x08124f04 paddr 0x08124f04 align 2**0
         filesz 0x000000fc memsz 0x000000fc flags r--
...


Так что вот, не всякий Linux начинает с четырёх гигабайт.
Edited Date: 2014-10-31 06:54 (UTC)