2017-03-27 19 views
0

ARMベースのデバイス用のドライバをコンパイルできましたが、ロードしようとするとドライバがクラッシュしました。ここ はcpuinfoの出力です:あなたは、私が余分vermagicを追加しましたようにここでARMv7とARMv5のドライバのコンパイル

Processor  : ARMv7 Processor rev 2 (v7l) 
BogoMIPS  : 999.42 
Features  : swp half thumb fastmult vfp edsp neon vfpv3 
CPU implementer : 0x41 
CPU architecture: 7 
CPU variant  : 0x3 
CPU part  : 0xc08 
CPU revision : 2 

filename:  cp210x.ko 
description: Silicon Labs CP210x RS232 serial adaptor driver 
license:  GPL 
vermagic:  2.6.37 mod_unload ARMv7 
vermagic:  2.6.37 mod_unload modversions ARMv5 
parm:   debug:Enable verbose debugging messages 

driver.koのuname -rの出力

2.6.37 

のmodinfoです(2.6.37 mod_unload ARMv7)、ターゲットシステムと一致するようにします。

これを正しく理解すれば、ターゲットはv7ですが、このモジュールをARMv5 CPU用にコンパイルしました。これがデバイスドライバのクラッシュの原因になりますか?

デバイスにはこのドライバがありますが、hwプロデューサの他のドライバパッケージに組み込まれています。このパッケージには、使用できないドライバもロードされます。このドライバパッケージはロードされていませんが、このドライバがこのハードウェア上で動作する必要があることを示しています。ここ

がクラッシュログ

modprobe cp210x.ko 
Unable to handle kernel NULL pointer dereference at virtual address 0000000a 
pgd = ca1fc000 
[0000000a] *pgd=870dd031, *pte=00000000, *ppte=00000000 
Internal error: Oops: 17 [#1] 
last sysfs file: /sys/kernel/uevent_seqnum 
Modules linked in: dahdi_dummy dahdi cmemk syslink ipt_MASQUERADE nf_nat iptable_filter ip_tables ipt_LOG xt_state nf_conntrack_ftp nf_conntrack_ipv4 nf_conntrack nf_defrag_ipv4 xt_recent xt_mac xt_limit work_led reset_button ipv6 
CPU: 0 Not tainted (2.6.37 #1) 
PC is at sys_init_module+0xfe0/0x1460 
LR is at sys_init_module+0xe7c/0x1460 
pc : [<c00836e8>] lr : [<c0083584>] psr: 20000013 
sp : cc5e9ed0 ip : bf3828dc fp : cc5e8000 
r10: bf385ca8 r9 : cf3bcb4e r8 : 000000c5 
r7 : 00000027 r6 : bf382544 r5 : bf38266c r4 : bf385ca8 
r3 : 00000000 r2 : c7c9f000 r1 : 0000000a r0 : 0000000a 
Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user 
Control: 10c5387d Table: 8a1fc019 DAC: 00000015 
Process modprobe (pid: 2676, stack limit = 0xcc5e82e8) 
Stack: (0xcc5e9ed0 to 0xcc5ea000) 
9ec0:          bf382544 00000001 000ac048 bf382550 
9ee0: 000000c5 cf3bd5a4 cf3b8000 000055f4 cf3bd20c cf3bd128 cf3bc2a0 c7c9f000 
9f00: 0000266c 000028dc 00000000 00000000 00000017 00000018 00000010 0000000d 
9f20: 00000009 00000000 6e72656b 00006c65 00000000 00000000 00000000 00000000 
9f40: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
9f60: 00000000 00000000 c9a19540 00000000 ca2403c0 00000006 c9a19540 00000000 
9f80: ca2403c0 000055f4 00000000 00000006 00000080 c0037c28 cc5e8000 00000000 
9fa0: 00000001 c0037a80 000055f4 00000000 000ac998 000055f4 000ac048 000ac978 
9fc0: 000055f4 00000000 00000006 00000080 000ac008 000ac028 000ac998 00000001 
9fe0: bebaf968 bebaf958 00017764 40214740 60000010 000ac998 c1e38bcc 03de8ad9 
[<c00836e8>] (sys_init_module+0xfe0/0x1460) from [<c0037a80>] (ret_fast_syscall+0x0/0x30) 
Code: e7923103 e1a03133 e3130001 15963128 (17d33000) 
---[ end trace 6e8943127db36208 ]--- 
Segmentation fault 
+0

私はの.koファイルをロードしようとすると、いくつかのより多くの試した後、今、このエラーが出る のmodprobe -v /lib/modules/2.6.37/misc/cp210x.ko cp210x:不明な記号がmutex_lock_nested(ERR 0) modprobe:モジュールをロードできません/lib/modules/2.6.37/misc/cp210x.ko(/persistent/etc/cp210x.ko):モジュール内の未知のシンボル、または未知のパラメータ しかし、私はfintの "mutex_lock_nested"をどこにも配置できませんcp210x.cファイルにあります。これをカーネルの設定のどこかで無効にする必要がありますか? –

+0

この[リンク](http://stackoverflow.com/questions/26039351/kernel-module-wont-link-symbol-mutex-lock-nested-not-found)をご覧ください。 多分あなたはそれからいくつかの助けを得る。 – Gaurav

+0

そのリンクから助けを得ることはできませんでしたが、ありがとうございます –

答えて

0

である私はcp210x.cファイルを変更し、ミューテックスのいずれかの使用があった場所をコメントアウトするhade。

static void cp210x_close(struct usb_serial_port *port) 
{ 
     dbg("%s - port %d", __func__, port->number); 

     usb_serial_generic_close(port); 

     /* mutex_lock(&port->serial->disc_mutex);*/ 
     if (!port->serial->disconnected) 
       cp210x_set_config_single(port, CP210X_IFC_ENABLE, UART_DISABLE); 
     /* mutex_unlock(&port->serial->disc_mutex);*/ 
} 
+0

いいえいいえ..これらのミューテックスロックAPIを削除すべきではありません。モジュールが複数のプロセスによってアクセスされている場合、mutexロックが存在しない場合、他のプロセスが作成されて不思議な振る舞いをする可能性があります。 モジュールに 'linux/mutex.h'ファイルが含まれていますか? – Gaurav

+0

はい、削除しないでください。ただし、このデバイスドライバをこのmutex呼び出しでデバイスにロードできません。各USBシリアルポートは1つのプロセスによってのみアクセスされ、このプロセス/クラッシュなどの場合はデバイスが再起動されます。 デバイスにインストールされているLinuxカーネルを制御できません。私はこれを削除する必要があるのは、カーネルがmutexのサポートなしでビルドされているからです(私はそれがオプションであればわかりません) このデバイスドライバにはlinux/mutex.hは含まれていませんが、何か違いがあればそれを見てください - それはそうではありません。 –

0

あるカーネル用にコンパイルされたカーネルモジュールを別のカーネルにロードしようとしていますか? Linuxモジュール(あなたがドライバと呼ぶもの)は、コンパイルされたカーネルにのみロードされるはずです。コンフィグレーションやコンパイラ設定が異なる同じバージョンのカーネルであっても、モジュールは互換性がなくなります。だからバージョンマジックで遊ぶことはとても危険です。

ドライバがクラッシュする理由は、誤ったレイアウトを使用してカーネルデータ構造にアクセスしようとしているためです。実際に読み込むべき属性を実際には読み取っていないためです。

アーキテクチャをARMv7からARMv5に変更することは、非常に劇的な構成変更であり、カーネルデータ構造のメモリレイアウトを完全に変更します。

Windowsのような他のオペレーティングシステムとは異なり、Linuxには同じロード可能モジュールを異なるバージョンのカーネルにロードするための抽象レイヤーや固定メモリレイアウトはありません。

+0

私がしようとしているのは、何かをコンパイルする可能性のないデバイス(Linuxイメージを持つハードウェア)のモジュールをクロスコンパイルすることです。私はarm-linux-gnueabihfを使ってコンパイルした後、v5からv6に変更します。 5,6と7の違いについて私が理解しているところは、armがv6のハードフロートのサポートを導入したことです。 modprobeを実行するとモジュールがロードされますが、まだハードウェア通信はテストされていません。 –

+0

通常、Linuxカーネルとドライバは高度に特殊化されていない限り、浮動小数点を使用しません。デバイス自体でコンパイルできないことは大丈夫です。私はいつもコンパイルしています。あなたがする必要があるのは、カーネルとドライバを含むすべてのモジュールの両方をクロスコンパイルすることです。次に、そのバージョンのカーネルをデバイスに転送します。あなたのデバイスはPokyプロジェクトでサポートされていますか?それは物事を多くのイザイアにします。 – Vlad

関連する問題