Добрый день После включения страничного режима (отображение идет таким образом, что физический адрес 0x0 соответствует виртуальному 0x1000) и перевода процессора в Protected mode, регистр IP, как я понимаю, хранит старое значение, то есть процессор уже не будет исполнять последующие инструкции.. Подскажите, как перепрыгнуть на новое местоположение, учитывая что оно теперь виртуальное и не соответствует тождественно физическим адресам ОЗУ? Обычные jmp не работают (вроде 0xe9 0x00 - аналог jmp $ - ведь сразу после перевода в PM процессор начинает исполнять совсем "левые" инструкции). Или я что-то не правильно понимаю? Спасибо
перевод процессора в пм происходит посрецтвам дальнего перехода на необходимый участок кода чтоб cs нормально загрузить. сталобыть это не левый код, а тот, на который указывал переход.. а вообще косяк как всегда в 36ой строке
Ну так у процессора IP будет указывать не на эту инструкцию после включения страничного режима. Следовательно он ее не исполнит. Или исполнит? Простите, не понял?
На время включения страничной трансляции ты должен создать PTE так, чтобы текущая кодовая страница отображалась после переключения на ее физический адрес (чтобы виртуальный адрес ровнялся физическому). После переключения ты делаешь потом джамп в другое место и это отображение можно будет удалить. Но на время включения оно нужно, иначе никак (по крайней мере я у себя так делал. текущая кодовая страница проецировалась и на соотв. адрес чтобы физический адрес был равен виртуальному и второй раз проецировалась уже на нормальный адрес виртуальный. после переключения делаю джамп на новый виртуальный адрес и удаляю это временное проецирование)
reverser Спасибо, Great уже разъяснил проблему В статье описывается CS (а не ip), который действительно не влияет ни на что до первого far jmp, так как вместо его значения рассматривается Shadow-кеш (кажется, так это называется?) этого регистра. После загрузки селектора в CS (джампом), Shadow-часть обновляется вместе с ним