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

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

  1. NoName

    NoName New Member

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

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    конечно можно (если сможешь бит 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
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    с первым вопросом понятно. Спасибо. На счет второго я так и непонял.
    Я имею виду такой случай: (все обработчики вызываются через шлюзы, т.е. без задач) задача третьего кольца ловит исключение или скажем прерывание, и нужно вернутся обратно в код текущей задачи, зачем iret передаст управление задаче предку в поле связи текущей задачи? Или мне нужно тогда везде ставить в обработчиках такой код?:
    Код (Text):
    1. sti
    2. popfd
    3. ret far
     
  4. NoName

    NoName New Member

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

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    ну дык а чем просто
    Код (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
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    если логически подумать, то сможет
    имхо, работа с картой имеет смысл только если IOPL < CPL
     
  7. NoName

    NoName New Member

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

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    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
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    К слову, в x64 архитектуре (IA-32e) в 64 битном режиме не поддерживается переключение задач :) Вот такой облом. Хотя доступ к соотвествующим регистрам (TR.. ) возможен. Особо не разбирался, но походу там только программное пререключение задач работает.
     
  10. rei3er

    rei3er maxim

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

    OioVologda New Member

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

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    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
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    если брать flat модель, а если что посложнее?
     
  14. Ustus

    Ustus New Member

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

    rei3er maxim

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

    OioVologda New Member

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

    Ustus New Member

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

    OioVologda New Member

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

    OioVologda New Member

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

    rei3er maxim

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