2017-06-25 6 views
-2

私は最近、カーネルモジュールでデータを読み書きするプロジェクトに取り組んでいます。カーネルモジュール上でデータ(charデータ)を読み書きするためのC言語アプリケーションを作成しました。また、私はデータを使用して書くことができます/dev/xxxxからデータを読み取る方法は?

echo hello > /dev/xxxx 

私はC言語コードなしで私の格納されたデータを読み返すことができますか?このようなものを使うことはできますか?

cat /dev/xxxx 

これを使用すると、セグメント違反が発生します。

read value </dev/xxxx 

これを使用すると、dmesgは、カーネルモジュールが読み取り機能を永続的に実行していることを示しています。

[[email protected] TUNNEL_EXCHANGE]# echo hello > /dev/xxxx 
yyyy: device opened 
yyyy: call for write 
yyyy: Value written 
yyyy: device released 
[[email protected] TUNNEL_EXCHANGE]# line=$(head -n 1 /dev/xxxx) 
yyyy: device opened 
Unable to handle kernel paging request at virtual address af001000 
pgd = eead0000 
[af001000] *pgd=3e8eb811, *pte=00000000, *ppte=00000000 
Internal error: Oops - BUG: 7 [#1] PREEMPT SMP ARM 
Modules linked in: xxxx_driver(PO) 
CPU: 0 PID: 927 Comm: head Tainted: P   O 4.6.0-xilinx #1 
Hardware name: Xilinx Zynq Platform 
task: eeb03600 ti: ee940000 task.ti: ee940000 
PC is at __copy_to_user_std+0x4c/0x3c4 
LR is at 0x0 
pc : [<b02c051c>] lr : [<00000000>] psr: 20070013 
sp : ee941ecc ip : 00000000 fp : 00000000 
r10: 00000000 r9 : ee940000 r8 : 00000000 
r7 : 00000000 r6 : 00000000 r5 : 00000000 r4 : 00000000 
r3 : 00000000 r2 : 000015c0 r1 : af001000 r0 : aeeb2524 
Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user 
Control: 10c5387d Table: 3ead006a DAC: 00000055 
Process head (pid: 927, stack limit = 0xee940210) 
Stack: (0xee941ecc to 0xee942000) 
1ec0:       ee941f88 00000051 00002000 b0106f04 aeeb1b64 
1ee0: 00002000 00000000 00002000 af000140 aeeb1b64 af0000ec ee941f88 b01c3544 
1f00: aeeb3fbd 0002817d 00000000 b0101274 00001000 00000000 00000000 00001000 
1f20: 00000003 ee9be680 ef31e700 00000003 00000000 ef31e740 00000000 ee932d80 
1f40: ee941f88 00002000 aeeb1b64 aeeb1b64 ee932d80 ee941f88 00002000 b01c411c 
1f60: ee932d80 aeeb1b64 00002000 ee932d80 ee932d80 aeeb1b64 00002000 b0106f04 
1f80: ee940000 b01c4cac 00000000 00000000 00002000 00002000 7fffe000 00000001 
1fa0: 00000003 b0106d40 00002000 7fffe000 00000003 aeeb1b64 00002000 77a94100 
1fc0: 00002000 7fffe000 00000001 00000003 00000003 aeeb3fbd 0002817d 00000000 
1fe0: 00000000 aeeb1ad4 000150a8 a6f32890 60070010 00000003 00000000 00000000 
[<b02c051c>] (__copy_to_user_std) from [<af000140>] (xxxx_read+0x54/0x8c [xxxx_driver]) 
[<af000140>] (xxxx_read [xxxx_driver]) from [<b01c3544>] (__vfs_read+0x1c/0xcc) 
[<b01c3544>] (__vfs_read) from [<b01c411c>] (vfs_read+0x84/0xec) 
[<b01c411c>] (vfs_read) from [<b01c4cac>] (SyS_read+0x3c/0x74) 
[<b01c4cac>] (SyS_read) from [<b0106d40>] (ret_fast_syscall+0x0/0x3c) 
Code: ba000002 f5d1f03c f5d1f05c f5d1f07c (e8b151f8) 
---[ end trace c5d8c90d390bee96 ]--- 
yyyy: device released 
[[email protected] TUNNEL_EXCHANGE]# echo $line 

[[email protected] TUNNEL_EXCHANGE]# 

これは、カーネルドライバのコードは、C言語でopen, write, read, closeシステムコールと機能

static ssize_t xxxx_read(struct file *file, char *buf, size_t count, loff_t *ppos) 
{ 
    printk(KERN_ALERT "xxxx: call for read\n"); 
    //if(xxxx_str != NULL && count != 0 && count < TEXTLENGTH){ 
      if(copy_to_user(buf, xxxx_str, count)) 
        return -EINVAL; 
     *ppos = count; 
     printk(KERN_ALERT "xxxx: Value Read\n"); 
     return count; 
    //} 
    //printk(KERN_ALERT "xxxx: Value Not Read\n"); 
    //return 1; 
} 

このワーク微細読み出されます。

+1

*セグメンテーションフォールト*が 'cat/dev/xxxx'から取得された場合、私はあなたの*モジュール*がひどく壊れていると確信しています*。 –

+0

'dd 'は、コマンドラインからデバイスを読み込むための最も柔軟なインターフェースを提供します。つまり' dd if =/dev/xxxx bs = 1 count = 1 | od -cはデバイスから1文字を読み込みます。 – myaut

+0

投稿を私の出力に更新しました。 'cat/dev/xxxx'も同じエラーを出します。このエラーは 'dmesg'に表示されます。 – Champika

答えて

1

あなたread機能の実装が壊れている:

  1. countが大きすぎる場合はチェックしません。その場合、使用可能なバイト数だけコピーする必要があります。
  2. 現在のファイル位置の値を使用しないでください。複数の読み込みの場合に奇妙な結果が得られます。

上記の組み合わせの結果、関数はファイルの終わりを知らせることもできません(データがなくなったときに0を返す)。あなたのコードが#1のためにクラッシュしないなら、それは永遠にループする可能性があります。

+0

'return 0'を追加した後、それはループする事を止めました。しかし、コメントされたif条件を削除した後、 'count'の長さをチェックするために、' coppy_to_user() 'を持つif条件に移動し始めました。したがって、 'cat/dev/xxxx'は値を​​与えません。 'read mydata Champika

+0

@Champika if条件が不十分です - 利用可能なバイト数を返す必要があります( 'count'まで)。私は、カーネルモジュールの作成に関する本やチュートリアルを見ることをお勧めします。 – interjay

関連する問題