【问题标题】:Finding physical memory offset to video buffer查找视频缓冲区的物理内存偏移量
【发布时间】:2013-03-27 16:02:37
【问题描述】:

我正在使用集成显卡运行的 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

【问题讨论】:

  • 这不是你的 8 位系统
  • 是的。这是你在 80 年代和 90 年代曾经能够做到的事情。但不是现在,我怀疑。您可以通过 /dev/fb 写入帧缓冲区吗?

标签: linux memory graphics


【解决方案1】:

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

Humons - Framebuffer API doc, Framebuffer Doc dir.
Smart Humons - InternalsDeferred I/O doc 或如何模拟内存映射视频。


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

或者看看如何professionalsdo it

男:mmap

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

【讨论】:

【解决方案2】:

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

但现代视频图形绝不是“找出内存中的 VRAM 所在位置”并在那里写入那么简单。

【讨论】:

  • ASLR 大概会发挥作用吧?或者这不适用于 VRAM/帧缓冲区?
猜你喜欢
  • 2011-07-11
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多