аналог Sleep чистыми асм инструкциями

Тема в разделе "WASM.WIN32", создана пользователем karabas_barabas, 12 сен 2010.

  1. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    интересует возможно ли сделать паузу аналогичную kernel32.Sleep чистыми асм инструкциями в ring3 ?
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Дизассемблировать kernel32.Sleep?
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    karabas_barabas
    Зависит от понятий чистоты и аналогичности. :)
    Если sysenter/int считаются "чистыми асм инструкциями в ring3", то можно через ZwDelayExecution.
    Если временное исключение потока из планирования не является необходимым требованием к аналогичности, то можно обычным длительным циклом.

    В противном случае требуется коммуникация с диспетчером потоков, невозможная без вызова системных сервисов/перехода в ядро.
     
  4. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    ZwDelayExecution не сильно помогло, а в ring0 наверное используются привилегированные инструкции,
    вообщем как я понимаю ответ нет - не беря во внимание разные извраты
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    karabas_barabas
    Никаких извратов, просто вызываете сервис. А на чём вы его запишите, асм это или скрипт только ваши проблемы.
     
  6. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    спасибо за ответы - картина ясна теперь
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. YIELD_CTX macro Reg32
    2.     mov eax,3
    3.     ifdef Reg32
    4.     xor Reg32,Reg32
    5.     endif
    6.     mov gs,ax
    7. @@:
    8.     mov ax,gs   ; ~ iret
    9.     ifdef Reg32
    10.     inc Reg32
    11.     endif
    12.     test eax,eax
    13.     jnz @b
    14. endm
    15.  
    16. YIELD_NPX macro Reg32
    17.     fnop
    18.     ifdef Reg32
    19.     xor Reg32,Reg32
    20.     endif
    21. @@:
    22.     smsw eax    ; 16i
    23.     ifdef Reg32
    24.     inc Reg32
    25.     endif
    26.     bt ax,1 ; Cr0.MP
    27.     jnc @b
    28. endm
     
  8. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    скриптовый вариант слипа из реактЪ-ОСъ
    (так как асмовый дизасм малопонятен)
    Код (Text):
    1. DWORD WINAPI
    2. SleepEx(DWORD dwMilliseconds,
    3.     BOOL bAlertable)
    4. {
    5.   LARGE_INTEGER Interval;
    6.   NTSTATUS errCode;
    7.  
    8.   if (dwMilliseconds != INFINITE)
    9.     {
    10.       /*
    11.        * System time units are 100 nanoseconds (a nanosecond is a billionth of
    12.        * a second).
    13.        */
    14.       Interval.QuadPart = -((LONGLONG)dwMilliseconds * 10000);
    15.     }
    16.   else
    17.     {
    18.       /* Approximately 292000 years hence */
    19.       Interval.QuadPart = -0x7FFFFFFFFFFFFFFFLL;
    20.     }
    21.  
    22. dowait:
    23.   errCode = NtDelayExecution ((BOOLEAN)bAlertable, &Interval);
    24.   if ((bAlertable) && (errCode == STATUS_ALERTED)) goto dowait;
    25.   return (errCode == STATUS_USER_APC) ? WAIT_IO_COMPLETION : 0;
    26. }
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
  10. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    хорош козявки мять!
    нет.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    litrovith
    Это какже нет. Согласен, непосредственно инструкции выполняющей столь длительную задержку нет. Вот только даже вне оси можно организовать задержки многими способами, вплоть от простых блокировок(циклический опрос счётчиков, например tsc или rtc), до относительно сложных(например программирование аппаратуры и обработка запросов в ISR, это например загрузка системных таймеров). Внутри оси нет никакого запрета на осуществление задержек средствами её. Тоесть можно использовать не явные вызовы, например прерываний(они инструкциями вызываются :)). Например цикл подсчёта системных тиков(Int 0x2A). Да и вобще ТС не запрещал вызывать сервисы ядра.
     
  12. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    Clerk, не клоуните, вопрос был задан конкретно.
    add
    Код (Text):
    1. Sleep:
    2. jmp Sleep
    нех делать Sleep
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    litrovith
    Задержка в 1 секунду(без учёта возможного переполнения):
    Код (Text):
    1.     Int 2Ah
    2.     lea ecx,[eax + 1000]
    3. @@:
    4.     Int 2Ah
    5.     cmp eax,ecx
    6.     jb @b
     
  14. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Clerk
    Не понимаете разницы в системном Sleep и циклом в юзермоде?
     
  15. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    sleep это не просто пауза. слип это переключение потоков. например, если надо принудительно отдать проц планировщику, то можно сделать sleep(0). те полного аналога без переходов в ядро сделать не выйдет.

    хотя, может ктото знает способ отдать управление планировщику без явного вызова ядра?
    например, настройка перехватчика и int 3 в цикле? вроде ж идет через ядро, делается ли прогон планировщика или старается отдать управление в этом же кванте?
    (можно побенчить, но лучше знать поточнее сбрасывается ли поток во время исключения или нет)
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    qqwe
    Не заметил у ТС ничего про планирование. Нужно было задежку сделать на асме. А вызвать планировщик можно без явных обращений к ядру - использовать кс, куки(приведёт к вызову NtYieldExecution), как частный случай это не управляемый деадлок.
     
  17. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    NtYieldExecution это типа Sleep(0)

    void WINAPI NtSleepEx(DWORD DurationMs,BOOL Alertable)
    {
    struct
    {
    DWORD Low;
    DWORD Hi;
    } MLI={{-10000*DurationMs},{0xFFFFFFFF}};
    NtDelayExecution(Alertable,(PLARGE_INTEGER)&MLI);
    }
     
  18. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    При исключении в коде приложения система не отдает немедленно следующий квант другим приложениям прежде чем передать управление на текущий SEH/UnhandledExceptionHandler?
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    PSR1257
    Нет.
     
  20. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.734
    А про чистые ASM инструкции заметили ?

    Соответственно никаких сторонних API.


    А тупой цикл не является аналогом sleep. Тем более в многопоточной среде.

    В MsDOS да.