Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с SYSCALL и SYSENTER в длинном режиме

399
07 июня 2009 года
KIV
432 / / 20.01.2009
Пытался использовать быстрые системные вызовы в длинном режиме. После возврата на непривилегированный код, процессор думает, что код 32-битный. Правильно работают только прерывания и шлюзы вызова.
Код:
; Настройка процессора для SYSCALL/SYSRET
mov ecx, 0xC0000080
rdmsr
or eax, 1
wrmsr
mov ecx, 0xC0000081
mov edx, (CODE_SELECTOR shl 16) or APP_CODE_SELECTOR
xor eax, eax
wrmsr
mov ecx, 0xC0000082
xor edx, edx
mov eax, syscall_entry
wrmsr
mov ecx, 0xC0000084
mov eax, 0x202
wrmsr
; Настройка процессора для SYSENTER/SYSEXIT
mov ecx, 0x174
xor edx, edx
mov eax, CODE_SELECTOR
wrmsr
mov ecx, 0x175
mov eax, kernel_stack_top
wrmsr
mov ecx, 0x176
mov eax, sysenter_entry
wrmsr
...
syscall_entry:
sysret
...
sysenter_entry:
sysexit
551
08 июня 2009 года
Pavia
357 / / 22.04.2004
У интел и амд по разному работают эти инструкции.
399
08 июня 2009 года
KIV
432 / / 20.01.2009
В моём случае это Intel. А в чём сообственно заключаются различия? Когда он на 0-ом кольце всё нормально, проблема только с SYSRET/SYSEXIT.
349
09 июня 2009 года
Phantom-84
656 / / 27.10.2005
Почитай Manual от Intel. Там вроде бы действительно на SYSCALL/SYSRET есть какие-то ограничения, а SYSEXIT для возврата в long mode должен использовать REX.W-префикс.
261
09 июня 2009 года
ahilles
1.5K / / 03.11.2005
Цитата: KIV
В моём случае это Intel. А в чём сообственно заключаются различия?


различие в том что у Intel syscall/sysret можно выполнить только в long mode, а у AMD в обоих режимах. почитай внимательно маны (оба). С командой c sysexit всё ясно - нужен префикс REX.W Но возникает серьёзная непонятка с sysret, насколько я понял, именно в этом и у тебя косяк.
из интеловского мана: Опкод у sysret только один, т.е. не указаны какие-либо префиксы, но при этом написано следующее

Цитата:

In a return to 64-bit mode using Osize 64, SYSRET sets the CS selector value to MSR
IA32_STAR[63:48] +16. The SS is set to IA32_STAR[63:48] + 8.

SYSRET transfer control to compatibility mode using Osize 32. The CS selector value
is set to MSR IA32_STAR[63:48]. The SS is set to IA32_STAR[63:48] + 8.


Вопрос: как указать размер операнда 64 бита?

Я сам хотел лично экспериментально во всём убедиться и проверить, да всё руки не доходят...

349
10 июня 2009 года
Phantom-84
656 / / 27.10.2005
ahilles, я сам не раз вчитывался в процитированный тобой фрагмент из описания и так до конца и не понял. В принципе понятно, что такое Osize 32/64, но зачем использовать такое хитрое обозначение "Osize", расшифровку которого я так и не нашел в описании. Твой вопрос совершенно справедлив. Если речь идет о 64-разрядном размере операнда, то по идее нужно использовать тот же REX.W, но почему тогда это не сделано в таблице с опкодом, как для sysexit. Видимо, префикс все-таки должен использоваться.
399
13 июня 2009 года
KIV
432 / / 20.01.2009
Извините, но я незанаю, что такое REX.W и как этот префикс установить.
349
14 июня 2009 года
Phantom-84
656 / / 27.10.2005
db 48h вроде бы - в руководстве посмотри.
399
14 июня 2009 года
KIV
432 / / 20.01.2009
Спасибо
261
16 июля 2009 года
ahilles
1.5K / / 03.11.2005
решил на досуге реализовать механизм syscall/sysret . Для того чтобы команда sysret возвращала управление в 64-битный режим на использовать префикс REX.W (команду sysretq не рекомендую, потому что FASM (1.68) генерит какую-то фигню, лучше опкодом задать db 48h, 0Fh, 07h). Если надо чтобы возвращала управление в режим совместимости, то просто sysret. Проверил путём анализа селекторов, которые грузит эта инструкция в CS и SS.
У меня пока так и не получилось заставить работать программу потому, что она падает на первой же инструкции после возврата (притом не важно на какой). Отпишусь, как заставлю работать :) (глупая ошибка скорее всего)

PS. Кстати, кто собирается писать, не забудьте о флаге в MSR регистре IA32_EFER разрешающем эти инструкции (я три часа думал, почему у меня программа падает на инструкции sysret, пока не вспомнил про этот бит).
261
21 июля 2009 года
ahilles
1.5K / / 03.11.2005
Цитата: ahilles

У меня пока так и не получилось заставить работать программу потому, что она падает на первой же инструкции после возврата (притом не важно на какой). Отпишусь, как заставлю работать :) (глупая ошибка скорее всего)


да, действительно глупая ошибка: забыл выставить флаг U/S в структурах описывающих страницы.

В "прицепе" программа на FASM с демонстрацией использования инструкций syscall/sysret. Открываем файл LM.asm и компилируем его (код 64-битного режима в файле LM_CODE) скидываем файл LM.exe на дискету и загружаем DOS, после загрузки DOS запускаем программу. Кому-то покажется что это изврат, но лично мне так удобнее.

399
23 июля 2009 года
KIV
432 / / 20.01.2009
Спасибо
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог