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

Discussion in 'WASM.OS.DEVEL' started by NoName, May 14, 2007.

  1. NoName

    NoName New Member

    Blog Posts:
    0
    Joined:
    Aug 1, 2004
    Messages:
    1,229
    1. Можно ли без автоматического формирования особого случая вызвать iret на третьем кольце для переключения задачи.
    2. Зачем при каждом особом случае процессору переключать tss?
     
  2. rei3er

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    конечно можно (если сможешь бит NT установить)
    Code (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

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

    NoName New Member

    Blog Posts:
    0
    Joined:
    Aug 1, 2004
    Messages:
    1,229
    Доп. вопрос. Если IOPL позволяет текущей задаче делать ввод/вывод сможет ли она его делать если будет карта ввода/вывода в которой все запрещено?
     
  5. rei3er

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    ну дык а чем просто
    Code (Text):
    1. iretd ; retf для шлюза вызова
    не катит?
    со стека будут сняты последовательно EIP, CS, [EFLAGS], ESP, SS, что вернет управление прерванному коду
    передаст только в случае наличия в EFLAGS бита NT
    нужно, например, вот для такого кода
    Code (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

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    если логически подумать, то сможет
    имхо, работа с картой имеет смысл только если IOPL < CPL
     
  7. NoName

    NoName New Member

    Blog Posts:
    0
    Joined:
    Aug 1, 2004
    Messages:
    1,229
    в том то и дело что текущая программа уже имеет статус вложеннной и я нехочу переключать задачу при исключении и прерывании по iretd, сбрасывать флаг нельзя.
     
  8. rei3er

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    NoName
    а понял, что ты хочешь
    тогда используй retf, но придется со стеком повозиться
    Code (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 Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    К слову, в x64 архитектуре (IA-32e) в 64 битном режиме не поддерживается переключение задач :) Вот такой облом. Хотя доступ к соотвествующим регистрам (TR.. ) возможен. Особо не разбирался, но походу там только программное пререключение задач работает.
     
  10. rei3er

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    интересно, из каких соображений так сделано...
    ведь если используется нечто посложнее flat модели, переключение задач програмными средствами становится затруднительным, если вообще возможным
     
  11. OioVologda

    OioVologda New Member

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

    Ustus New Member

    Blog Posts:
    0
    Joined:
    Aug 8, 2005
    Messages:
    834
    Location:
    Харьков
    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

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    если брать flat модель, а если что посложнее?
     
  14. Ustus

    Ustus New Member

    Blog Posts:
    0
    Joined:
    Aug 8, 2005
    Messages:
    834
    Location:
    Харьков
    rei3er
    Производитель настойчиво подталкивает к flat :):):)
    Да и не в модели дело, просто руками переключится эффективнее получается (по мнению гуру, ибо сам я таким не страдал).
     
  15. rei3er

    rei3er maxim

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    917
    Location:
    minsk
    нет, как раз в модели дело
    не уверен, что вручную получится переключать эффективнее, если использвать в полном объеме сегментацию
     
  16. OioVologda

    OioVologda New Member

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

    Ustus New Member

    Blog Posts:
    0
    Joined:
    Aug 8, 2005
    Messages:
    834
    Location:
    Харьков
    rei3er
    А чем сегментация-то страшна? Не вижу принципиальной разницы. Да и для 64 это уже не актуально :)
     
  18. OioVologda

    OioVologda New Member

    Blog Posts:
    0
    Joined:
    Nov 21, 2006
    Messages:
    91
    Сейчас не актуально. Лет 25 назад считали, что и 640 килобайт будет достаточно на всю оставшуюся жизнь.
     
  19. OioVologda

    OioVologda New Member

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

    rei3er maxim

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