Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/76: Рейтинг темы: голосов - 76, средняя оценка - 4.63
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
1

Прямой доступ к видеопамяти

18.07.2013, 17:10. Показов 14008. Ответов 41
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Требуется написать программу, которая будет напрямую обращаться в видеопамяти. Описание:

Реализовать функцию, принимающую три параметра - цвет фона, цвет тона и код символа и производящую заполнение этим символом всего экрана. Реализовать функцию очистки экрана с использованием созданной функции.

Для заполнения видеопамяти воспользуйтесь указателем на беззнаковый символ.
Для присвоения ему значения 0хВ8000000 необходимо осуществить явное преобразование типов. Непосредственное значение 0хВ8000000 имеет тип int. Следует сначала привести тип этого значения к void* а затем - к unsigned char* для того, чтобы присовение стало возможным.
Для обращения к различным байтам видеопамяти воспользуйтесь этим указателем.
Видеопамять организована следующим образом: байт по адресу 0хВ8000000 содержит код символа в левом верхнем углу экрана. Следующий за ним байт содержит цвет фона и цвет тона этого символа. В старшей половине этого байта содержится цвет фона, в младшей - цвет тона.

Коды некоторых цветов: 0х0 - черный, 0х7 - серый, 0хf - белый

При выполенини работы производите периодическое сохранение программы, так как некорректная работа с памятью может привести к ошибке ЭВМ и потере данных в оперативной памяти.

КОД, КОТОРЫЙ НЕ РАБОТАЕТ:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(void)
{
    
    char *p =  (char *)((void *)0xB8000000);
        
    for(int i = 1; i <= 20; i++){
        *p = '8';
        p++;
        *p = 0;
        p++;
    }
    
 
    return 0;
}
Добавлено через 1 минуту
Доступно ли прямое обращение к памяти в Windows 7 в режиме user mode?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.07.2013, 17:10
Ответы с готовыми решениями:

Прямой доступ к переменным
Доброго времени суток, форумчане. Сразу оговорю, что название темы может не совсем корректно...

Прямой доступ к видео памяти
Здравствуйте, подскажите как организовать прямой доступ к видео памяти на современно VGA/DVI видео...

вопрос по си-подключение видеопамяти
в проге-заготовке вот строка far*p=(char far *)MK_FP(0xB800,0x0000) прога-текстовой...

Прямой доступ к видеопамяти
Здраствуйте уважаемы программеры! У меня к вам огромная просьба не могу написать казалось бы...

41
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
18.07.2013, 17:12 2
Что значит "не работает"?

Добавлено через 1 минуту
Цитата Сообщение от bgm123 Посмотреть сообщение
Доступно ли прямое обращение к памяти в Windows 7 в режиме user mode?
Не доступно. Используй эмулятор MSDOS - либо DosBox, либо к.-л. другую виртуальную машину.....
0
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
18.07.2013, 17:14  [ТС] 3
Цитата Сообщение от CheshireCat Посмотреть сообщение
Не доступно. Используй эмулятор MSDOS - либо DosBox, либо к.-л. другую виртуальную машину.
А можно как то переключиться в динамическом режиме в kernel mode?

Добавлено через 1 минуту
Т.е. я правильно понял, что для того, чтобы сделать скриншот, нужен либо драйвер, либо системные вызовы?
0
Модератор
Эксперт по электронике
8947 / 6713 / 921
Регистрация: 14.02.2011
Сообщений: 23,687
18.07.2013, 17:16 4
Цитата Сообщение от bgm123 Посмотреть сообщение
Доступно ли прямое обращение к памяти в Windows 7 в режиме user mode?
ты это лет так на 30 опоздал
во времена Доса такое было возможно
а теперь где она эта видеопамять ?
в видеокартах по гектару и больше может стоять
Цитата Сообщение от bgm123 Посмотреть сообщение
char *p = *(char *)((void *)0xB8000000);
этим ты старательно лезешь в систему, ну и получаешь по рукам
и откуда ты взял этот адрес?
такой помню 0xA800:0x8000 и такой 0xB000:0000
а 32битных не припомню
так что только через DirectX, и то это будет не реальная память а проекция её на твое адресное пространство

