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 docFramebuffer Doc dir .
Smart Humons - InternalsDeferred I/O ドキュメント、またはメモリ マップされたビデオをエミュレートする方法。


0xB80000xB0000は物理アドレスであるため、直接使用することはできません。あなたはユーザー空間にいて、カーネルドライバーを書いていないと思います。Linux では、通常 MMU を有効にします。つまり、仮想メモリがあります。すべてのプロセス/ユーザーがビデオ メモリにアクセスできるわけではありません。ただし、許可されている場合はmmapフレームバッファデバイスをアドレス空間に追加できます。特定のアドレスを要求するのではなく、カーネルにアドレスを提供させるのが最善です。

または、プロ が行う方法をご覧ください。

男:mmap

編集: rootでない場合でも、Unix アクセス許可を(または任意のデバイスで) 使用して、読み取り/書き込みのグループ アクセス許可を与えるか、現在のtty/dev/fb0アクセス許可のユーザーに何らかのログインプロセスを使用することができます。

于 2013-03-27T16:37:08.000 に答える
0

たぶん、ここから始めることができます: http://www.tldp.org/HOWTO/Framebuffer-HOWTO/

しかし、最近のビデオ グラフィックスは、「メモリーのどこに VRAM があるかを見つけて」そこに書き込むという単純なものではありません。

于 2013-03-27T16:06:31.907 に答える