0

私はドライバープログラミングの初心者です。簡単なcharドライバーを書き始めました。次に、charドライバーmknod / dev / simple-driver c2500用の特別なファイルを作成しました。cat /dev/simple-driverと入力した場合。文字列「HelloworldfromKernelmode!」が表示されます。私はその機能を知っています

static const char    g_s_Hello_World_string[] = "Hello world tamil_vanan!\n\0";
    static const ssize_t g_s_Hello_World_size = sizeof(g_s_Hello_World_string);


    static ssize_t device_file_read(
                   struct file *file_ptr
                , char __user *user_buffer
                , size_t count
                , loff_t *possition)
    {
       printk( KERN_NOTICE "Simple-driver: Device file is read at offset = 
           %i, read bytes count = %u", (int)*possition  , (unsigned int)count );

       if( *possition >= g_s_Hello_World_size )
          return 0;

       if( *possition + count > g_s_Hello_World_size )
          count = g_s_Hello_World_size - *possition;

        if( copy_to_user(user_buffer, g_s_Hello_World_string + *possition,         count) != 0              )
          return -EFAULT;   

       *possition += count;
       return count;
    }

と呼ばれます。これは、ドライバーのfile_opreation構造体の(* read)にマップされます。私の質問は、この関数がどのように呼び出されるか、struct file、char、count、offsetなどのパラメーターがどのように渡されるかです。これがどのように起こっているか

4

2 に答える 2

0

cat は、glibc からの read 呼び出しのいくつかの posix バージョンを使用します。glibc は引数をスタックまたはレジスタ (これはハードウェア アーキテクチャによって異なります) に置き、カーネル モードに切り替えます。カーネルでは、値がカーネル スタックにコピーされます。そして最後に、読み取り関数が呼び出されます。

于 2013-03-25T23:26:27.390 に答える
0

Linux では、すべてがファイルと見なされます。ファイルの種類は、ドライバ ファイルか通常のファイルかは、マウントされているマウント ポイントによって異なります。例:あなたのケースを考えると:cat /dev/simple-driverデバイスファイルのマウントポイントに戻ります。

  • デバイス ファイル名simple-driverからメジャー番号とマイナー番号を取得します。

  • それらの番号 (特にマイナー番号) から、キャラクター ドライバーのドライバー ファイルを関連付けます。

  • ドライバーから、struct file ops構造体を使用して読み取り関数を見つけます。これは、読み取り関数に他なりません。

static ssize_t device_file_read(struct file *file_ptr, char __user *user_buffer, size_t count, loff_t *possition)

  • User_buffer は常に sizeof( size_t count) を取ります。バッファのチェックを維持することをお勧めします (場合によっては警告がスローされます)。
  • 文字列は User_buffer にコピーされます (copy_to_userコピー操作中にカーネル フラグをチェックするために使用されます)。
  • 最初のコピーの位置は 0 で、count:position+=count の順に増加します。

読み取り関数は、バッファを cat に返します。cat は、コンソールに他ならない std_out のバッファーの内容をフラッシュします。

于 2013-03-24T13:32:25.873 に答える