Добавлено через 48 секунд
Цитата Сообщение от bgm123 Посмотреть сообщение
Т.е. я правильно понял, что для того, чтобы сделать скриншот, нужен либо драйвер, либо системные вызовы?
BitBlt еще никто не отменял
1
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
18.07.2013, 17:20  [ТС] 5
Где в современных ОС хранится изображение? В озу?
0
Модератор
Эксперт по электронике
8947 / 6713 / 921
Регистрация: 14.02.2011
Сообщений: 23,687
18.07.2013, 17:22 6
Цитата Сообщение от bgm123 Посмотреть сообщение
Где в современных ОС хранится изображение?
что есть изображение?
Цитата Сообщение от bgm123 Посмотреть сообщение
В озу?
и в ОЗУ и в видеопамяти и на диске если место мало
конкретно изображение чего
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
18.07.2013, 17:25 7
Цитата Сообщение от ValeryS Посмотреть сообщение
и откуда ты взял этот адрес?
такой помню 0xA800:0x8000 и такой 0xB000:0000
а 32битных не припомню
Во времена MSDOS, мир праху ее, именно так и нужно было адресовать 0xB000:0x0000. Компилятор (тот же Турбо Си) аккуратно преобразовывал 0xB0000000 в пару сегмент:смещение.
Но теперь да, подобные штуки остались только в истории - лет 30 назад.....
0
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
18.07.2013, 17:28  [ТС] 8
Цитата Сообщение от ValeryS Посмотреть сообщение
конкретно изображение чего
картинки на мониторе
0
Модератор
Эксперт по электронике
8947 / 6713 / 921
Регистрация: 14.02.2011
Сообщений: 23,687
18.07.2013, 17:32 9

Не по теме:

Цитата Сообщение от CheshireCat Посмотреть сообщение
Компилятор (тот же Турбо Си) аккуратно преобразовывал 0xB0000000 в пару сегмент:смещение.
Может быть
давно было не помню, да и писал в основном тогда на ассемблере
но я писал всегда так сегмент:смешение



Добавлено через 2 минуты
Цитата Сообщение от bgm123 Посмотреть сообщение
картинки на мониторе
ядро собирает картинки со всех программ компонует их и хранит внутри себя выдавая на видеокарту по мере необходимости, а может сразу компоновать в видеопамяти зависит от железа и драйверов
ты конкретно что хочешь сделать?
рисовать на десктопе? экран сохранить?
1
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
18.07.2013, 17:40  [ТС] 10
То есть, если я правильно понял, надо глядеть в сторону kernel mode?
0
404 / 360 / 36
Регистрация: 11.10.2010
Сообщений: 1,907
18.07.2013, 17:43 11
Цитата Сообщение от bgm123 Посмотреть сообщение
То есть, если я правильно понял, надо глядеть в сторону kernel mode?
лучше ненадо
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
18.07.2013, 17:54 12
Цитата Сообщение от bgm123 Посмотреть сообщение
То есть, если я правильно понял, надо глядеть в сторону kernel mode?
Раньше в ядре Windows были некоторые документированные возможности работать с
содержимым дисплея. Потом из-за DRM их стали целенаправлено вырезать (чтобы
нельзя было грабить защищенный медиа-контент), а в Windows 8 вообще убрали.
2
143 / 27 / 4
Регистрация: 06.05.2019
Сообщений: 1,792
Записей в блоге: 4
03.07.2023, 02:12 13
Получается что нету доступа к видеопамяти. А как же грузить туда часть данных чтобы не мучить основной процессор?
0
4001 / 2548 / 428
Регистрация: 09.09.2017
Сообщений: 11,293
03.07.2023, 02:54 14
Цитата Сообщение от bgm123 Посмотреть сообщение
То есть, если я правильно понял, надо глядеть в сторону kernel mode?
Нет, конечно. Надо смотреть в сторон современных графических библиотек.
Цитата Сообщение от Nexi99 Посмотреть сообщение
Получается что нету доступа к видеопамяти. А как же грузить туда часть данных чтобы не мучить основной процессор?
Никто туда абстрактные данные не грузит. Вы можете воспользоваться GUI-библиотекой системы чтобы вывести кнопки, формочки, поля ввода и т.п., можете напрямую через OpenGL вывести графику.
А прямая запись в видеопамять давно уже юзер-спейс приложениям запрещена из соображений безопасности.
0
Rius
03.07.2023, 05:42
  #15

Не по теме:

Это без проблем можно там, где нет защиты и ограничений.
В ZX Spectrum вот было. Или в embedded: FatFS в видеопамяти

0
567 / 469 / 99
Регистрация: 05.08.2022
Сообщений: 2,563
03.07.2023, 08:33 16
А всё же, мог бы кто-нибудь кратенько расссказать как сейчас железячно устроен обмен с отображаемым изображением в современных архитектурах PC?
Можно ли получить отборажение видеопамяти (той, что отрисовывается на дисплее сейчас) в какое-либо адресное пространство? (не берём в расчет "Windows не пустит обращения в память куда попало").
Или к "видеопамяти" вообще уже нет никакого доступа напрямую, а всей отрисовкой занимается процессор видеокарты, принимая команды типа "нарисуй окружность"?

Меня тоже интересует этот вопрос для общего развития.
0
4001 / 2548 / 428
Регистрация: 09.09.2017
Сообщений: 11,293
03.07.2023, 10:03 17
Цитата Сообщение от KSergey9 Посмотреть сообщение
А всё же, мог бы кто-нибудь кратенько расссказать как сейчас железячно устроен обмен с отображаемым изображением в современных архитектурах PC?
О, очень по-разному.
Самый простой способ я видел, когда читал про изготовление USB-мониторчика. Там картинка средствами проца рисуется в специально выделенной памяти, а потом целиком выбрасывается по USB для отображения. То есть рендеринг полностью софтварный. Аналогичный способ используется когда надо запустить программу с GUI, но графики на компьютере не установлено - виртуальный фреймбуфер. Программа отправляет стандартные команды рисования, а драйвер их тихонько утилизирует.
Но это все же экзотика.
Если же мы говорим про "обычный" вывод графики, то он построен на общении с видеокартой. Передача ей координат примитивов, матриц преобразования, текстур. А еще шейдеров - программ, скомпилированных под процессор видеокарты и собственно команд что со всем этим делать. Как именно это реализовано на совсем уж низком уровне, точно не скажу. Но наверняка каждый производитель извращается как может, и наверняка сам обмен выглядит так же, как и с любым другим устройством - запись в порты, передача массивов данных, прерывания и опрос флагов.
Цитата Сообщение от KSergey9 Посмотреть сообщение
Можно ли получить отборажение видеопамяти (той, что отрисовывается на дисплее сейчас) в какое-либо адресное пространство?
Вроде бы можно - но делается это только в монопольном режиме, когда кроме вашей программы никакая другая туда не лезет. Довольно сложный способ. Не стоит им пользоваться, если не изучаете соответствующий уровень оконной системы.
А что вам мешает сформировать картинку в собственной оперативной памяти, создать обычное окно и вывести туда?
Ну например, glDrawPixels. Вроде бы и через более простые библиотеки вроде SDL это можно, но надо искать. В интернете встречал даже вариант рисования в файл картинки, вообще без работы с экраном.
Цитата Сообщение от KSergey9 Посмотреть сообщение
Или к "видеопамяти" вообще уже нет никакого доступа напрямую, а всей отрисовкой занимается процессор видеокарты, принимая команды типа "нарисуй окружность"?
Вот как раз с окружностями на видеокартах проблемы...
Но в целом да, вы посылаете команды "создать окно", "создать кнопку", а графический сервер их выполняет.
Ваша программа на экране ведь обычно не одна, нехорошо если она полезет рисовать поверх чужих окон.
0
4263 / 3322 / 925
Регистрация: 25.03.2012
Сообщений: 12,515
Записей в блоге: 1
03.07.2023, 11:52 18
Nexi99, ты опять своим хакерством занимаешься?
0
567 / 469 / 99
Регистрация: 05.08.2022
Сообщений: 2,563
03.07.2023, 11:58 19
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если же мы говорим про "обычный" вывод графики, то он построен на общении с видеокартой. Передача ей координат примитивов, матриц преобразования, текстур. А еще шейдеров - программ, скомпилированных под процессор видеокарты и собственно команд что со всем этим делать. Как именно это реализовано на совсем уж низком уровне, точно не скажу.
Вот этот кусочек меня и интересует. И именно про IBM PC платформу или как оно нынче называется, а не вообще "как можно подключить произвольный дисплей".

Хорошо, а в случае готовый картинки?

Подчеркну еще раз: вопрос не про API какое-либо, с API все понятно. Как оно железячно сейчас сделано? (ранее область ОЗУ c заранее известными адресами "проецировалась" на монитор.)
0
4001 / 2548 / 428
Регистрация: 09.09.2017
Сообщений: 11,293
03.07.2023, 12:50 20
Цитата Сообщение от KSergey9 Посмотреть сообщение
И именно про IBM PC платформу или как оно нынче называется
Весь мой пост был именно об этом.
Цитата Сообщение от KSergey9 Посмотреть сообщение
Как оно железячно сейчас сделано? (ранее область ОЗУ c заранее известными адресами "проецировалась" на монитор.)
Если видеокарта слабая (как в примере с USB-шной) или ее нет вообще, может и в обычной ОЗУ.
В более типичном случае - в памяти видеокарты.
Так или иначе прямого доступа туда для юзерских приложений нет. Нечего им рисовать поверх чужих окон.
---
Вы лучше опишите чего добиться хотите.
0
03.07.2023, 12:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2023, 12:50
Помогаю со студенческими работами здесь

Прямой доступ к видеопамяти в DirectХ 9
Есть ли возможность обратится напрямую к вторичной поверхности (задний буфер) в DirectХ 9. Такая...

Прямой доступ к видеопамяти в режиме VESA
Если у кого-то есть код программы вывода на экран точки, графика, линии и т. д. в режиме VESA на...

Вывод строки используя прямой доступ к видеопамяти
CSEG segment org 100h begin: mov ax,dx mov es,ax mov al, 02h mov ah, 00h int 10h ...

Доступ к видеопамяти
Здравствуйте! Подскажите, как можно средствами C# получить доступ к содержимому видеопамяти (чтение...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru