Почему 64-битный режим (длинный режим) не использует регистры сегментов?

Я начинающий студент:) Я изучаю архитектуру Intel, и я изучаю управление памятью, например, сегментирование и пейджинг. Я читаю руководство Intel, и довольно приятно понимать архитектуры Intel.

Однако мне все еще интересно что-то фундаментальное. Почему в 64-битном режиме все регистры сегментов будут бит 0? Почему система больше не использует сегментные регистры?

Поскольку системная 64-разрядная размерность (например, регистры GP) достаточна для того, чтобы содержать эти логические адреса сразу? Защищена ли защита в 64-битном режиме?

Я попытался найти 64-битную адресацию, но не смог найти ее в Google. Возможно, у меня есть ужасное поисковое умение, или мне могут понадобиться некоторые определенные предыдущие знания для поиска в google.

Следовательно, я хотел бы знать, почему 16 бит сегментных регистров не будет использоваться в 64-битном режиме, и как защитить работу в 64-битном режиме.

Спасибо!

Ответ 1

Говоря говоря, когда вы выполняете адресацию с массивом ( "индексированный" ) с общими регистрами, вы делаете по существу то же самое, что и регистры сегментов. В bad old days 8-битного и 16-битного программирования многие приложения требовали гораздо больше данных (а иногда и большего количества кода), чем мог достигнуть 16-разрядный адрес.

Так много CPU решили это, имея большее адресное пространство памяти, чем могли достигнуть 16-разрядные адреса, и сделали доступными регионы памяти с помощью "сегментных регистров" или аналогичных. Программа установит адрес в "регистре сегментов" на адрес, расположенный выше (65536 байт) 16-разрядного адресного пространства. Затем, когда были выполнены определенные инструкции, они добавили бы указанный адрес инструкции в соответствующий (или указанный) "сегментный регистр" для считывания данных (или кода) за пределы диапазона 16-разрядных адресов или 16-разрядных смещений.

Однако сегодня ситуация противоположная!

Как так? Сегодня 64-разрядный процессор может адресовать больше (не менее) всего адресуемого пространства памяти. Большинство 64-разрядных процессоров сегодня могут обращаться с чем-то вроде 40-бит до 48 бит физической памяти. Правда, нет ничего, что помешало бы им обращаться к полному 64-битовому пространству памяти, но они никого не знают (но NSA) могут позволить себе такую ​​большую ОЗУ, и, кроме того, повесить столько RAM на процессорную шину, чтобы загрузить ее с емкостью, и замедлить ВСЕ доступ к памяти за пределами чипа CPU.

Следовательно, текущее поколение основных процессоров может адресовать 40-битные данные на 48 бит пространства памяти, что составляет более 99,999% рынка, которые когда-либо могли бы достичь. Обратите внимание, что 32-битные 4-гигабайты (которые некоторые люди превышают сегодня в 2, 4, 8, 16), но даже 40-битные могут адресовать 256 * 4GB == 1024GB == 1TB. В то время как 64 ГБ оперативной памяти сегодня разумно и, возможно, даже 256 ГБ в крайних случаях, 1024 ГБ просто не нужны, кроме, возможно, 0,001% приложений и недоступны для загрузки.

И если вы находитесь в этой категории 0.001%, просто купите один из процессоров, которые обращаются к 48-битной физической памяти, и вы говорите 256 ТБ..., что в настоящее время непрактично, потому что оно будет загружать шину памяти с помощью слишком большая емкость (возможно, даже до такой степени, что шина памяти перестанет работать).

Дело в этом. Когда ваши обычные режимы адресации с обычными 64-битными регистрами могут обращаться к значительно большему количеству памяти, чем может содержать ваш компьютер, традиционная причина добавления регистров сегментов исчезает.

Это не означает, что люди не могли найти полезные цели для сегментных регистров в 64-разрядных ЦП. Они могли. Несколько возможностей очевидны. Однако с 64-разрядными общими регистрами и 64-разрядным адресным пространством нет ничего общего с тем, что общие регистры не могли выполнять эти регистры сегментов. И регистры общего назначения имеют очень много целей, регистры сегментов которых нет. Поэтому, если кто-то планировал добавить больше регистров в современный 64-битный процессор, они добавили бы регистры общего назначения (которые могут что-то делать "что угодно" ), а не добавлять "сегментные регистры с очень ограниченной целью".

И действительно, они есть. Как вы, возможно, заметили, AMD и Intel продолжают добавлять в регистрационный файл SIMD больше [sorta] регистров общего назначения, а AMD удвоила количество [действительно] регистров общего назначения, когда они спроектировали свои 64-разрядные процессоры x86_64 (которые Intel копируется).

Ответ 2

Большинство ответов на вопросы о нерелевантности сегментных регистров в 32/64 бит мира всегда сосредоточены вокруг адресации памяти. Мы все согласны с тем, что основная цель регистров сегментов заключалась в том, чтобы обойти ограничение адресного пространства в 16-битном мире DOS. Однако, с точки зрения безопасности, сегментные регистры сегментов обеспечивают 4 кольца изоляции адресного пространства, которые недоступны, если мы выполняем режим с 64-разрядным интервалом, скажем, для 64-разрядной ОС. Это не проблема с текущей популярной ОС, такой как Windows и Linux, которые используют только ring 0 и ring 3 с двумя уровнями изоляции. Кольца 1 и 2 иногда являются частью ядра, а иногда и частью пользовательского пространства, в зависимости от того, как написан код. С появлением аппаратной виртуализации (в отличие от виртуализации ОС) с точки зрения изоляции гипервизоры не вполне соответствовали ни в кольце 0, ни в кольце 1/2/3. Intel и AMD добавили дополнительные инструкции (например, INTEL VMX) для корневых и некорневых операций виртуальных машин.

Итак, в чем смысл? Если вы разрабатываете новую безопасную ОС с 4-мя кольцами изоляции, тогда мы сталкиваемся с проблемами, если сегментация отключена. В качестве примера мы используем по одному кольцу для аппаратного мультиплексора, кода гипервизора/контейнеров/виртуальной машины, ядра ОС и пользовательского пространства. Таким образом, мы можем сделать дело для повышения безопасности, обеспечиваемой сегментацией, исходя из требований, изложенных выше. Тем не менее, Intel/AMD по-прежнему позволяют регистру сегментов F и G иметь ненулевое значение (т.е. Сегментация не отключена). Насколько я знаю, ни одна ОС не использует этот луч надежды написать более безопасный OS/Hypervisor для аппаратной виртуализации.