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

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

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)