2

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

4

2 回答 2

3

像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 文档Framebuffer Doc 目录
Smart Humons -内部结构、延迟 I/O 文档或如何模拟内存映射视频。


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

或者看看专业人士是怎么 的。

男:mmap

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

于 2013-03-27T16:37:08.000 回答
0

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

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

于 2013-03-27T16:06:31.907 回答