О переключении tss

Тема в разделе "WASM.OS.DEVEL", создана пользователем NoName, 14 май 2007.

  1. NoName

    NoName New Member

    Публикаций:
    0
    1. Можно ли без автоматического формирования особого случая вызвать iret на третьем кольце для переключения задачи.
    2. Зачем при каждом особом случае процессору переключать tss?
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    конечно можно (если сможешь бит NT установить)
    Код (Text):
    1.     pushfd
    2.     or dword [esp], 0x4000
    3.     popfd ; set NT bit
    4.     iretd
    только есть следующие НО:
    1. Поле link в текущем TSS сегменте должно содержать валидный селектор дескриптора TSS
    2. В дескрипторе должны быть установлены биты P и B
    3. DPL дескриптора должен быть не меньше CPL
    особый случай это исключение?
    не за чем кроме #TS
     
  3. NoName

    NoName New Member

    Публикаций:
    0
    с первым вопросом понятно. Спасибо. На счет второго я так и непонял.
    Я имею виду такой случай: (все обработчики вызываются через шлюзы, т.е. без задач) задача третьего кольца ловит исключение или скажем прерывание, и нужно вернутся обратно в код текущей задачи, зачем iret передаст управление задаче предку в поле связи текущей задачи? Или мне нужно тогда везде ставить в обработчиках такой код?:
    Код (Text):
    1. sti
    2. popfd
    3. ret far
     
  4. NoName

    NoName New Member

    Публикаций:
    0
    Доп. вопрос. Если IOPL позволяет текущей задаче делать ввод/вывод сможет ли она его делать если будет карта ввода/вывода в которой все запрещено?
     
  5. rei3er

    rei3er maxim

    Публикаций:
    0
    ну дык а чем просто
    Код (Text):
    1. iretd ; retf для шлюза вызова
    не катит?
    со стека будут сняты последовательно EIP, CS, [EFLAGS], ESP, SS, что вернет управление прерванному коду
    передаст только в случае наличия в EFLAGS бита NT
    нужно, например, вот для такого кода
    Код (Text):
    1. task_code:
    2. ; что-нибудь делаем
    3.     iretd ; автоматическое переключение на предыдущую задачу (head) (потому как NT установлен)
    4.  
    5. head:
    6. ...
    7.     call 1 SHL 3:0000h ; 1-ый дескриптор в GDT - TSS дескриптор (в сегменте TSS поле EIP содержит адрес task_code), здесь как раз идет установка NT
    8. ...
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    если логически подумать, то сможет
    имхо, работа с картой имеет смысл только если IOPL < CPL
     
  7. NoName

    NoName New Member

    Публикаций:
    0
    в том то и дело что текущая программа уже имеет статус вложеннной и я нехочу переключать задачу при исключении и прерывании по iretd, сбрасывать флаг нельзя.
     
  8. rei3er

    rei3er maxim

    Публикаций:
    0
    NoName
    а понял, что ты хочешь
    тогда используй retf, но придется со стеком повозиться
    Код (Text):
    1. exception_handler:
    2.     push ebp
    3.     mov ebp, esp
    4. ...
    5.     add esp, 14
    6.     popfd ; restore flags
    7.     mov eax, dword [ebp + 14] ; get ESP
    8.     mov dword [ebp + 10], eax
    9.     mov eax, dword [ebp + 18] ; get SS
    10.     mov dword [ebp + 14], eax
    11.     leave
    12.     retf
     
  9. TermoSINteZ

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

    Публикаций:
    2
    К слову, в x64 архитектуре (IA-32e) в 64 битном режиме не поддерживается переключение задач :) Вот такой облом. Хотя доступ к соотвествующим регистрам (TR.. ) возможен. Особо не разбирался, но походу там только программное пререключение задач работает.
     
  10. rei3er

    rei3er maxim

    Публикаций:
    0
    интересно, из каких соображений так сделано...
    ведь если используется нечто посложнее flat модели, переключение задач програмными средствами становится затруднительным, если вообще возможным
     
  11. OioVologda

    OioVologda New Member

    Публикаций:
    0
    Кто сказал, что в новых процессорах НЕ ПОДДЕРЖИВАЕТСЯ ПЕРЕКЛЮЧЕНИЕ ЗАДАЧ? IMHO этого просто НЕ МОЖЕТ БЫТЬ !!!TermoSINteZ, во первых, если не работает у тебя, не значит что этого нет вообще? Да и где это вообще проверялось, на какой системе?
     
  12. Ustus

    Ustus New Member

    Публикаций:
    0
    OioVologda
    А производитель процессоров и сказал. :):):) Но это относится только к 64-му режиму. И к хардварному переключению. Да им все рано особо никто и не пользовался :)
    Если кто-то не верит см.
    Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A, 6.2.3
    AMD64 Architecture Programmer’s Manual Volume 2, 2.7, 2.8
     
  13. rei3er

    rei3er maxim

    Публикаций:
    0
    если брать flat модель, а если что посложнее?
     
  14. Ustus

    Ustus New Member

    Публикаций:
    0
    rei3er
    Производитель настойчиво подталкивает к flat :):):)
    Да и не в модели дело, просто руками переключится эффективнее получается (по мнению гуру, ибо сам я таким не страдал).
     
  15. rei3er

    rei3er maxim

    Публикаций:
    0
    нет, как раз в модели дело
    не уверен, что вручную получится переключать эффективнее, если использвать в полном объеме сегментацию
     
  16. OioVologda

    OioVologda New Member

    Публикаций:
    0
    А вот напримеря я страдаю хардварным переключением, и лично я как раз и использую в полном объеме сегментацию. Это что же мне теперь ядро переписывать и руками все менять! и CR3 и LDTR и еще туеву кучу того гавна, которое процессор сохранял и восстанавливал за меня сам... Мне пофиг на то, что винда и линюха, мать их, используют flat и программную переключалку. Да и по-моему, не факт, что ручное переключение быстрее хардварного? Да и как тогда допустим IO карту менять?
     
  17. Ustus

    Ustus New Member

    Публикаций:
    0
    rei3er
    А чем сегментация-то страшна? Не вижу принципиальной разницы. Да и для 64 это уже не актуально :)
     
  18. OioVologda

    OioVologda New Member

    Публикаций:
    0
    Сейчас не актуально. Лет 25 назад считали, что и 640 килобайт будет достаточно на всю оставшуюся жизнь.
     
  19. OioVologda

    OioVologda New Member

    Публикаций:
    0
    И еще вопрос, получается, что в 64 архитектуре вообще нет понятия шлюз задачи, и переход на TSS ничего не дает? Если все таки переключение при загрузке в TR не работает, нафиг тогда вообще там TSS, для регистров стека могли бы что нибудь легче придумать...
     
  20. rei3er

    rei3er maxim

    Публикаций:
    0
    быстрее потому как не надо сохранять/восстанавливать CS, DS, SS, ES, GS, FS, LDTR, EIP
    а каждая операция загрузки сегментного регистра крайне медленная операция
    ну ты же ее как-то создаешь для каждой задачи
    аналогичным образом при ручном переключении задач меняешь адрес в TSS дескрипторе (адрес TSS сегмента) и делаешь LTR