Сегмент состояния задачи

Discussion in 'WASM.OS.DEVEL' started by Barbos, Jan 10, 2008.

  1. Barbos

    Barbos Slavon

    Blog Posts:
    0
    Joined:
    Nov 13, 2007
    Messages:
    280
    Location:
    Kharkov
    Вобщем то, в описаниях TSS все ясно как безоюлачный день, за исключением полей ESP0, SS0, ESP1, SS1, ESP2, SS2. Это чё? То, что эти поля имеют отношение к стеку - понятно. Но где и как они применяются? и для чего?
     
  2. rudik

    rudik Руденко Артём

    Blog Posts:
    0
    Joined:
    Dec 6, 2006
    Messages:
    302
    Location:
    г. Харьков
    Поля
    используются для переключения стека с менее привелегированого кольца в более, например если обработчик прерывания выполнен на нолевом кольце и прерывание случилось при выполнении прикладной программы то процессор будет автоматически переключать стек и значения SS и ESP будет брать из TSS(SS0,ESP0). При этом также установит флаг NT, который влияет на выполнение команд возврата из прерывания.
     
  3. SII

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

    Blog Posts:
    0
    Joined:
    Oct 31, 2007
    Messages:
    1,483
    Location:
    Подмосковье
    Barbos

    У каждого из четырёх уровней привилегий есть свой собственный стек; соответствующие SS:ESP и хранятся в TSS. Фактически это единственное, из-за чего TSS нужна (аппаратная многозадачность умерла: в 64-разрядных процессорах от неё отказались, и единственный имеющийся там TSS как раз и используется для хранения четырёх указателей стека).
     
  4. Barbos

    Barbos Slavon

    Blog Posts:
    0
    Joined:
    Nov 13, 2007
    Messages:
    280
    Location:
    Kharkov
    но здесь их три
     
  5. Barbos

    Barbos Slavon

    Blog Posts:
    0
    Joined:
    Nov 13, 2007
    Messages:
    280
    Location:
    Kharkov
    т.е. если для каждой из задач будут указаны свои уникальные адреса стеков, то каждая такая задача получает свой контекст обработки прерываний/исключений. Тут же мысль, не таким ли образом организован механизм обработки эксепшенов блоками try { } catch { }?
    А если задача работает в нулевом кольце и имеет свой стек, описанный в регистрах SS:ESP, то обязательно ли нужна настройка SS0:ESP0? что если там будут нули, произойдет ли нарушение защиты, если в момент выполнения этой задачи произойдет прерывание, обработчик которого находится тоже в нулевом кольце? И, если задача работает в нулевом кольце, имеют ли смысл значения полей SS1:ESP1, SS2:ESP2? Или ими можно пренебречь, инициировав их нулями и забыть о них?

    вопросов становится только больше
     
  6. SadKo

    SadKo Владимир Садовников

    Blog Posts:
    8
    Joined:
    Jun 4, 2007
    Messages:
    1,610
    Location:
    г. Санкт-Петербург
    Нет, не таким способом. Если имеются в виду обычные эксцепшны.

    Не обязательно. Стек меняется только при повышении привилегий.

    Их можно не инициализировать, если работаешь только с кольцами 0 и 3 (как все обычно и делают).
     
  7. rei3er

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    + для хранения указателей стеков IST
     
  8. Barbos

    Barbos Slavon

    Blog Posts:
    0
    Joined:
    Nov 13, 2007
    Messages:
    280
    Location:
    Kharkov
    вот теперь я понял почему их там три набора, в то время как колец всего 4.
    Тогда получается, что (для эксперимента) для организации работы двух простых задач, работающих в ring0, можно вобще не трогать SSx:ESPx, даже не смотря на то, что в системе присутствуют обработчики аппаратных прерываний, конфликтов в ними происходить не должно.
     
  9. rei3er

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    да
     
  10. SII

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

    Blog Posts:
    0
    Joined:
    Oct 31, 2007
    Messages:
    1,483
    Location:
    Подмосковье
    Barbos
    Их там четыре. Считайте: SS0:ESP0 по смещению 4, SS1:ESP1 по смещени 12, SS2:ESP2 по смещению 20 и SS:ESP по смещениям 56 и 80.
     
  11. SII

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

    Blog Posts:
    0
    Joined:
    Oct 31, 2007
    Messages:
    1,483
    Location:
    Подмосковье
    Barbos
    SadKo
    У меня как-то из-за неинициализированности TSS после переключения в защищёнку возникала двойная ошибка, хотя логически её быть не должно. Я вручную грузил SS:ESP, находясь в нулевом кольце, и именно при загрузке SS происходил вылет. После инициализации TSS глюк исчез сам по себе (загружаемые значения не менял). Так что не уверен, что "не обязательно" (хотя, возможно, процессору просто требовалось наличие TSS, а какая там пурга находится -- без разницы, пока нет переключения привилегий).

    Вот это точно.
     
  12. rei3er

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    это значения, которые были в SS:ESP в момент переключения задач
    они не связаны с DPL (в отличие от первых 3-х пар)
     
  13. SII

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

    Blog Posts:
    0
    Joined:
    Oct 31, 2007
    Messages:
    1,483
    Location:
    Подмосковье
    А, речь о стеках, привязанных к уровням? Тады пардоньте, невнимательно читал.
     
  14. Barbos

    Barbos Slavon

    Blog Posts:
    0
    Joined:
    Nov 13, 2007
    Messages:
    280
    Location:
    Kharkov
    Не стал трогать SSx:ESPx вобще. Две задачи, обе в нулевом кольце, по инициативе с клавы, одна запускает другую и получает управление, когда та отработает. Все нормально работает. Спасибо.
     
  15. abcd008

    abcd008 New Member

    Blog Posts:
    0
    Joined:
    Feb 8, 2009
    Messages:
    616
    Здесь все понятно, но как передать управление другой задаче и сохканить ее контекст.
    Ведь аппаратное переключение не поддерживается в x64???
     
  16. Barbos

    Barbos Slavon

    Blog Posts:
    0
    Joined:
    Nov 13, 2007
    Messages:
    280
    Location:
    Kharkov
    x64 поддерживает аппаратное переключения задач, просто от него отказываются для экономии памяти или что то около того
     
  17. SII

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

    Blog Posts:
    0
    Joined:
    Oct 31, 2007
    Messages:
    1,483
    Location:
    Подмосковье
    Barbos
    Внимательно читайте мануал. Аппаратное переключение в 64-разрядном режиме не поддерживается.
     
  18. Barbos

    Barbos Slavon

    Blog Posts:
    0
    Joined:
    Nov 13, 2007
    Messages:
    280
    Location:
    Kharkov
    щас специально глянул ман... до этого верил наслово людям...
     
  19. abcd008

    abcd008 New Member

    Blog Posts:
    0
    Joined:
    Feb 8, 2009
    Messages:
    616
    Вопрос остается открытым
     
  20. Barbos

    Barbos Slavon

    Blog Posts:
    0
    Joined:
    Nov 13, 2007
    Messages:
    280
    Location:
    Kharkov
    Intel® 64 and IA-32 Architectures
    Software Developer’s Manual
    Volume 3A:
    6.7 TASK MANAGEMENT IN 64-BIT MODE

    там,если смотреть дальше по тексту, пишут, что при передаче управления на TSS или шлюз TSS (JMP, CALL, INTn, or interrupt) происходит #GP. т.е само собой напрашивается вешать кусок кода на 13-й вектор в IDT. В коде определять по коду ошибки причину, ну и т.д. примерно как монитор V86...

    тем более, что An IRET with EFLAGS.NT (nested task) set to 1 тоже вызывает #GP, обычное обратное переключение задач.