The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Выпуск Wine 8.10, opennews (?), 10-Июн-23, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


35. "Выпуск Wine 8.10"  +/
Сообщение от Аноним (35), 10-Июн-23, 13:35 
Спасибо. Но опять, зачем? Выглядит, как будто такое медленнее, да ещё и процессору предсказание переходов портит.
Ответить | Правка | Наверх | Cообщить модератору

39. "Выпуск Wine 8.10"  +/
Сообщение от n80 (?), 10-Июн-23, 14:23 
Как я понимаю, для улучшения совместимости с выдернутыми пользователем/инсталлятором нативными библиотеками из винды. Ну и с приложениями, которые недокументированные функции дёргают.
Ответить | Правка | Наверх | Cообщить модератору

45. "Выпуск Wine 8.10"  +/
Сообщение от Ivan_83 (ok), 10-Июн-23, 17:44 
Сискол в любом случае портит процессору предсказание переходов и тп, ибо там идёт сохранение регистров и переключение контекстов.
Ответить | Правка | К родителю #35 | Наверх | Cообщить модератору

49. "Выпуск Wine 8.10"  +2 +/
Сообщение от n00by (ok), 10-Июн-23, 18:58 
По первой ссылке видно -- была в каждом файле отдельная таблица

static struct unix_funcs unix_funcs =
{
-    NtUserDrawCaptionTemp,
-    NtUserDrawMenuBarTemp,
-    NtUserEndPaint,
-    NtUserExcludeUpdateRgn,
-    NtUserReleaseDC,
-    NtUserScrollDC,
-    NtUserSelectPalette,
-    NtUserUpdateLayeredWindow,

и вызывался сервис (системная функция) вот так:

BOOL WINAPI NtUserDrawCaptionTemp( HWND hwnd, HDC hdc, const RECT *rect, HFONT font,
                                   HICON icon, const WCHAR *str, UINT flags )
{
    if (!unix_funcs) return FALSE;
    return unix_funcs->pNtUserDrawCaptionTemp( hwnd, hdc, rect, font, icon, str, flags );
}


Теперь обобщили и всё вызывается через единый переходник. Про цели не знаю. В оригинальной NT с каждым ядром и сервипаком индексы системных сервисов меняются, потому их и там наверняка и в вирусах используют лишь в исключительных случаях; так что вряд ли это что-то даст для совместимости. Вероятно, так удобнее поддерживать.

По скорости вызова мало что изменилось, добавилась одна команда для вычисления адреса в таблице по индексу сервиса. Косвенное обращение в и в предыдущем варианте есть. Предсказатель в данном случае смотрит на адрес, откуда был вызов и предшествующие команды, а не адрес в таблице переходов:

2.4.2.3 Branch Prediction

Branch prediction predicts the branch target and enables the processor to begin executing instructions
long before the branch true execution path is known. All branches utilize the branch prediction unit (BPU)
for prediction. This unit predicts the target address not only based on the EIP of the branch but also
based on the execution path through which execution reached this EIP. The BPU can efficiently predict the
following branch types:
• Conditional branches.
• Direct calls and jumps.
• Indirect calls and jumps.
• Returns.

Ответить | Правка | К родителю #35 | Наверх | Cообщить модератору

51. "Выпуск Wine 8.10"  +/
Сообщение от Аноним (51), 10-Июн-23, 19:59 
Спасибо.

>Предсказатель в данном случае смотрит на адрес, откуда был вызов и предшествующие команды, а не адрес в таблице переходов

В том то и дело. Раньше были обёртки, у каждой - свой адрес. Теперь - общая обёртка с одним и тем же адресом на всех. Если я верно понимаю.

Ответить | Правка | Наверх | Cообщить модератору

58. "Выпуск Wine 8.10"  +/
Сообщение от n00by (ok), 11-Июн-23, 14:02 
Общий диспетчер с переходом по таблице - это классическая схема для всяких интерпретаторов, где после перехода выполняется всего несколько команд, а потому ошибки предсказателя дорого стоят, и это дело вроде как продумали:

This unit predicts the target address not only based on the EIP of the branch but also
based on the execution path through which execution reached this EIP.

EIP - это регистр указатель инструкций. Предсказатель смотрит не только адрес команды перехода, но и путь, по которому процессор дошел до этого адреса (скорее всего, запоминает предшествующие переходы).

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

Ответить | Правка | Наверх | Cообщить модератору

63. "Выпуск Wine 8.10"  +/
Сообщение от Аноним (63), 12-Июн-23, 12:07 
> В оригинальной NT с каждым ядром и сервипаком индексы системных сервисов меняются, потому их и там наверняка и в вирусах используют лишь в исключительных случаях; так что вряд ли это что-то даст для совместимости.

Не совсем. Индексы меняются, но их порядок и взаимное расположение если и изменяется, то несущественно. Поэтому очень многие "сомнительного рода" программы, типа вирусов, античитов и прочих пакеров, активно на это полагаются.

Другое дело, что в Wine порядок индексов полностью отличается от виндового (он алфавитный, а не исторический как в винде), поэтому ЯХЗ чего они хотели добиться этими изменениями.

Ответить | Правка | К родителю #49 | Наверх | Cообщить модератору

65. "Выпуск Wine 8.10"  +/
Сообщение от n00by (ok), 13-Июн-23, 08:18 
>> В оригинальной NT с каждым ядром и сервипаком индексы системных сервисов меняются, потому их и там наверняка и в вирусах используют лишь в исключительных случаях; так что вряд ли это что-то даст для совместимости.
> Не совсем. Индексы меняются, но их порядок и взаимное расположение если и
> изменяется, то несущественно.

Индекс нужен, что бы передать его аргументом (как номер сервиса) при вызове шлюза. Вот возможные варианты для одного из самых распространённых:

NtClose      0x000c       0x000c       0x000c       0x000c       0x000c       0x000c       0x000c       0x000c       0x000c       0x000c       0x000c       0x000c       0x000c       0x000c       0x000c       0x000d       0x000e       0x000d       0x000e       0x000f       0x000f       0x000f       0x000f       0x000f       0x000f       0x000f       0x000f       0x000f       0x000f       0x000f

Windows X86-64 System Call Table (XP/2003/Vista/2008/7/2012/8/10) https://j00ru.vexillium.org/syscalls/nt/64/

То есть перед вызовом надо узнать версию ОС (просто прочитать, отображается в пространство пользователя через KUSER_SHARED_DATA) и выбрать соответствующий. И так для каждого сервиса.

Что даёт "взаимное расположение если и изменяется, то несущественно"? Если бы мне были нужны эти индексы - я бы при помощи упрощенного дизассемблера вытаскивал их из ntdll.dll. Кажется, для того достаточно разобрать таблицу экспорта, а полагаться на неизменность взаимного расположения не стоит.

> Поэтому очень многие "сомнительного рода" программы, типа
> вирусов, античитов и прочих пакеров, активно на это полагаются.

Вирус - это зловред, внедряющий свой код в исполняемый файл. Они вообще встречаются в живой природе? Если же какие-то loader-ы используют несколько сисколов для распаковки и запуска основной нагрузки, тогда получается, что это использует меньше половины зловредов, то есть не многие.

> Другое дело, что в Wine порядок индексов полностью отличается от виндового (он
> алфавитный, а не исторический как в винде), поэтому ЯХЗ чего они
> хотели добиться этими изменениями.

Ну порядок как раз не сложно изменить, если потребуется. Может быть так проще, пока отлаживают.

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру