Почему начальные адреса в ОП, на которые загружается программа, одинаковы на всех компьютерах?

..открою маленький секрет, что буквально все процессоры(64/32) в защищённом режиме используют одинаковую модель памяти. По большей мере связано это с тем, что новая организация/адресация памяти требует новых компиляторов

(С++, ассемблер etc)

. Отсюда следует, что никаких изменений подсистемы памяти даже в отдалённом будущем не планируется, т.к. придётся переписывать все компиляторы.

Сегментация в любом её виде - это абстракция. Попробую объяснить, почему..

Любая ОС адресует память посредством всего 2-х селекторов - один CS; другой DS,ES,SS,GS,FS. Оба селектора имеют базу(0) и лимит(4Gb). В FS загружает селектор сегмента TEB

(Thread_Environment_Block', он-же TIB)

.

Фактически, ОС выделяет всего один сегмент и для кода, и для данных, и для стека. Благодаря этому все переходы внутри программы типа 'NEAR'

(близкие.. префиксы не нужны)

. Хотя селектор(CS) не равен селекторам(DS,ES,SS), дополнение этими префиксами операндов приведёт к чтению одной и той-же ячейки памяти. Вот пример:

AssemblerВыделить код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

;fasm-code
;---------
format  PE console
include   'win32ax.inc'
.code
start:  nop
        nop
        mov   eax,[cs:array]
        mov   ebx,[ds:array]
        mov   ecx,[es:array]
        mov   edx,[ss:array]
     invoke   ExitProcess,0
.end start
;---------
.data
array  dd  12345678h

На рисунке видно, что селекторы в регистрах различные, но на адресацию памяти они не влияют

(красным выделены базы, а синим - лимиты, во-всех РОН находится тестовое значение)

. Регионы кода, стека и данных отличаются лишь атрибутами принадлежащих им страниц: CS=R/Ex, DS=R/W, SS=R/W/Ex. Начиная с Win7, атрибут исполнения(Ex) у регистра(SS) уже отняли, и за исполняемым стеком чутко следит визор. В селекторах сегментных регистров, атрибуты контролируют только хозяина сегмента (юзер или ОС - уровень привелегий), а в дескрипторах - уже контроль на доступ к самим страницам памяти (R,W,Ex).

Чтобы раз и навсегда избавиться от этой путаницы, в 64-бит системах на аппаратном уровне запихали нули во-все селекторы, ведь у 32 они всё-равно были нулевые. При этом, 'защиту от дурака' тоже предусмотрели, и в РМode, блок сегментации в MMU вообще отключили. Достоверно проверить не могу

(у меня проц 32-бит)

, но думаю-что в реальном режиме сегментация у 64-бит всё-таки работает, чтобы обеспечить Reset и POST при включении машины. Хотя в этом году я уже ошибался 4-раза, и может это пятый...