TQ 2440 Hello worldドライバモジュールのロード


一ヶ月近く経ってやっとマニュアルに従ってLinuxカーネルを移植しました.次に駆動モジュールの移植を始めます.ネットでいくつかの資料を調べて、以下のようにまとめました.
ターゲットプラットフォーム:TQ 2404  ARM9 
カーネルバージョン:Linux-2.6.25
前提:ホストにクロスコンパイルツールがインストールされています.これはlinuxカーネル移植時に使用されたので、ここでは言いません.
本題に入る
1、まずディレクトリに入り、フォルダを作成する
#cd/home/wanyao/module
#vim hello.c
   1. #include <linux/init.h>  
2. #include <linux/module.h>
3. MODULE_LICENSE("Dual BSD/GPL");
4.
5. static int hello_init(void)
6. {
7. printk(KERN_ALERT "Hello, world
");
8. return 0;
9. }
10.
11. static void hello_exit(void)
12. {
13. printk(KERN_ALERT "Goodbye, cruel world
");
14. return 0;
15. }
16.
17. module_init(hello_init);
18. module_exit(hello_exit);

2、Makefileファイルの作成
#vim Makefile
   1. KERNELDIR=/opt/EmbedSky/linux-2.6.25     
2. PWD:=$(shell pwd)
3. INSTALLDIR=$(PWD)
4. CC=arm-linux-gcc
5. obj-m := hello.o
6. modules:
7. $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
8. clean:
9. rm -rf *.o *.ko *.mod.c *.markers *.order *.symvers
10. .PHONY:modules clean

注意:ドライバモジュールはカーネルツリーに配置する必要はありません.Makefileがカーネルツリーのパスを指定すれば問題ありません.ここでは/home/wanyao/にドライバモジュールを開発するためのmoduleディレクトリを構築しました.
3、その後makeを行う
#make
その結果、hello.koがロードするために必要なモジュールファイルである多くのファイルが生成されます.
4、tftpを利用してhello.koというモジュールファイルを開発ボードにアップロードする(この手順は私の別のブログで詳しく紹介しています)
5、モジュールをロードし、テストを行う(以下の操作は開発ボードのシステム端末で行う)
# insmod hello.ko Hello, world # rmmod hello
Goodbye, cruel world
大成功!
 
insmodで発生する可能性のあるエラー:
1、hello: version magic '2.6.30.4 mod_unload ARMv4 ' should be'2.6.30.4-EmbedSky mod_unload ARMv 4'insmod:cannot insert'hello.ko':invalid module formatエラー原因:モジュールバージョンとカーネルバージョンが一致しません!解決策:プリセット構成情報をインポートし、menuconfigに入ってGeneral config->()Local version->かっこに次の内容を追加します:「-EmbedSky」終了して.configとして保存し、カーネル、ドライバモジュールを再コンパイルし、モジュールをロードします.
2、hello: Unknown symbol__aeabi_unwind_cpp_pr 0 insmod:cannot insert'hello.ko':unknown symbol in module,or unknown parameterエラー原因:モジュールとカーネルミラーが一致しない
解決策:駆動をコンパイルするために同時に使用したカーネルミラーzImage,zImageをできるだけプレートに焼く.Ldd 3には、必要ではありませんが、モジュールに対応するカーネルを実行したほうがいいという言葉があります.
駆動を習い始めたばかりで、やっとhello worldモジュールのロードに成功しました!これは学習駆動の一歩ですが、私にとっては大きな一歩です.