Какие инструкции можно разрешить или запретить выполнять в пользовательском режиме? - PullRequest
3 голосов
/ 04 апреля 2019

Существуют инструкции, которые ЦП никогда не сможет выполнить в пользовательском режиме (например, инструкция HLT).

И есть инструкции, которые ЦПУ всегда сможет выполнить в пользовательском режиме.режим (например: инструкция MOV).

И есть инструкции, которые ЦПУ можно разрешить или запретить выполнять в пользовательском режиме (например, инструкции IN и OUT).

Мой вопрос: какие другие инструкции (кроме IN и OUT) могут быть разрешены или запрещены для выполнения в пользовательском режиме?

Ответы [ 2 ]

3 голосов
/ 04 апреля 2019

Изначально было три группы:

  • инструкции, которые могут быть выполнены на любом уровне привилегий

  • инструкции, которые чувствительны к "IOPL"(Уровень привилегий IO "). Это IN (и варианты - байт, слово, слово, строка), OUT (и его варианты), HLT, CLI и STI. Если IOPL (вeflags) установлен на 3, тогда эти инструкции могут использоваться в коде пользователя (CPL = 3), а если для IOPL установлено меньшее числовое значение, эти инструкции не могут использоваться в коде пользователя.

  • инструкции супервизора (например, LGDT, WRMSR, INVD, ..., MOV to/from debug registers). Они никогда не могут быть выполнены при CPL = 3.

С тех пор они (производители процессоров - Intel, AMD, VIA, ..) добавили (в «приблизительном хронологическом порядке»):

  • функцию «проверки выравнивания», которая запрещает неправильное выравниваниечитает и записывает при CPL = 3

  • инструкцию RDTSC и флаг (в CR4), чтобы запретить ее при CPL = 3.

  • функция «виртуального прерывания защищенного режима», которая влияет на поведение CLI и STI при CPL = 3 (в основном предназначено для virtual8086, но не ограничивается этим).

  • флаг в MSR, который позволяет коду CPL = 0 отключать CPUID leaves > 2 (заставляет процессор притворяться, что эти листья не существуют), что изначально было ошибочным решением («программное обеспечение мягкое, аппаратное обеспечение сложное»)) из-за ошибки в старой версии WindowsNT, но все еще зависает спустя 20 с лишним лет без всякой разумной причины.

  • все виды виртуализации (например, VMENTER, VMEXIT, ...)

  • инструкция RDTSCP (доступ при CPL = 3 все еще контролируется более ранним флагом в CR4)

  • RDPMC инструкция

  • инструкция SWAPGS

  • альтернативы / расширения SWAPGS (RDFSBASE, RDGSBASE,WRFSBASE и т. Д.)

  • расширение, называемое "UMIP" (Предотвращение инструкций в режиме пользователя)), которое (если включено) в основном сохраняетсяне позволяет пользовательскому коду использовать инструкции для поиска виртуальных адресов структур данных ядра (так что «KASR» - это немного меньше шутки).Инструкции, запрещенные этим: SGDT, SIDT, SLDT, SMSW и STR.

  • скрытый / недокументированный флаг в MSR, который допускает некоторые ядра(если они написаны разработчиками, которые могут узнать об этом), чтобы отключить доступ к еще нескольким инструкциям, которые пользовательский код никогда не должен был выполнять (CPUID, и я не знаю, что еще).

1 голос
/ 04 апреля 2019

В cr4 есть несколько флагов, которые контролируют доступность определенных инструкций в пользовательском режиме:

  • TSD (бит 2): RDTSC и RDTSCP

  • PCE (бит 8): RDPMC

  • OSFXSR (бит 9) *: инструкции FXSAVE, FXRSTOR и SSE

  • UMIP (бит 11): SGDT, SIDT, SLDT, SMSW, STR

  • FSGSBASE (бит 16) *: RDFSBASE, RDGSBASE, WRFSBASE, WRGSBASE

Флаги, помеченные *, также влияют на выполнение соответствующих инструкций в кольце 0.

...