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

时间:2013-03-27 16:02:38

标签: linux memory graphics

我正在使用带有集成显卡的Fedora 17。 鉴于我能够操作物理内存的内容,我怎样才能找到我可以写入的物理内存偏移量以便在屏幕上显示内容?

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

是否有特定模式在内存中启动视频缓冲区? 关于这个主题有没有很好的信息来源?

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

INT 10 - VIDEO - SET VIDEO MODE

AH = 00h
AL = desired video mode (see #00010)

发现于:http://www.delorie.com/djgpp/doc/rbinter/id/74/0.html

2 个答案:

答案 0 :(得分:2)

像1989年一样生活

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

幽默 - Framebuffer API docFramebuffer Doc dir
智能卫兵 - InternalsDeferred I/O doc或如何模拟内存映射视频。


您不能直接使用 0xB8000 0xB0000 ,因为它们是物理地址。我假设你在用户空间而不是编写内核驱动程序。在Linux下,我们通常有MMU启用;换句话说,我们有虚拟内存。并非所有进程/用户都可以访问视频内存。但是,如果您被允许,则可以mmap 帧缓冲设备到您的地址空间。最好让内核为您提供一个地址,而不是请求特定的地址。

或了解professionals do it

的方式

男:mmap

编辑:如果您不是 root ,您仍然可以在/dev/fb0(或任何设备)上使用Unix权限来授予群组读取权限/编写或使用某​​种登录进程,为用户提供当前 tty 权限。

答案 1 :(得分:0)

也许你可以在这里开始: http://www.tldp.org/HOWTO/Framebuffer-HOWTO/

但是,现代视频图形绝不像“在VRAM中寻找内容”那样简单并且在那里写作。