Форум программистов, компьютерный форум, киберфорум
ОС на Assembler
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
65 / 0 / 1
Регистрация: 05.11.2013
Сообщений: 65

Как обратиться из защищенного режима к видео памяти

19.03.2014, 18:34. Показов 1954. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
как обратиться из защищенного режима к видео памяти размером 2 мб (видеорежим https://www.cyberforum.ru/cgi-bin/latex.cgi?480\times 640\times {2}^{32})
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.03.2014, 18:34
Ответы с готовыми решениями:

Теория защищенного режима
Могут ли в каких-либо случаях перекрываться сегменты стека и данных на платформе x86? Даже не представляю зачем это может быть нужно. ...

Базовые познания защищённого режима
Gruess Gott! Мои познания в области процессора скудны. Дальше договоримся, что ОС не существует и RM. 00. Приведите два примера кода...

Чтение памяти защищенного процесса
Друзья возникла нужда прочитать память процесса, защиту которого обеспечивает драйвер. Функции RPM WPM не работают, обойти это не...

19
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
20.03.2014, 03:44
artem3213212,
через WinAPI-функции
1
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
20.03.2014, 10:14
Mikl___, мне кажется, он про голое железо говорит
1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
20.03.2014, 11:02
sh2ezo,
так и писал бы "про голое железо", я-то откуда могу знать о чем он там говорит, могу посоветовать использовать функции VESA прерывания 10h или программировать видеоадаптер через порты ввода/вывода
1
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
20.03.2014, 13:20
Советую почитать здесь Включение LFB в VESA

Ни но! На самом деле все дела обстоят иначе. Достаточной установить режим таким образом:

Assembler
1
2
3
    mov ax,4F02h
    mov bx,4118h
    int 10h
и LFB будет доступен как обычная видеопамять. Для борща адрес видеопамяти будет доступен по адресу 0xE0000000 независимо от размера ОЗУ. Определять LFB через прерывания БИОСА не советую, коды для него просрочены и попросту не работают. Один ньюанс: на реальном железе LFB может иметь другой адрес, мне как-то попадалось и 0xC0000000. Его можно узнать в Windows, в диспетчере устройств.
2
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
20.03.2014, 15:38
Цитата Сообщение от Naydli Посмотреть сообщение
Определять LFB через прерывания БИОСА не советую, коды для него просрочены
Это как?
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
20.03.2014, 18:44
Цитата Сообщение от sh2ezo Посмотреть сообщение
Это как?

А вот так. В сети основная информация нацелена на VESA 1.2 и 2, следуя из описания, LFB-адрес определяется со всей остальной информацией по смещению +28 и имеет размер 4 байта. Из-за этой распущенности стандартизации LFB-адрес стали пинать куда попало. На виртуальных машинах и на старье это работает без проблем, а на более современном реальном железе - ни в какую.

Мне до сих пор не удалось решить эту проблему до конца, так что если у тебя есть более совершенные и главное рабочие предложения по извлечению LFB-адреса, то я их жду.
2
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
20.03.2014, 20:41
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
struc ModeInfoBlock
{
        .ModeAttributes dw ?
        .WinAAttributes db ?
        .WinBAttributes db ?
        .WinGranularity dw ?
        .WinSize dw ?
        .WinASegment dw ?
        .WinBSegment dw ?
        .WinFuncPtr dd ?
        .BytesPerScanLine dw ?
        .XResolution dw ?
        .YResolution dw ?
        .XCharSize db ?
        .YCharSize db ?
        .NumberOfPlanes db ?
        .BitsPerPixel db ?
        .NumberOfBanks db ?
        .MemoryModel db ?
        .BankSize db ?
        .NumberOfImagesPages db ?
        .Reserved db 0
        .RedMaskSize db ?
        .RedFieldPosition db ?
        .GreenMaskSize db ?
        .GreenFieldPosition db ?
        .BlueMaskSize db ?
        .BlueFieldPosition db ?
        .RsvdMaskSize db ?
        .RsvdFieldPosition db ?
        .DirectColorModeInfo db ?
        .LFBAddr dd ?
        .LFBVisibleAreaEnd dd ?
        .LFBInvisibleAreaSize dw ?
        .Reserved2 db 206 dup(0) 
}
Такая структура у меня, вроде, всегда работала и на новом, и на старом, и на виртуальном. Сейчас посчитал и смещение в моей структуре больше 28, если не ошибся, так что интересует, откуда взято кривое смещение.
1
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
21.03.2014, 09:31
Цитата Сообщение от sh2ezo Посмотреть сообщение
Такая структура у меня, вроде, всегда работала и на новом, и на старом, и на виртуальном. Сейчас посчитал и смещение в моей структуре больше 28, если не ошибся, так что интересует, откуда взято кривое смещение.
Смещение 28 в шестнадцатеричной, но все равно не работает.


Assembler
1
2
3
4
5
6
7
8
9
10
       mov  ax,4F01h
    mov cx,4118h
    mov edi,Info_Buffer
    int 10h
; Записываем физический адрес начала LFB в ESI
    mov esi,dword [Info_Buffer+028h]
; Устанавливаем режим
    mov ax,4F02h
    mov bx,4118h
    int 10h
1
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
21.03.2014, 19:07
Naydli, может, ты страничную адресацию юзаешь и из-за этого с памятью кривота происходит, но код ниже я тестировал на разных доступных мне конфигурациях и везде он работал. Странно, конечно, но, раз VBE порой дает кривую инфу, ТС'у придется напрямую опрашивать видеоадаптер. Удачи тебе, ТС, в твоём нелегком деле.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    svga.get_mode:
        ;output:
        ;   EDX 00:15 - X Resolution
        ;   EDX 16:31 - Y Resolution
        ;   EBX - BitsPerPixel
        ;   EAX - LFB Addr
        ;-------------------------------
        push cx
        push di
        mov ax,4F03h
        int 10h
        mov cx,bx
        mov di,ModeInfoBlock
        mov ax,4f01h
        int 10h
        mov ebx,0
        mov dx,[ModeInfoBlock.YResolution]
        shl edx,16
        mov dx,[ModeInfoBlock.XResolution]
        mov bl,[ModeInfoBlock.BitsPerPixel]
        mov eax,[ModeInfoBlock.LFBAddr]
        pop di
        pop cx
        ret
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
21.03.2014, 22:53
Цитата Сообщение от sh2ezo Посмотреть сообщение
может, ты страничную адресацию юзаешь и из-за этого с памятью кривота происходит
Нет, страничную не использую. Подозреваю, что косяк в БИОСЕ/Железе. Даже на отрез отказывались работать 24-битные видеорежимы. Что самое интересное, KolibriOS ждала та же учесть. Большинство имеют LFB-адрес 0xC0000000, 0xD0000000 или 0xE0000000, смастерить сервис для подбора - хитрая задача.
0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
22.03.2014, 12:04
Naydli, а на каком железе не работал твой кодес?
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
22.03.2014, 14:24
sh2ezo, AMD Athlon X3, с 4 гб ОЗУ и картой AMD radeon HDD 8750m.
0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
22.03.2014, 16:03
у меня amd athlon ii x4 740, 8 гб, карта ATI Radeon HD 7770.
есть ещё amd'шный ноутбук.
также есть старый комп с пнем четвертым, с карточкой nvidia geforce 5200 fx.
Также тестилось на паре ноутбуков, кофигураций которых не знаю.
В общем, везде работало. Мб, у тебя, действительно, с железкой проблемы. Попробуй на других тачках потестить. Если не будет работать, поразбираемся с твоим кодом. Мб, там что не так.
0
0 / 0 / 0
Регистрация: 22.02.2014
Сообщений: 8
23.03.2014, 13:54
Та же проблема. При получении информации о видеоадаптере выдает нули.
0
65 / 0 / 1
Регистрация: 05.11.2013
Сообщений: 65
28.03.2014, 10:55  [ТС]
пытаюсь написать вторичный загрузчик входящий в защищенный режим и ставящий данный видео режим грузится по адресу 7E00h управление на метку А получилось так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
gtl:
ziro: dd 0
dd 0
 
code:
dw 0FFFFh
dw 0000h
db 00h
db 10010001b
db 11000011b
db 00h
 
data:
dw 0FFFFh
dw 0000h
db 00h
db 11000001b
db 11000011b
db 00h
 
segp:
dw 0004h
dw 8E00h
db 00h
db 11000001b
db 00000011b
db 00h
 
 
gtl_reg:
sise dw 800h
gtl_addes dd gtl
 
A:
mov     ax,4F00h
mov     di,Video_Buffer
int     10h
mov     bx,[Video_Buffer+04h]
cmp     bx,0200h
jl      Not_support_LFB
 
mov     ax,4F01h
mov     cx,4112h
mov     di,7C00h
int     10h
 
mov     ax,4F02h
mov     bx,4112h
int     10h
mov     esi,[7C00h+028h]
 
cli
push word 8
push word PM_jmp-80h
 
lgdt [gtl_reg]
 
mov eax,cr0
or al,1
mov cr0,eax
 
db 0EAh
dw $+4
dw 8h
 
mov ax,16
mov ds,ax
 
mov dword [esi+26000],0ffffffffh     
 
jmp $
virtual box не дал результата
0
 Аватар для Naydli
217 / 53 / 4
Регистрация: 03.08.2013
Сообщений: 278
28.03.2014, 11:37
artem3213212,

И все дела.

Assembler
1
2
3
4
5
6
7
8
9
Mov ecx,120000
Xor ax,ax
Mov edi,0xe0000000
 
@@:
Mov word [edi],ax
Inc ax
Add edi,2
Loop @b
И не забудь А20 включить, не то совсем в защищенный режим не по фен-шую переходишь.
1
8 / 8 / 5
Регистрация: 28.03.2014
Сообщений: 137
31.03.2014, 10:01
Обратится можно обычным 10h перерывания, сначала нужно установить режим.
0
65 / 0 / 1
Регистрация: 05.11.2013
Сообщений: 65
02.04.2014, 00:40  [ТС]
решил обойтись обычным 11h режимом но все равно не получается у меня такой код:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
mov ax,11h
int 10h
 
in     al, 92h
or     al, 02h
out    92h, al
 
lgdt [gtl_reg]
cli
 
db 0EAh
dw PM-8
dw 8h
PM:
 
mov eax,cr0
or al,1
mov cr0,eax
 
mov ax,24
mov ss,ax
 
mov ax,16
mov ds,ax
 
sti
 
mov eax,0A000h
mov dword [eax],0ffffffffh
inc eax
jmp $
0
0 / 0 / 0
Регистрация: 22.02.2014
Сообщений: 8
03.04.2014, 18:38
В самом деле, сделайте нормальный переход в защищенный режим. IDT не определена, какого-то хрена включаются прерывания, после чего процессор вешается на мыльную петлю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.04.2014, 18:38
Помогаю со студенческими работами здесь

Как программно обратиться к внутренней памяти устройства
Здравствуйте, подскажите пожалуйста, имеется планшет Samsung Galaxy Tab 4 с ОС Android 5.0.2. Подключаю планшет через usb к ПК с Windows 7,...

Как обратиться к памяти, где лежит то, что нам надо!
Собственно все работаю в visual studio и использую ассемблерную вставку в си. дело в том что мне нужно сделать простой калькулятор. Т.е....

Как обратиться к значениям двухмерного массива созданного с выделением динамической памяти?
Здравствуйте. Есть такой код (не полностью) #include <iostream> #include <windows.h> #include <ctime> #include...

Установка видео режима Turbo C
Установка видео режима Примечание: Функция 00h прерывания 10h позволяет задать любой режим работы видеоадаптера: пример выбора...

PasLibVlc. Как загрузить видео из памяти?
procedure TForm1.LoadVideo(tmp: string); var TempStream : TMemoryStream; begin HideCaret(PasLibVlcPlayer1.Handle); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru