проблема с IDT?

Тема в разделе "WASM.ASSEMBLER", создана пользователем 0136, 26 авг 2009.

  1. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    Приветствую всех! Код, выполняет следующее, переходит в PM, создает тождественное страничное преобразование, до этого все ок. Решил добавить IDT с обработчиками исключения и прерываний, и тут пошли чудеса :) Испробывал много вариантов, уже не знаю где искать ошибку :) Креплю код. Вариант, могу дать код без IDT и ее истекающего, кто вставит мне хотя бы один программный обработчик в него, буду очень признателен. А может кто то в этом найдет ошибку или подскажет :) Креплю код.
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А APIC'у база настроена на 0х20? В коде этого нет и это первое, что бросается в глаза.

    P.S. Еще неплохо бы образ для Bochs выложить. Да и вообще Bochs в этих вопросах очень полезен.
     
  3. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    аппаратные прерывания не разрешаются :) они запрещены
     
  4. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    А, пардон, невнимательно прочитал. Тогда выкладывай образ для Bochs -- разобраться можно будет намного быстрей :).
     
  5. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    нету, жаль но нема :) самое интересное, что никогда не было проблемы с этим :) с обработчиками!
     
  6. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    В IDT адреса обработчиков хранятся в виде селектор:смещение, причём смещение отсчитывается от начала сегмента, заданного селектором. Код создаёт GDT так, чтобы соответствующий селектор указывал на code32, а потом при создании IDT ещё раз добавляет линейный адрес code32 к смещению. Естественно, в результате адреса обработчиков указывают в космос. Линейными адресами IDT не оперирует.
     
  7. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    diamond привет! честно говоря посмотрел на код, и не понял где ты нашел баг. Написал другой, прошу всех извенить меня, другой код работает, а этот нужно выкинуть!!! куда по дальше %)
    Вопросы возникли:
    1) А ответьте на вопрос - если у меня есть дескриптор с базой 0 и лимитом 4 гб, и с помощью его нужно настроить стек на сегмент 6000h, ну выделить этот сегмент размером в 64Кб весь под стек, то в ESP нужно записать 6FFFFh? Исправьте меня в моих размышелениях.
    2) Еще вопрос, если у меня есть дескриптор с базой 60000h и размером в 64 кб, и нужно выделить его под стек, то в ESP записывать 0FFFFh или 6FFFFh или че?
    3) Все те же вопросы при условии что задача имеет свое адресное простнранство, стек она юзает тоже в своем адресном пространстве или по физ адресу?

    Пытался очень понятно задать вопрос! Чуть что переспросите! Отвечу!!!
     
  8. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    1. Что значит "настроить стек на сегмент 6000h"? Если сегмент плоский, то достаточно просто поместить в esp значение 6FFFFh. Но при этом, когда стек достигнет желаемого минимума (60000h) никакого исключения не будет, т.к. в дескрипторе база сегмента определена как 0. Чтобы избежать такой ситуации, надо либо делать сегмент размером 64К (а не 4GB), либо ставить сторожевую страницу.

    2. В регистрах использутся эффективные адреса, т.е. адреса, действующие в пределах сегмента. Значит, в esp надо записать 0xFFFF. Кстати, стек лучше выравнивать на границу 2/4 байта.

    3. В смысле?
     
  9. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    ну, я думаю ответом на второй вопрос ты ответил на третий, а спрашивал вот что, ну если у задачи не тождественная таблица преобразования, допустим, прога думает что она в адр простр с 0 до 2 Гб, а в действительности она с 2 до 4 Гб (утрирую). Так вот, стек в этом случае настраивать нужно как обычно, ESP = 2 Гб, а не 4 гб. Правильно? И вот, покажи пример как выравнивать стек, что ты имеешь виду? Разве FFFFh это не выравнен стек? или ты просто так упомянул :)
     
  10. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Как все закручено :).

    В принципе, все просто.

    1. Процессор подсчитывает эффективный адрес. Он может быть достаточно сложный, например, [eax + ecx * 8 + 0x177].
    2. Процессор скалдывает эффективный адрес с базой сегмента и проверяет, не превышен ли лимит. Так получается линейный адрес, он же виртуальный.
    3. Если страничное преобразование не включено, линейный (виртуальный) адрес является физическим. Если включено, то старшие двадцать бит адреса по таблицам PDE/PTE заменяются. В результате получаем физический адрес.

    Все это, конечно, упрощенно, т.к. есть TLB, проверка прав и т.д. Но пусть пока будет omitted for clarity :).
     
  11. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    Отлично! Спасибо!
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Mika0x65
    С какой это стати в esp писать FFFF? Это типа выравненый стек такой? :)
    0136
    Если ss указывает на дескриптор с нулевой базой, а вы хотите, чтобы стек рос к младшим адресам, начиная с 6FFFFh, то разумеется, что в esp должен быть 70000h, а никак не 6FFFFh.
     
  13. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    l_inc привет тебе! Может я ошибаюсь, но вроде не надо чтобы стек был 70000h, потому что это уже будет запись по этому адресу :) но все может быть! %) хехе!
     
  14. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    0136
    Не будет записи по этому адресу. По крайней мере, если Вы не сделаете mov dword[esp],imm32. Обычный push уменьшит сначала esp на 4, а потом уже запишет аргумент в стек. И вообще, не выравнивать стек по адресам кратным четырём (по крайней мере в 32-битном режиме) - это крайне некошерно в плане производительности. А часто и вообще приводит к серьёзным ошибкам, если не знать, что делаешь.
     
  15. reversecode

    reversecode Guest

    Публикаций:
    0
    так а в чем собственно ошибка?
    ты хоть скажи что не работает
    а то неясно что искать
     
  16. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    l_inc
    Про выравнивание я забыл сказать.

    0136
    Стек, как уже сказали, лучше выравнивать. В 32битном режиме на четыре, в 64битном аж на восемь.
     
  17. 0136

    0136 New Member

    Публикаций:
    0
    Регистрация:
    19 апр 2007
    Сообщения:
    112
    Все - все - все! Всем спасибо! стек 70000h код переписал, а в этом не знаю где там баг. Спасибо за внимание!