Поясните пожалуйста насчет колец защиты

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

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Chingachguk
    1. Только если произошла смена урвоней привилегий. И не только при прерывании но и при прохождении через call gate, но опять же, только в том случае, если произошла смена уровней привилегий.

    2. Полную очередность проверок я когда-то написал здесь, в конце сообщения.
     
  2. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Great,

    можно подробнее? В TSS ее вроде нет - ? Или надо смотреть еще?
     
  3. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Mika0x65,

    то есть ты хочешь сказать - для 0-го кольца Map не применяется так как нету смены уровня (TR был загружен на нем), а при выполненении в менее привелигерованном коде - Будет?
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Chingachguk
    Смена уровня тут не при чем, где был загружен tr значения не имеет. Просто коду, выполняющемуся на нулевом уровне привилегий всегда разрешается писать в порты, независимо от значения IOPL и карты ввода/вывода. Для остальных уровней действует IOPL & карта ввода/вывода.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    просто условие CPL <= IOPL выполнится для любого IOPL при CPL=0 ;)
     
  6. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Мониторить порты позволяют регистры отладки. Да можно возрозить что их только 4 (8 если на Core 2 Duo), но обычно хватает
     
  7. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Спасибо вам, парни за консультации по PM!

    Решил вот "прочуствовать" эту TSS и можно ли пускать код из 0-го кольца запрещая ему делать in/out через Permission Map. По теории вроде как нельзя, но все ж.

    Пока споткнулся на непонятку. Сделал (по своим старым попыткам изучения по Финогенову) демку, там пускается задача:

    gdt_tss_0 descr <103,0,0,89h> ; 48
    gdt_tss_1 descr <103,0,0,89h> ; 56

    Первая TSS для текущего, переключаюсь на задачу TSS1:

    ; current TSS
    mov ax,SEL_TASK0
    ltr ax

    mov place,860
    call dword ptr task1_offs

    Сама задачка выполняется OK, но затем я ловлю Exception 0Ah (?) причем с кодом ошибки 0F000h (???).

    Исключение происходит в момент возвращения из задачи (iret). Адрес в стеке указывает на следующую после call task команду. (пробовал делать iretd :derisive:) - та же картинка - ему почему-то пофиг на префикс ;)

    В Зубкове С.В. прочитал что исключение 0A возникает при неудачном переключении на TSS, и тут вроде бы все верно. Но почему - что я сделал неправильно? Код ошипки вообще не в какие воротца (где она взяла неверный селектор 0F000h ???).

    Что код ошипки именно тот, что я получаю от проца - проверял на исключении 0Dh - все точно.
     
  8. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Chingachguk
    возьми bochs и пошагово пройдись отладчиком
    вообще я у тебя в коде не нашел установки FS
    а т. к при обратном переключении задач (iretd) из TSS (куда предварительно CPU сохранил все сегментные регистры) идет загрузка всех сегментных регистров, то, вероятно, в этом может быть ошибка
    (в FS непонятно что (селектор, например больше размера GDT или что-то другое, приводящее к исключению))
    Код (Text):
    1. mov ax, SEL_DATA
    2. mov ds, ax
    3. mov ax, SEL_STACK
    4. mov ss, ax
    5. mov ax, SEL_SCREEN
    6. mov es, ax
    7. mov ax, SEL_HIMEM
    8. mov gs, ax
    9. ; добавь следующее
    10. xor eax, eax
    11. mov fs, ax
     
  9. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    rei3er,

    благодарю! Действительно, дело было в сохранении FS "реального режима" в TSS_0, затем при возврате в первую задачу из нее выгружалось обратно оно же (в FS) и тут получалось excpt 0Ah.

    В моем примере я поставил FS=ABCDh перед переключением в PM и код ошибки был в этом случае ABCC. Следуя описанию Зубкова С.В.:

    "Формат кода ошибки:

    биты 15 – 3: биты 15 – 3 селектора, вызвавшего исключение

    бит 2: TI — установлен, если причина исключения — дескриптор, находящийся в LDT, и сброшен, если в GDT

    бит 1: IDT — установлен, если причина исключения — дескриптор, находящийся в IDT

    бит 0: ЕХТ — установлен, если причина исключения — аппаратное прерывание"

    Любопытно, что проц сбросил бит 0 (EXT) (верно), но не стал сбрасывать бит 2 (TI). Возможно, он решил, что раз new_FS and 7 не равно нулю, то это селектор из LDT?

    Еще раз спасибо!
     
  10. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    процессор не обладает (ну до определенной степени конечно :)) искусственным интеллектом
    он видит, что в селекторе FS бит TI установлен (естественно, такое может быть, потому как в FS неизвестно какое значение, точнее в твоем случае 0xABCD (т. е TI = 1)) - поэтому и код ошибки содержит установленный TI
     
  11. TheDeath

    TheDeath New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2003
    Сообщения:
    66
    Адрес:
    Russia,Новосибирск
    PROFi
    Разве у Core Duo DR 8 р-ров? Может ты имел ввиду 2 ядра x 4 [DR0-DR3] ?
     
  12. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    TheDeath

    Разве у Core Duo DR 8 р-ров? Может ты имел ввиду 2 ядра x 4 [DR0-DR3] ?

    Да это я и мел ввиду...
     
  13. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Поясните пожалуйста отличия sysenter, syscall - из каких колец могут выполняться, в каких режимах следует использовать ту или иную команду и почему в висте х64 используется far call - потому что специально предназначенные инструкции слишком быстрые для ее тормознутости?
    И что следует использовать когда используется больше двух колец защиты?
     
  14. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    KeSqueer
    Достаточно одной ссылки на доки интеловские, чтобы ответить на эти вопросы
    и избежать в будущем подобного бреда в ваших постах :-\ сталобыть гуглите.
     
  15. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    sysenter, syscall - один от Интела другой от АМД. Выполняют переход с 3 кольца в нулевое по адресу содержащемуся в специальном регистре.
     
  16. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Можно ли их использовать при переходе не из третьего кольца? Что следует использовать для быстрого вызова кода ядра не из третьего кольца?
    Доки есть, но в них мутно как-то про это написано IMHO.
     
  17. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Нельзя.
    Прерывания или каллгейты
     
  18. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Спасибо, вопрос исчерпан.
    Вроде как.
     
  19. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    И у меня еще вопрос.
    Когда нормальные люди напишут нормальную ОСь под конкретную систему (x86), а не будут бегать за переносимостью? А то Microsoft своим стремлением к переносимости сделала только хуже. На фига переносимость, если винда в 99,999% случаев установлена на x86-машинах?

    Вместо 4-х сегментов - плоская память, отчего процесс может спокойно:
    - выполнять код в стеке
    - изменять код (повозившись с WinAPI-функциями)
    Из-за этого и переполнение буферов и черви.
    Приложениям доступно только 2 Гига памяти.
    Почему не использовать все 4 сегмента? И адресуемой памяти станет 20 Гигов и на стек управление просто так не передашь (придется префиксы SS перед командами ветвления писать, а не просто copy).

    Вместо 4-х колец используется только 2 (а я считаю что драйверы и ОСь все равно надо разделить друг от друга).
    С каждой версией ОСь все тяжелее и тяжелее - того гляди скоро совсем развалится.

    Тестирование - завалено в глубокую нору. Почему государство не может поддерживать тестирование системы для ее же безопасности?

    UNIX'ы - тоже с плоской памятью, потому что хочет быть переносимой. Почему нет ни одной нормальной системы с сегментной памятью, не уходящей в сторону переносимости, а остающийся на стороне конкретной платформы? (или может такие системы, кроме OS/2, есть, просто я о них ничего не знаю?).
     
  20. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Учи матчасть не будет 20 гб. А стек и так можно защетить от выполнения.
    =) Москва не сразу строилась.

    Плоская проще и как следствие удобнее. А сегменты реализуются через страницы чего вполне хватает.