Вопрос по поводу многозадачности

Тема в разделе "WASM.NT.KERNEL", создана пользователем sysexit, 27 авг 2010.

Статус темы:
Закрыта.
  1. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Допустим имеем однопроцесорную систему, диспетчер многозадачности выделяет каждому потоку свой квант времени, это все понятно, но появился вопрос, как на 1 процессоре прерывается исполнение потока и передается управление в диспетчер? Прошу прощения за возможно тупой вопрос, который не дает мне спать. Надеюсь ясно выразился.

    Может быть выполняется какое-то прерывание с высоким IRQL, и диспетчер его ловит и тормозит поток, и дальше планирует исполнение? Но где находится это прерывание, не в коде потока же.
     
  2. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    >>выполняется какое-то прерывание
    да - таймер.

    А вообще Д.Соломон и М.Руссинович "Внутреннее устройство windows".
     
  3. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Уже читаю, ту главу уже прочел. Там о мой вопрос не описан.

    Как выполняется этот таймер я все непойму. Ведь на процессоре непрерывно что-то исполняется, допустим исполняется бесконечный цикл из NOP, как процессор узнает что кончились кванты для этого кода и как процессор переключится на диспетчер?

    И еще, при переключении на новый поток, загружаются содержимое регистров, они хранятся в блоке KTHREAD в ядре?

    Посоветуйте какую книгу заказать, по разработке драйверов для Windows?
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sysexit
    Когда приходит железячное прерывание от любого устройства, либо поток програмно вызывает планировщик(сервисы ожидания и пр.) вначале в ядерном стеке сохраняется контекст задачи(трап-фрейм). После отработки ISR выполняется вызов HalEndSystemInterrupt(). Она посылает EOI в APIC и вызывает планировщик KiDispatchInterrupt() -> SwapContext(). Шедулер выберает новый поток и загружает некоторое окружение в процессор(трап-фрейм при этом не затрагивается, загружается PDBR, LDTR, настраивается GDT и пр.) и переключает текущий стек(прежде сохранив его) на стек иного потока, на дне которого также находится сохранённый контекст задачи. После этого выполняется возврат из HalEndSystemInterrupt(), а далее следует загрузка трап-фрейма в процессор посредством Kei386EoiHelper(). Это в общих чертах.
     
  5. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Может я не допонимаю самые низины, но ответа я так и не получил.

    Как именно прцессор узнает что кванты для потока кончились, и надо передать управление в ядро?

    Какая то инструкция в листинге сообщит ему?
    Или как этот таймер исполнится. Я понятно задаю вопрос?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sysexit
    Железо посылает в процессор запросы на прерывание. Это например таймер перешёл в сигнальное состояние и пр. Тогда процессор вызывает обработчик из IDT, это ISR.
     
  7. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    sysexit
    Все очень просто. Если в кратце то у каждого потока (любого) имеется свое значение кванта, в разных виндоусах оно разное. Когда приходит прерывание таймера, процедура его обработки вычитает из кванта потока постоянную величину (ну руссинович пишет что это величина = 3). Когда потока значение кванта закончилось (допустим у него вначале было значение 9, то 9 - 3 (щелк) - 3 (щелк) - 3 (посл щелк)), то квант завершается и процессору отдается другой (следующий поток) в соответствии с приоритетами.
    А инструкцию - можете глянуть дизасм обработчика прерывания таймера. Так их много :)
     
  8. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    TermoSINteZ объяснил всех понятнее. А теперь вопрос про этот самый таймер. Я правильно понял, этот таймер диспетчера посылает прерывания очень часто, и каждый раз callback проверяет сколько квантов времени осталось у потока?

    А как эти аппаратные таймеры установить, что за таймер где он регулируется и все прочее?
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sysexit
    У диспетчера есть счётчики, а таймера никакого нет. Шедулер вызывается из всех ISR, читайте внимательнее. Включите профайлер, треды прерываться будут во много раз быстрее, но длительность кванта не изменится.
     
  10. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Все равно не пойму. Понятно то что, при нажатии кнопки просиходит прерывание, и текущий код на процессоре останавливается, и вызывается обработчик прерывания.

    Это все аппаратные прерывания, а как процессор во время исполнения кода треда, поймает прерывание которое ему скажет что нужно вычести и проверить кванты для треда?
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sysexit
    При возврате из всех прерываний(без разницы от таймера или клавиатуры оно) вызывается код завершающий прерывание HalEndSystemInterrupt(). Из него вызывается шедулер KiDispatchInterrupt(). Он определит что квант завершён в KiQuantumEnd().
     
  12. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Переход из этих (щелк-щелк) как происходит, я так и не понял.

    Clerk если не секрет вы названия всех переменных и функций наизусть знаете? я просто поражен, читаю ваши сообщения, столько знаний, как все это можно запомнить.
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sysexit
    Это базовые функции, у шедулера их не много.
    Как задача переключается на новую я описал в #4. Если вас интересует подробный механизм распределения процессорного времени, то смотрите в сурцах, это довольно сложная часть.
     
  14. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    Как допустим при исполнении моего кода, он вызывает планировщик?
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    sysexit
    Ну и NtYieldExecution/NtDelayExecution тоже.
     
  16. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    sysexit
    Аппаратные прерывания процессор ловит автоматически, без какого-либо участия исполняемой в данный момент программы. Единственное, что может делать программа, если у неё есть необходимые привилегии (фактически -- если она исполняется в нулевом кольце, хотя формально несколько сложнее), -- это разрешать или запрещать прерывания на некоторое время. Если прерывание пришло в момент, когда оно запрещено, оно просто стоит и ждёт, пока программа не разрешит прерывания.

    Когда происходит аппаратное прерывание, процессор автоматически сохраняет в стеке адрес команды, которая была бы выполнена следующей, если б прерывания не было, после чего переходит к обработчику данного прерывания: загружает его адрес в CS:EIP (если речь о 32-разрядном защищённом режиме; если о 64-разрядном -- то в RIP, если о реальном -- то в CS: IP, но суть от этого не меняется). Обработчик же уже выполняет необходимые действия, связанные с обработкой данного прерывания -- например, уменьшает значение счётчика оставшихся квантов времени текущего потока и при его обнулении (или выходе в минус, или ещё при каком-либо условии -- это уж его дело) вызывает переключение потоков.
     
  17. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    А программные прерывания как ловит процессор?
     
  18. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Если возникает программное прерывание, текущая команда (которая это прерывание и вызвала) заканчивается положенным в соответствии с описанием способом, после чего немедленно происходит это прерывание. Сама метода прерывания в целом не отличается от внешнего аппаратного прерывания (происходит такое же сохранение адреса команды, разве что в некоторых прерываниях сохраняется ещё дополнительная информация -- это надо смотреть главу про прерывания в третьем томе интеловского мануала), но программные прерывания не могут быть замаскированы (состояние флага IF на них не влияет; если разделил на 0 -- получишь прерывание в любом случае).
     
  19. Medstrax

    Medstrax Забанен

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    673
    Зачем вводить в заблуждение? Есть как минимум 3 отличия между софтовым int XX и аппаратным ексепшном.
    1) Аппаратный эксепшн не проверяет права доступа дескрипторов
    2) Аппаратный эксепшн, в случае внешного прерывания, не выдает на шину цикл подтверждения
    3)Аппаратный эксепшн, может пихнуть в стек error code
     
  20. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    medstrax1
    Я писал в общих чертах, а не со всеми интимными подробностями; кроме того, п. 3 я упомянул. Так что никакого введения в заблуждение. Ну а со всеми подробностями если -- человек в них попросту утонет.
     
Статус темы:
Закрыта.