Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопросы по защищенному режиму

12K
22 января 2011 года
ASoftware
87 / / 16.04.2009
Только недавно начал изучать защищенный режим, сначала все вроде просто, но мелкие детали не ясны и слишком подробно в нэтэ это не рассказано. Значит:
1). Программа типа
org 7c00h
.............
переход в защ. режим
.............
jmp cs:mode_32
use32
mode_32:
.............
Получается ДО jmp код находится с адреса 7c00h а после ? Я знаю, в сегменте кода, на который указывает дескриптор...(0x00 - 0FFFFFFFF). Но как он туда "вдруг" попал? Ведь 32-битный код уже располагается в начале сегмента кода?

2). Если создать несколько дескрипторов с размерами в 4Гб, и записать в каждый дескриптор информацию на одинаковый адрес, будет GP ?

3). Вот перешел я в защищенный режим, хочу использовать VESA и LFB, загружаю из таблицы VBE2 физический адрес LFB... Возвратился мне 32-битный адрес.. а теперь внимание,вопрос:
В каком сегменте он находится то? Т.е. по этому адресу надо записать данные, но в какой из сегментов?
260
23 января 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: ASoftware
Только недавно начал изучать защищенный режим, сначала все вроде просто, но мелкие детали не ясны и слишком подробно в нэтэ это не рассказано. Значит:
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".

252
23 января 2011 года
koderAlex
1.4K / / 07.09.2005
Цитата: ASoftware

Получается ДО jmp код находится с адреса а после ? Я знаю, в сегменте кода, на который указывает дескриптор...(0x00 - 0FFFFFFFF). Но как он туда "вдруг" попал? Ведь 32-битный код уже располагается в начале сегмента кода?


считать не разучились ? в реальном режиме физический адрес 0х0000+0х7c00 , а при переходе в защищенный без страничного преобразования физический адрес тоже 0х0000+0х7c00 .

Цитата: ASoftware

2). Если создать несколько дескрипторов с размерами в 4Гб, и записать в каждый дескриптор информацию на одинаковый адрес, будет GP ?


это зависит от многих обстоятельств . прежде всего - включен ли страничный режим адресации .

Цитата: ASoftware

3). Вот перешел я в защищенный режим, хочу использовать VESA и LFB, загружаю из таблицы VBE2 физический адрес LFB... Возвратился мне 32-битный адрес.. а теперь внимание,вопрос:
В каком сегменте он находится то? Т.е. по этому адресу надо записать данные, но в какой из сегментов?


вообще дурацкий вопрос . вам возвращают физический адрес . а уж как будет организован доступ по этому адресу - ваше личное дело . )

12K
30 января 2011 года
ASoftware
87 / / 16.04.2009
Цитата:
Бессмертный Интеловский томик номер 3 (IA-32 Intel Architecture Software Developer's Manual), часть тоже номер 3 с заголовком "Protected-mode memory managment".


Спасибо, читаю.

Если честно, мне стыдно спрашивать снова, как я уже говорил мелких деталей не уловил...А еще стыдно то что код мой (вполне тривиальный) не работает, и более того я не могу понять почему. Если мне кто-нибудь поможет буду очень благодарен.

Код:
org 7c00h
 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 молчит.
260
30 января 2011 года
Ramon
1.1K / / 16.08.2003
Для начала, вам с такой IDT, разрешенными прерываниями, и судя по всему не настроенным контроллером прерываний не страшно?
12K
30 января 2011 года
ASoftware
87 / / 16.04.2009
Цитата:
Для начала, вам с такой IDT, разрешенными прерываниями, и судя по всему не настроенным контроллером прерываний не страшно?


Танки грязи не боятся )
Но даже если прерывания оставить запрещенными - ошибка не пропадет. Ну это я к тому что проблема скорей всего не в этом..?

P.S. Хех... оказалось проблема на самом деле не в коде (!), а в виртуальной машине (пользуюсь MS Virtual PC). Странно, но если все это дело записать на дискету, и запустить на реальной машине, то экран полностью (почти) закрашивается красным цветом, как и должно быть.

Кстати вспомнил что MenuetOS при переходе в режим SVGA в MS Virtual PC выдает точно такую же ошибку.

Но тем не менее проблема остается... Что же не понравилось виртуальной машине?

252
31 января 2011 года
koderAlex
1.4K / / 07.09.2005
Цитата: ASoftware
..то экран полностью (почти) закрашивается красным цветом, как и должно быть..

.. Что же не понравилось виртуальной машине?



вот это "почти" и не понравилось . )
реальный проц запись-чтение в несуществующий адрес вполне допускает .

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог