1

現在取り組んでいるプロジェクトでインライン アセンブリを使用しようとしています。このプロジェクトは、単純な OS をゼロから構築することに関するものです。

カーネル コードとスクリーン ドライバを書き始めるところまで来ました。

問題はスクリーン ドライバにあり、スクリーン カーソル (点滅しているカーソル) を内部レジスタに保存/取得するコードに正確にあると思います。

これは、私のコードでインライン アセンブリが使用されている場所です。

機能を適切にテストするために、インライン アセンブリ パーツをスクリーン ドライバーから別のファイルに分離しました。

ここに test.c があります:

# include <stdio.h>

// scree device I/O ports
# define REG_SCREEN_CTRL 0x3D4    
# define REG_SCREEN_DATA 0x3D5

unsigned char port_byte_in ( unsigned short port ) {

    // A handy C wrapper function that reads a byte from the specified port
    // "= a " ( result ) means : put AL register in variable RESULT when finished
    // " d " ( port ) means : load EDX with port
    unsigned char result ;
    __asm__ ("in %%dx, %%al" : "=a" (result) : "d" (port));
    return result ;

}

void port_byte_out ( unsigned short port , unsigned char data ) {
    // " a " ( data ) means : load EAX with data
    // " d " ( port ) means : load EDX with port
    __asm__ ("out %%al, %%dx" : :"a" (data) , "d" (port));
}

unsigned short port_word_in ( unsigned short port ) {
    unsigned short result ;
    __asm__ ("in %%dx, %%ax" : "=a" (result) : "d" (port));
    return result ;
}

void port_word_out ( unsigned short port , unsigned short data ) {
    __asm__ ("out %%ax, %%dx" : :"a" (data) , "d" (port));
}

void main (){
    int i = 10;

    printf("%d\n",i);
    port_byte_out ( REG_SCREEN_CTRL , 14);
    port_byte_out ( REG_SCREEN_DATA , ( unsigned char )( i >> 8));
    port_byte_out ( REG_SCREEN_CTRL , 15);


    port_byte_out ( REG_SCREEN_CTRL , 14);
    int j = port_byte_in ( REG_SCREEN_DATA ) << 8;
    printf("%d\n",j);
    port_byte_out ( REG_SCREEN_CTRL , 15);
    j += port_byte_in ( REG_SCREEN_DATA );
    printf("%d\n",j);
}

test.c を実行すると、次のようになります。

10
Segmentation fault (core dumped)

セグメンテーション違反ではなく、何らかの値を期待していました。

どんな助けでも大歓迎です、ありがとう。

4

1 に答える 1

1

INとのOUT命令は特権です。通常、Linux のユーザー空間実行可能ファイルからそれらを呼び出すことはできません。

ioperm()またはシステム コールを使用iopl()して、実行可能ファイルに I/O ポートに直接アクセスする権限を与えることができます。これらのシステム コールは両方とも、実行可能ファイルが root として実行されている必要があることに注意してください。

于 2013-04-22T19:42:03.290 に答える