Сегментная организация памяти

Для представления 20-разрядного линейного адреса в процессоре Intel 8086 используется пара 16-разрядных адресных регистров: один из них (называемый базовым или сегментным регистром) хранит номер сегмента памяти, а второй – регистр адреса команды IP (Instruction Pointer) – хранит смещение относительно начала этого сегмента. Для хранения номеров сегментов могут использоваться различные специализированные сегментные регистры, например, регистр CS (Code Segment) содержит номер сегмента программного кода, регистр SS (Stack Segment) – номер сегмента стека, а регистр DS (Data Segment) – номер сегмента данных.

20-разрядный линейный адрес вычисляется в сумматоре адреса - специализированном аппаратном устройстве, входящем в состав центрального процессора. Сумматор адреса выполняет операцию сложения со сдвигом над двумя операндами, содержащимися в соответствующем сегментном регистре и регистре смещения, по следующей формуле:


+ IP

При выполнении первой операции содержимое сегментного регистра (номер сегмента) сдвигается на 4 двоичных разряда влево (т.е. умножается на 1610) – в результате получается 20-битовый базовый адрес - линейный адрес начала сегмента, номер которого указан в CS.После сложения базового адреса сегмента с содержимым регистра смещения IP на выходе сумматора формируется полный 20-битовый линейный адрес, который и передается на адресную шину[7].

Любой линейный адрес может быть записан двумя 16-битовыми числами в так называемой сегментной форме: <номер сегмента>:<смещение>. На рисунке 2.1 левый столбец содержит сегментные адреса в 16-ричном формате.

Учитывая приведенную выше формулу, а также тот факт, что все адресные регистры рассматриваемого центрального процессора – 16-разрядные, можно сделать следующие выводы:

Процессор может поддерживать не более 65536 различных сегментов памяти.

Размер каждого сегмента не может превышать 65536 байтов (64 Кб).

Сегменты выровнены по 16-байтовым границам, то есть их базовые адреса кратны 16 (это, в частности, означает, что если номера сегментов отличаются на "1", то их базовые адреса отличаются на "16").

Сегменты (если их длина превышает 16 байтов) могут пересекаться в физическом адресном пространстве, то есть один и тот же физический адрес может быть представлен различными сегментными адресами: например, 0000:0408h эквивалентно 0040:0008h, так как оба этих сегментных адреса определяют один и тот же физический адрес 00408h.

В процессорах с 20-разрядной адресной шиной максимальное значение физического адреса составляет FFFFFh, что обеспечивает размер адресного пространства в 1 Мб. Однако, используемый в этих процессорах способ формирования физического адреса путем суммирования базового адреса сегмента со смещением позволяет определить линейные адреса, находящиеся за пределами 1-мегабайтной границы. При максимальных значениях номера сегмента и смещения сегментный адрес FFFF:FFFFсоответствует линейному адресу 10FFEFh, что "расширяет" адресное пространство почти на 64 килобайта и требует увеличения на "1" разрядности адресной шины. В процессоре i8086 такая ситуация обрабатывается путем игнорирования старшего бита вычисленного линейного адреса, который для рассмотренного выше примера будет иметь значение 0FFEFh.В процессоре i80286 (из-за ошибки разработчиков!) программам оказалась доступной 21-я линия адресной шины (А20), что позволило реально расширить линейно-адресуемую область памяти до 1062 Мб и использовать так называемую "верхнюю" память (HMA - High Memory Area). В процессорах i80386 и выше возможна аппаратная блокировка линии А20 адресной шины.