· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ZEN —› ss

Посл.отвђт Сообщенiе


Дата: Мар 16, 2004 02:09:08

Всем привет! Есть загрузчик с дискеты, который читает ядро в память и вызывает главную процедуру ядра дальним call'ом, т.е.:
  pusha
  pushfd
; дальний call, не помню какая последовательность байтов
  popfd
  popa

После того, как ядро отработает, оно возвращает управление загрузчику и тот при помощи прерывания 19х перезагружает либо ядро, если дискету не вытащить, либо ось по умолчанию. Удобно? Так вот, ядро делает все необходимые действия для перевода проца в PM и обратно. Всё замечательно работает. Но злые силы не дадут насладиться радостями жизни... Допустим, что сразу же после перехода в 32-разрядный сегмент в нём не делается ничего, кроме возврата в реальный режим при помощи стандартного дальнего JMP с селектором. До сих пор всё работает. Проходит и инициализация сегментных регистров. Но вот вопрос?-|: после настройки регистра ss происходит странная вещь. Ядро отрабатывает и передаёт управление загрузчику. Тот в свою очередь ждёт нажатия клавиши после которой запускает int 19h. Загорается индикатор чтения на дисководе и ... мы благополучно зависаем (причём помогает только reset). Так вот вопрос - как надо инициализировать ss, чтобы он "забыл" о том, что с ним было в PM?
P.S. Пользуясь случаем, кто-нибудь может посоветовать какие-нибудь наиболее полные русскоязычные (на худой конец заморские) руководства по программированию PM желательно рассматривающие сей процесс со всеми подводными камнями и минами?-)


Дата: Мар 16, 2004 03:06:47 · Поправил: Black_mirror

Kirk
думаю, что вполне хватит xor ax,ax/mov ss,ax


Дата: Мар 16, 2004 15:14:58

Логично, но толку... Дело в том, что обнуление ничего не даёт. Кроме того я могу ручаться что со стеком тоже всё в порядке, push'и до дальнего вызова в загрузчике вполне корректно рас'pop'иваются и после него. Ничего недаёт даже сохранение пары ss:sp в самом начале загрузчика и восстановление перед int 19h. У меня есть одна идея, правда я боюсь что не знаю как реализовать её. Я думаю дело в теневой части ss. Аналогично оставленная открытой A20 приводила к краху ДОСа на компе моего друга. Но только если для восстановления cs используется дальний jmp с сегментом, сохранённым из реального, т.е.
  db 0EAh
  dw $+4
  dw ?		; cs который был до входа в PM

то вот такого способа для восстановления ss я не знаю:-(
P.S. Я боюсь, что уже всех достал с такими вот вопросами, но похоже мне скоро придётся открывать коллекцию своих багов, ибо я мастер попадания в какие-то странные ситуации;-)


Дата: Мар 17, 2004 15:41:19

Спасибо всем за старания, но мне удалось решить эту проблему путём загрузки 16-битного дескриптора данных в регистр ss перед самым выходом из PM :-) и теперь похерен последний баг :-) и теперь ... и теперь ... for (;;), а забыл, jmp $ круче :-)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.078