Почему я не могу изменить значение сегментного регистра? (MASM)

Измените Global.asax.cs, включая событие Application_Start, с помощью:

Database.SetInitializer<YourDatabaseContext>(
 new DropCreateDatabaseIfModelChanges<YourDatabaseContext>());
8
задан Ciro Santilli 新疆改造中心法轮功六四事件 20 October 2015 в 10:27
поделиться

2 ответа

Вы сказали, что интересовались почему, таким образом:

В реальном режиме сегмент является 64K "окном" к физической памяти, и эти окна расположены с интервалами на расстоянии в 16 байтов. В защищенном режиме сегмент является окном или к физической памяти или к виртуальной памяти, размер которой и местоположение определяются ОС, и это имеет много других свойств, включая то, какой уровень полномочий процессу, должно быть, придется получить доступ к нему.

Отсюда на, все, что я говорю, относится к защищенному режиму.

Существует таблица в памяти, названной глобальной таблицей дескрипторов (GDT), которая является, где информация об этих размерах окна и местоположениях и других свойствах хранится. На основе для каждого процесса могут также быть локальные таблицы дескрипторов, и они работают похожим способом, таким образом, я просто сфокусируюсь на GDT.

Значение, которое Вы загружаете в сегментный регистр, известно как селектор сегмента. Это - индекс в GDT или LDT с небольшим количеством дополнительной информации о безопасности. Естественно, если программа пытается загрузить дескриптор, который является вне границ GDT, исключение происходит. Также, если процесс не имеет достаточного полномочия получить доступ к сегменту, или что-то еще недопустимо, исключение происходит.

Когда исключение происходит, ядро обрабатывает его. Этот вид исключения был бы, вероятно, классифицирован как отказ сегментации. Таким образом, ОС закрывает Вашу программу.

Существует один заключительный протест: в x86 системе команд Вы не можете загрузить непосредственные значения в сегментные регистры. Необходимо использовать промежуточный регистр или операнд памяти или POP в сегментный регистр.

MOV DS, 160  ;INVALID - won't assemble

MOV AX, 160  ;VALID - assembles, but will probably result in an
MOV DS, AX   ;exception, and thus the death of your program

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

  • Механизмы защиты, такие как то, чтобы мешать пространству пользователя обрабатывает вредить друг другу или ОС
  • Контакт с несколькими/многоядерными процессорами
  • Локальная память потока: как оптимизация, некоторые операционные системы (включая Linux и Windows) используют сегментные регистры для локальной памяти потока (TLS). Так как потоки совместно используют то же адресное пространство, потоку трудно "знать", где его регион TLS, не используя системный вызов или тратя впустую регистр..., но так как сегментные регистры практически бесполезны, нет никакого вреда в "трате" их ради быстрого TLS. Обратите внимание, что при установке этого, ОС могла бы пропустить сегментные регистры и записать непосредственно в регистры кэша дескриптора, которые "скрыты", регистры раньше кэшировали поиски GDT/LDT, инициированные ссылками на сегментные регистры, в этом случае при попытке читать из сегментных регистров, то Вы не будете видеть его.

Кроме сегмента на поток для TLS, действительно только горстка сегментов (времена количество процессоров) используется, и только ОС. Прикладные программы могут полностью проигнорировать сегментные регистры.

Это происходит из-за дизайна ОС, не к любым техническим ограничениям. Могут быть встроенные операционные системы, которые требуют, чтобы программы пространства пользователя работали с сегментными регистрами, хотя я не знаю ни о ком.

9
ответ дан 5 December 2019 в 15:28
поделиться

Вы пишете исполняемые файлы окон?

В защищенном режиме (Win32) сегментные регистры больше не используются.

Ссылка:

Модель памяти также решительно отличается с былых времен 16-разрядного мира. Под Win32 мы не должны быть обеспокоены моделью памяти или сегментом больше! Существует только одна модель памяти: Модель сплошной памяти. Больше нет 64K сегментов. Память является большим непрерывным пространством 4 ГБ. Это также означает, что Вы не должны играть с сегментными регистрами. Можно использовать любой сегментный регистр для обращения к любой точке в пространстве памяти. Это - БОЛЬШАЯ справка к программистам. Это - то, что делает блок Win32, программируя столь же легкий как C.

2
ответ дан 5 December 2019 в 15:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: