Проблема с переходом в защищённый режим

Тема в разделе "WASM.BEGINNERS", создана пользователем Igor1024, 29 мар 2011.

  1. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Если адрес загрузки фиксирован, то можешь сделать примерно так, как у меня:
    Код (Text):
    1.   org 8000h
    2.   ...
    3.   lgdt [GDTR]
    4.   ...
    5. GDTR:
    6.   dw GDT_SIZE-1
    7.   dd GDT
    Прерывания в PM не разрешай - пока ты до этого "не дорос". И этот "левый" код в PM убери тоже - сделай пока так, как я сказал.
     
  2. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Не заметил. Ну тогда как-то так:
    Код (Text):
    1. ; org 0
    2.   ...
    3.   lgdt [GDTR]
    4.   ...
    5. GDTR:
    6.   dw GDT_SIZE-1
    7.   dd GDT+10000h
    8.   ...
    9.   org $+10000h
    10. PROTECTED_ENTRY:
     
  3. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    А вообще в ядре лучше сделать повторную настройку всех регистров.
     
  4. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Весь 'лишний' код, я убрал но опять незадача.
    Phantom_84, попробую сделать как Вы сказали.
     
  5. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Phantom_84, объясните, пожалуйста, смысл данных выравниваний.
     
  6. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Здесь, как мне кажется, неправильно... Ведь превышается лимит 64Кб, а мы пока в RM.
     
  7. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Это возврат к линейной адресации для метки PROTECTED_ENTRY и всего, что идет за ней, которую ты успешно нарушил, передав управление на 1000h:0 в реальном режиме. Перед org $+10000h можешь успешно разместить хоть полноразмерный сегмент реального режима (64 кб), контролируя его размер следующим фрагментом кода:
    Код (Text):
    1. virtual
    2. rb 10000h-$
    3. end virtual
    Если бы ты сделал загрузку "мини-ядра", начиная с линейного адреса, лежащего ниже отметки 10000h, ты бы смог оставаться исключительно в рамках линейной адресации в том числе и в RM.
     
  8. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Извиняюсь за свою тупость, но можно поподробнее? Почему же адресация нарушается?
     
  9. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Это не тупость, а скорее просто неготовность к продуктивному общению по данной теме. Предлагаю тебе самому докопаться до ответа хотя бы на последний вопрос. Будут результаты, пиши.
     
  10. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Получается выравниваем по настоящему адресу (1000h*10h) в этом куске кода:
    Так?
     
  11. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Да, корректируем внутрисегментный адрес, чтобы получился линейный. 1000h*10h - это "настоящий" (линейный) адрес начала сегмента. К нему прибавляем смещение GDT внутри этого сегмента.
     
  12. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Остальное оставлю на завтра, а то засыпаю уже.
    Кстати, подобный код я нашёл в исходниках ядра Колибри.
     
  13. Igor1024

    Igor1024 Васил Троянов Боянов (Azis)

    Публикаций:
    0
    Регистрация:
    15 окт 2010
    Сообщения:
    345
    Адрес:
    Sliven, Bulgaria
    Выравниваем PROTECTED_ENTRY для того, чтобы на неё far jmp сделать? Ведь Сейчас (в RM) она и остальной код находятся в одном сегменте, где можно сделать только 'близкий' прыжок.