Linux 查找到视频缓冲区的物理内存偏移量

Linux 查找到视频缓冲区的物理内存偏移量,linux,memory,graphics,Linux,Memory,Graphics,我正在使用Fedora 17与集成图形在板上运行。 考虑到我能够操纵物理内存的内容,我如何才能找出我可以写入的物理内存偏移量,以便在屏幕上显示某些内容 我试图查找0xB8000和0xB0000偏移量,但它们包含所有0xff 内存中是否有启动视频缓冲区的特定模式? 关于这个话题有什么好的信息来源吗 我的问题的根本原因是Linux没有使用传统视频模式,因此0xB8000处的内存受到限制(在我的例子中为只读)。但是,发出中断可以切换到其他模式: INT 10 - VIDEO - SET VIDEO M

我正在使用Fedora 17与集成图形在板上运行。 考虑到我能够操纵物理内存的内容,我如何才能找出我可以写入的物理内存偏移量,以便在屏幕上显示某些内容

我试图查找0xB8000和0xB0000偏移量,但它们包含所有0xff

内存中是否有启动视频缓冲区的特定模式? 关于这个话题有什么好的信息来源吗

我的问题的根本原因是Linux没有使用传统视频模式,因此0xB8000处的内存受到限制(在我的例子中为只读)。但是,发出中断可以切换到其他模式:

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);
    }