OSDev
http://osdev.su/

запись в память с выше 1MB (0010:0000h)
http://osdev.su/viewtopic.php?f=6&t=698
Страница 1 из 5

Автор:  scuter [ 23 фев 2013, 07:25 ]
Заголовок сообщения:  запись в память с выше 1MB (0010:0000h)

вот ни как не могу понять почему ничего не записывается,
пробовал разные режимы (PM, RM), загружал IDT GDT
в оперативку ничего не записывается (адрес 0010:0000h)
но самое странное VESA LFB записывает замечательно
скажите как это сделать, может там какой то переключательесть?

Автор:  pavia [ 23 фев 2013, 08:46 ]
Заголовок сообщения:  Re: запись в память с выше 1MB (0010:0000h)

Цитата:
скажите как это сделать, может там какой то переключательесть?

Да есть A20
http://ru.osdev.wikia.com/wiki/Включение_линии_A20

Цитата:
в оперативку ничего не записывается (адрес 0010h:0000h)
в RM этот адрес соответствует 100h физическому, что явно ниже мегабайта.
http://protectmode.narod.ru/ch1_1.htm
В PM это зависит от настройки сегмента и страниц.

Автор:  scuter [ 23 фев 2013, 15:03 ]
Заголовок сообщения:  Re: запись в память с выше 1MB (0010:0000h)

pavia писал(а):
Цитата:
скажите как это сделать, может там какой то переключательесть?

Да есть A20
http://ru.osdev.wikia.com/wiki/Включение_линии_A20

не эта штука не помогает,
Код:
    in     al, 92h
    or     al, 02h
    out    92h, al

её тоже пробовал.

Автор:  iz56 [ 23 фев 2013, 15:39 ]
Заголовок сообщения:  Re: запись в память с выше 1MB (0010:0000h)

А как ты проверяешь - есть запись или нет. И как переводишь cpu. У меня есть готовые куски кода на фасм. Для перехода в нереальный режим и защищённый. Я как-то пробовал примеры из Зубкова - там может ошибки были - помню пришлось в конце-концов разбираться добросовестно. А еще надо прерывания запретить - если не настроены они, конечно. Но если работает веса - тогда странно.

Автор:  scuter [ 23 фев 2013, 15:46 ]
Заголовок сообщения:  Re: запись в память с выше 1MB (0010:0000h)

Цитата:
А как ты проверяешь - есть запись или нет.

на виртуальной машине в дебаг режиме смотрю что находится по адресу 0010:0000h
Цитата:
И как переводишь cpu.

во пример кода.
Код:
CLI
LGDT [GDTR]

in al, 0x92
or al, 2
out 0x92, al
in   al,70h
and   al,07FH
out   70h,al
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
MOV EAX, CR0
OR  AL, 1
MOV CR0, EAX
;mov eax, cr0
;and eax, 0x7FFFFFFe   ; Disable paging bit & enable 16-bit pmode.
;mov cr0, eax
mov ecx, 0FFh
mov edi, 110000h
mov AL, '<'
rep stosb
STI
LIDT [IDTR]
hlt
IRET

Автор:  SII [ 23 фев 2013, 15:50 ]
Заголовок сообщения:  Re: запись в память с выше 1MB (0010:0000h)

Ещё раз: адрес 0010:0000 для реального режима соответствует физическому адресу 100 -- т.е. очень далеко до границы первого мегабайта (который начинается с 100000). А в защищённом режиме зависит от того, что находится в дескрипторе соответствующем и загружен ли его селектор в нужный сегментный регистр.

ADD. По коду: первой же командой после переключения в защищённый режим должен быть дальний (межсегментный) переход, без которого не вступит в действие новый сегмент кода. А далее надо перезагружать сегментные регистры данных и стека -- по той же причине.

Автор:  iz56 [ 23 фев 2013, 15:54 ]
Заголовок сообщения:  Re: запись в память с выше 1MB (0010:0000h)

надо по линейному адресу типа mov 0x01000000,eax

Автор:  scuter [ 23 фев 2013, 16:10 ]
Заголовок сообщения:  Re: запись в память с выше 1MB (0010:0000h)

не понял так чего делать,
и под каким режимом?
Цитата:
ADD. По коду: первой же командой после переключения в защищённый режим должен быть дальний (межсегментный) переход, без которого не вступит в действие новый сегмент кода. А далее надо перезагружать сегментные регистры данных и стека -- по той же причине.

как то результат такой же
Код:
CLI
LGDT [GDTR]
in al, 0x92
or al, 2
out 0x92, al
in   al,70h
and   al,07FH
out   70h,al
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
wait
MOV EAX, CR0
OR  AL, 1
MOV CR0, EAX
JMP FAR 08h:PModeMain
PModeMain:
mov ax,8   
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ecx, 0FFh
mov edi, 110000h
mov AL, '<'
mov [0x01000000],eax
mov [0x01000000+1],eax
mov [0x01000000+2],eax
mov [0x01000000+3],eax
rep stosb
STI
LIDT [IDTR]
hlt
IRET


вот так записть идёт в адрес 0000h
Цитата:
CLI
LGDT [GDTR]
a20_on
MOV EAX, CR0
OR AL, 1
MOV CR0, EAX
mov ax, 8
mov fs, ax
mov gs, ax
mov ax, 10h
mov ds, ax
mov es, ax
JMP FAR 08h:PModeMain
PModeMain:
mov ecx, 0FFh
mov edi, 110000h
mov AL, '<'
mov [100050h],eax
mov [100050h+4],eax
mov [100050h+8],eax
mov [100050h+12],eax
rep stosb
STI
hlt
IRET

a20 заменил макросом.

Автор:  pavia [ 23 фев 2013, 16:36 ]
Заголовок сообщения:  Re: запись в память с выше 1MB (0010:0000h)

По режимом Ofline или Online читаем про память.
А именно.
Сегментная модель организации памяти.
Плоская модель организации памяти.
Могут ли сегменты перекрываться?
Как эти можно организовать на x86?

Разобраться с понятием линейного адреса.
Логического адреса.
Физического адреса.

Логическом адрес имеет запись хххх:yyyy
Вопрос что означает хххх? В реальном и в защищенном режиме?
Что означает yyyy? В реальном и в защищенном режиме?

Автор:  scuter [ 23 фев 2013, 17:23 ]
Заголовок сообщения:  Re: запись в память с выше 1MB (0010:0000h)

pavia писал(а):
По режимом Ofline или Online читаем про память.
А именно.
Сегментная модель организации памяти.
Плоская модель организации памяти.
Могут ли сегменты перекрываться?
Как эти можно организовать на x86?

Разобраться с понятием линейного адреса.
Логического адреса.
Физического адреса.

Логическом адрес имеет запись хххх:yyyy
Вопрос что означает хххх? В реальном и в защищенном режиме?
Что означает yyyy? В реальном и в защищенном режиме?

так всё таки что делать и в чём ошибка.

Страница 1 из 5 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/