Вопросы по защищенному режиму
1). Программа типа
org 7c00h
.............
переход в защ. режим
.............
jmp cs:mode_32
use32
mode_32:
.............
Получается ДО jmp код находится с адреса 7c00h а после ? Я знаю, в сегменте кода, на который указывает дескриптор...(0x00 - 0FFFFFFFF). Но как он туда "вдруг" попал? Ведь 32-битный код уже располагается в начале сегмента кода?
2). Если создать несколько дескрипторов с размерами в 4Гб, и записать в каждый дескриптор информацию на одинаковый адрес, будет GP ?
3). Вот перешел я в защищенный режим, хочу использовать VESA и LFB, загружаю из таблицы VBE2 физический адрес LFB... Возвратился мне 32-битный адрес.. а теперь внимание,вопрос:
В каком сегменте он находится то? Т.е. по этому адресу надо записать данные, но в какой из сегментов?
1). Программа типа
org 7c00h
.............
переход в защ. режим
.............
jmp cs:mode_32
use32
mode_32:
.............
Получается ДО jmp код находится с адреса 7c00h а после ? Я знаю, в сегменте кода, на который указывает дескриптор...(0x00 - 0FFFFFFFF). Но как он туда "вдруг" попал? Ведь 32-битный код уже располагается в начале сегмента кода?
2). Если создать несколько дескрипторов с размерами в 4Гб, и записать в каждый дескриптор информацию на одинаковый адрес, будет GP ?
3). Вот перешел я в защищенный режим, хочу использовать VESA и LFB, загружаю из таблицы VBE2 физический адрес LFB... Возвратился мне 32-битный адрес.. а теперь внимание,вопрос:
В каком сегменте он находится то? Т.е. по этому адресу надо записать данные, но в какой из сегментов?
Бессмертный Интеловский томик номер 3 (IA-32 Intel Architecture Software Developer's Manual), часть тоже номер 3 с заголовком "Protected-mode memory managment".
Получается ДО jmp код находится с адреса а после ? Я знаю, в сегменте кода, на который указывает дескриптор...(0x00 - 0FFFFFFFF). Но как он туда "вдруг" попал? Ведь 32-битный код уже располагается в начале сегмента кода?
считать не разучились ? в реальном режиме физический адрес 0х0000+0х7c00 , а при переходе в защищенный без страничного преобразования физический адрес тоже 0х0000+0х7c00 .
2). Если создать несколько дескрипторов с размерами в 4Гб, и записать в каждый дескриптор информацию на одинаковый адрес, будет GP ?
это зависит от многих обстоятельств . прежде всего - включен ли страничный режим адресации .
3). Вот перешел я в защищенный режим, хочу использовать VESA и LFB, загружаю из таблицы VBE2 физический адрес LFB... Возвратился мне 32-битный адрес.. а теперь внимание,вопрос:
В каком сегменте он находится то? Т.е. по этому адресу надо записать данные, но в какой из сегментов?
вообще дурацкий вопрос . вам возвращают физический адрес . а уж как будет организован доступ по этому адресу - ваше личное дело . )
Спасибо, читаю.
Если честно, мне стыдно спрашивать снова, как я уже говорил мелких деталей не уловил...А еще стыдно то что код мой (вполне тривиальный) не работает, и более того я не могу понять почему. Если мне кто-нибудь поможет буду очень благодарен.
use16
start:
mov ax, cs ; for GDT -> DS:GDTR
mov ds, ax
mov es,ax
; нформация о режиме (только ради адреса LFB)
mov ax,4f01h
mov cx,4112h
mov di,VBETABLE2
int 10h
mov ax,4f02h
mov bx,4112h
int 10h
; линия А20:
in al,92h
or al,2
out 92h,al
cli
in al,70h
or al,80h
out 70h,al
lgdt fword [GDTR]
lidt fword [IDTR]
; Set the protected mode
mov eax,cr0
or eax,1
mov cr0,eax
jmp CODE_SELECTOR : CODE_32BIT
NULL_SELECTOR = 0 ; Нулевой селектор
CODE_SELECTOR = 1 shl 3 ; Селектор кода
DATA_SELECTOR = 2 shl 3 ; Селектор данных
VIDEO_SELECTOR = 3 shl 3 ; Селектор буфера видеопамяти
GDTR: ; Global Descriptors Table Register
dw 4*8-1 ; Размер GDT
dd GDT ; Смещение GDT
GDT:
; нулевой дескриптор
NULL_descr db 8 dup (0)
; дескриптор 32-разрядного сегмента кода: база = 00000000h, размер = FFFFFFFFh
CODE_descr db 0FFh, 0FFh, 00h, 00h, 00h, 10011010b, 11001111b , 00h
; дескриптор 32-разрядного сегмента данных: база = 00000000h, размер = FFFFFFFFh
DATA_descr db 0FFh, 0FFh, 00h, 00h, 00h, 10010010b, 11001111b , 00h
; дескриптор сегмента видеопамяти: база = 000B8000h, размер = 0000FFFFh (в данном случае не используется)
VIDEO_descr db 0FFh, 0FFh, 00h, 80h, 0Bh, 10010010b, 01000000b , 00h
USE32
CODE_32BIT:
; включим прерывания
sti
in al, 70h
and al, 7Fh
out 70h, al
mov ax,DATA_SELECTOR
mov ds,ax ; ds и es - указывают на данные
mov es,ax
mov edi, dword ptr VBETABLE2+028h ; получаем адрес LFB
mov eax,00FF0000h ; ARGB , будут красные линии
mov ecx,0FFFFFh
cld ; увеличение edi
rep stosd ; es:edi ; ошибка ?
jmp $
include 'interrupts.asm'
include 'idt_lite.inc'
GP_FAULT db '** GENERAL PROTECTION FAULT **' ,0
cursor dd 0x00
error db 'error!' ,0
VBETABLE2 db 512 dup (0)
end_code:
;db 512 - (end_code-start) dup (0)
Что должен делать код:
1. Перейти в защищенный режим
2. Получить адрес LFB
3. Записать чего нибудь с этого адреса (в этой программе это красные линии)
Хотел заполнить весь экран красным цветом, но нет... Во первых такое чувство что экран заполняется ровно на 64 Кб, в то время как это lfb а не банки памяти
После того как выводятся линии сразу выскакивает ошибка (в виртуальной машине) мол, возникла ошибка и ОС будет перезагружена.
Более того, такая ошибка может не возникнуть, если записать в ecx число меньше чем 0FFFFh, вот тут:
mov eax,00FF0000h ; ARGB , будут красные линии
mov ecx,0FFFFFh
cld ; увеличение edi
rep stosd ; es:edi ; ошибка ?
Все дело в том что это ошибка не GP, во всяком случае обработчик GP молчит.
Танки грязи не боятся )
Но даже если прерывания оставить запрещенными - ошибка не пропадет. Ну это я к тому что проблема скорей всего не в этом..?
P.S. Хех... оказалось проблема на самом деле не в коде (!), а в виртуальной машине (пользуюсь MS Virtual PC). Странно, но если все это дело записать на дискету, и запустить на реальной машине, то экран полностью (почти) закрашивается красным цветом, как и должно быть.
Кстати вспомнил что MenuetOS при переходе в режим SVGA в MS Virtual PC выдает точно такую же ошибку.
Но тем не менее проблема остается... Что же не понравилось виртуальной машине?
.. Что же не понравилось виртуальной машине?
вот это "почти" и не понравилось . )
реальный проц запись-чтение в несуществующий адрес вполне допускает .