OSDev

для всех
Текущее время: 27 апр 2024, 08:59

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 24 фев 2013, 14:28 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Нормальный, правильный код. Ничего не упрощенный. Просто не поддерживает барахло времён 386 процессоров.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 24 фев 2013, 16:12 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
Быстрое включение A20 может не работать не только на "барахле времён 386 процессоров". Кроме того, проверка на включение A20 нужна обязательно. Более правильный способ отключения NMI:
Код:
        mov al,8Fh
        out 70h,al
        in al,71h


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 24 фев 2013, 17:19 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Проверка нужна. Но задача её не подразумевала, поэтому писать не стал. Думаю автор и сам добавит.

Цитата:
Быстрое включение A20 может не работать
В исходниках Award прошита жёстко.
Так что мало вероятно. Да и во всех документациях я её видел. А оставшийся 0.1% систем будем отлавливать во время бета тестирования.
Цитата:
mov al,8Fh
out 70h,al
in al,71h

Забыл про это поправлю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 25 фев 2013, 18:16 

Зарегистрирован: 10 апр 2012, 23:19
Сообщения: 277
блин, после включения Protected Mode отключается прерывания биоса int 13h

что бы не было недопонимания поясню порядок действий,

загружаю сегмент через int 13h
включаю PM
перенашу данные в адрес 110000h
выключаю PM
загружаю сегмент через int 13h <<--- и вот на этом месте появляется критическая ошибка и ничего не работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 25 фев 2013, 19:10 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Сервисы БИОС, за некоторыми исключениями, доступны только из реального режима.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 25 фев 2013, 19:16 

Зарегистрирован: 10 апр 2012, 23:19
Сообщения: 277
SII писал(а):
Сервисы БИОС, за некоторыми исключениями, доступны только из реального режима.

так я из PM режима перехожу в RM режим
или я не правильно это делаю.
Код:
mov ax, 28h      ; 16-bit Protected Mode data selector.
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
;hlt
;ret
;iret
mov EAX, CR0
AND   EAX , 0x7FFFFFFe
mov CR0, EAX
use16
jmp far 0:GoRMode      ; Perform Far jump to set CS.
GoRMode:
mov ax, 0      ; Reset segment registers to 0.
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov sp, 0x700
sti
MOV BX, 7E00h
MOV AX, 0201h      
MOV DL, 0      
MOV DH, 0      
MOV CX, 3      
INT 13h


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 25 фев 2013, 19:16 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Цитата:
загружаю сегмент через int 13h <<--- и вот на этом месте появляется критическая ошибка и ничего не работает.

1) Что за ошибка? Номер ошибки? Значения регистров в момент ошибки?
2) В какой строчке ошибка? адрес, код. В какой функции? В каком модуле находиться?
3) Как чем определил, что ошибка здесь?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 25 фев 2013, 19:19 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Код:
use16
jmp far 0:GoRMode      ; Perform Far jump to set CS.

А ты тут точно не напутал? Ихмо тут другой порядок нужен.
Код:
jmp far 0:GoRMode      ; Perform Far jump to set CS.
use16


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 25 фев 2013, 19:26 

Зарегистрирован: 10 апр 2012, 23:19
Сообщения: 277
pavia писал(а):
Цитата:
загружаю сегмент через int 13h <<--- и вот на этом месте появляется критическая ошибка и ничего не работает.

1) Что за ошибка? Номер ошибки? Значения регистров в момент ошибки?
2) В какой строчке ошибка? адрес, код. В какой функции? В каком модуле находиться?
3) Как чем определил, что ошибка здесь?

всё просто если убрать sti перед этим кодом ошибки нет,
Код:
MOV BX, 7E00h
MOV AX, 0201h     
MOV DL, 0     
MOV DH, 0     
MOV CX, 3     
INT 13h

то ошибки нет,
если поставить ошибка есть,
виртуальная машина говорит произошла критическая ошибка и выключается
pavia писал(а):
А ты тут точно не напутал? Ихмо тут другой порядок нужен.

нет не попутал, когда снимаешь флаг PE начинает работать 16-битрый режим кода.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 25 фев 2013, 19:32 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Цитата:
нет не попутал, когда снимаешь флаг PE начинает радотать 16-битрый режим кода.

Ошибаешься. Перезагрузка сегмента кода происходит после загрузки в CS нового значения. Это выполняется дальним прыжком.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB