Linux 查找到视频缓冲区的物理内存偏移量
我正在使用Fedora 17与集成图形在板上运行。 考虑到我能够操纵物理内存的内容,我如何才能找出我可以写入的物理内存偏移量,以便在屏幕上显示某些内容 我试图查找0xB8000和0xB0000偏移量,但它们包含所有0xff 内存中是否有启动视频缓冲区的特定模式? 关于这个话题有什么好的信息来源吗 我的问题的根本原因是Linux没有使用传统视频模式,因此0xB8000处的内存受到限制(在我的例子中为只读)。但是,发出中断可以切换到其他模式:Linux 查找到视频缓冲区的物理内存偏移量,linux,memory,graphics,Linux,Memory,Graphics,我正在使用Fedora 17与集成图形在板上运行。 考虑到我能够操纵物理内存的内容,我如何才能找出我可以写入的物理内存偏移量,以便在屏幕上显示某些内容 我试图查找0xB8000和0xB0000偏移量,但它们包含所有0xff 内存中是否有启动视频缓冲区的特定模式? 关于这个话题有什么好的信息来源吗 我的问题的根本原因是Linux没有使用传统视频模式,因此0xB8000处的内存受到限制(在我的例子中为只读)。但是,发出中断可以切换到其他模式: INT 10 - VIDEO - SET VIDEO M
INT 10 - VIDEO - SET VIDEO MODE
AH = 00h
AL = desired video mode (see #00010)
可在以下网址找到:也许您可以从这里开始: 但是,现代视频图形绝不像“在记忆中找到VRAM的位置”并在那里书写那样简单。像1989年那样生活
#包括
#定义DEV_MEM“/DEV/fb0”
/*屏幕参数(可能通过ioctl()和/sys*/
#定义YRES 240
#定义XRES 320
#定义每像素字节数(sizeof(unsigned short))/*16位像素*/
#定义贴图大小XRES*YRES*BYTES\u每像素
无符号短*映射库;
如果((fd=打开(DEV_MEM,O_RDWR | O_SYNC))=-1){
fprintf(stderr,“无法打开%s-您是root吗?\n”,DEV_MEM);
出口(1);
}
//映射那个页面。
映射库=(无符号短*)mmap(空,映射大小,
保护读写,映射共享,fd,0);
如果((长)映射库==-1){
perror(“无法mmap”);
出口(1);
}
休蒙斯-,.智能Humons-或如何模拟内存映射视频
您不能直接使用0xB8000和0xB0000,因为它们是物理地址。我假设您在用户空间中,没有编写内核驱动程序。在Linux下,我们通常启用MMU;换句话说,我们有虚拟内存。并非所有进程/用户都可以访问视频内存。但是,如果允许,您可以
mmap
framebuffer设备到您的地址空间。最好让内核给您一个地址,而不是请求一个特定的地址
或者看看怎么做
男:
编辑:如果您不是root用户,您仍然可以在
/dev/fb0
(或任何设备)上使用Unix权限授予组读/写权限或使用某种登录过程,以授予用户当前tty权限。这不是您的8位系统是的。这是您在80年代和90年代可以做的事情。但我怀疑现在不是。您可以通过/dev/fb写入帧缓冲区吗?ASLR可能会起作用吗?否?或者否不适用于VRAM/framebuffers?喜欢你回复的标题!请投赞成票,恐龙同胞:)请参阅:了解PC和内存映射图形的一些奇怪之处。和
#include <linux/fb.h>
#define DEV_MEM "/dev/fb0"
/* Screen parameters (probably via ioctl() and /sys. */
#define YRES 240
#define XRES 320
#define BYTES_PER_PIXEL (sizeof(unsigned short)) /* 16 bit pixels. */
#define MAP_SIZE XRES*YRES*BYTES_PER_PIXEL
unsigned short *map_lbase;
if((fd = open(DEV_MEM, O_RDWR | O_SYNC)) == -1) {
fprintf(stderr, "cannot open %s - are you root?\n", DEV_MEM);
exit(1);
}
// Map that page.
map_lbase = (unsigned short *)mmap(NULL, MAP_SIZE,
PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if((long)map_lbase == -1) {
perror("cannot mmap");
exit(1);
}