OSDev Wiki
Advertisement

Сегмент в процессорах архитектуры IA-32 с технической точки зрения является непрерывным участком памяти, доступ к которому осуществляется без изменения значения, загруженного в какой-либо сегментный регистр. В зависимости от того, какого рода информация содержится в сегменте и через какой сегментный регистр к ней осуществляется доступ, различают сегменты кода, стека и данных. Сегменты имеют переменную длину от 1 байта до 64 Кбайт (в реальном или 16-разрядном защищённом режимах) либо от 1 байта до 4 Гбайт (в 32-разрядном защищённом режиме).

Реальное употребление термина "сегмент", однако, по историческим причинам является более широким. Дело в том, что во многих трансляторах языка ассемблера имеются средства разделения кода исходной программы на логически независимые блоки, которые могут размещаться в памяти независимо друг от друга. В ассемблерах большинства вычислительных машин такие блоки называются программными секциями или просто секциями. Их взаимное положение в памяти устанавливается на этапе компоновки (сборки выполняемого модуля из объектных модулей) или даже во время загрузки выполняемого модуля в память. Однако макроассемблер фирмы Microsoft (MASM), а вслед за ним и ряд других трансляторов для ПК вместо традиционного термина "программная секция" использовал термин "сегмент", что и послужило причиной возникновения определённой путаницы: приходится различать "физические сегменты" -- как раз те самые области памяти, доступ к которым осуществляется при неизменном значении сегментного регистра и с которыми имеет дело процессор, и "логические сегменты", используемые программистом для деления программы на логические блоки и эквивалентные по смыслу программным секциям.

Несколько логических сегментов могут собираться в один физический сегмент. Например, в языках высокого уровня для MS DOS было принято логически разделять сегменты инициализированных и неинициализированных данных, однако они объединялись компоновщиком в единый физический сегмент данных, базовый адрес которого при запуске программы загружался в сегментный регистр DS.

В реальном и защищённом режимах процессоров архитектуры IA-32 использование сегментов является обязательным, поскольку вычисление линейного адреса опирается на механизм сегментации. В зависимости от того, каким образом логические сегменты объединяются в физические, можно выделить несколько различных моделей памяти, наиболее удобной из которых является плоская модель памяти, при которой все логические сегменты объединены в один физический, а все сегментные регистры предоставляют доступ к этому единому сегменту.

В 64-разрядном режиме сегментация не используется, поэтому там может использоваться только плоская модель памяти. Однако в режиме совместимости сегментация по-прежнему применяется, поскольку он предназначен для исполнения программ, написанных для защищённого режима.

Advertisement