Страничный режим и некорректный eip

Тема в разделе "WASM.BEGINNERS", создана пользователем newty, 11 июн 2008.

  1. newty

    newty New Member

    Публикаций:
    0
    Регистрация:
    10 июн 2008
    Сообщения:
    10
    Добрый день
    После включения страничного режима (отображение идет таким образом, что физический адрес 0x0 соответствует виртуальному 0x1000) и перевода процессора в Protected mode, регистр IP, как я понимаю, хранит старое значение, то есть процессор уже не будет исполнять последующие инструкции.. Подскажите, как перепрыгнуть на новое местоположение, учитывая что оно теперь виртуальное и не соответствует тождественно физическим адресам ОЗУ?
    Обычные jmp не работают (вроде 0xe9 0x00 - аналог jmp $ - ведь сразу после перевода в PM процессор начинает исполнять совсем "левые" инструкции). Или я что-то не правильно понимаю?
    Спасибо
     
  2. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    jmp far selector:offset
     
  3. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    перевод процессора в пм происходит посрецтвам дальнего перехода на необходимый участок кода чтоб cs нормально загрузить. сталобыть это не левый код, а тот, на который указывал переход..
    а вообще косяк как всегда в 36ой строке
     
  4. newty

    newty New Member

    Публикаций:
    0
    Регистрация:
    10 июн 2008
    Сообщения:
    10
    Ну так у процессора IP будет указывать не на эту инструкцию после включения страничного режима. Следовательно он ее не исполнит. Или исполнит?

    Простите, не понял?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    На время включения страничной трансляции ты должен создать PTE так, чтобы текущая кодовая страница отображалась после переключения на ее физический адрес (чтобы виртуальный адрес ровнялся физическому). После переключения ты делаешь потом джамп в другое место и это отображение можно будет удалить. Но на время включения оно нужно, иначе никак (по крайней мере я у себя так делал. текущая кодовая страница проецировалась и на соотв. адрес чтобы физический адрес был равен виртуальному и второй раз проецировалась уже на нормальный адрес виртуальный. после переключения делаю джамп на новый виртуальный адрес и удаляю это временное проецирование)
     
  6. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Если делать джамп сразу после установки cr0, то по идее он выполняется из кэша.
     
  7. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Вот тут пишут интересные вещи.
     
  8. newty

    newty New Member

    Публикаций:
    0
    Регистрация:
    10 июн 2008
    Сообщения:
    10
    reverser
    Спасибо, Great уже разъяснил проблему :)
    В статье описывается CS (а не ip), который действительно не влияет ни на что до первого far jmp, так как вместо его значения рассматривается Shadow-кеш (кажется, так это называется?) этого регистра. После загрузки селектора в CS (джампом), Shadow-часть обновляется вместе с ним