HelloWorld
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
* Hello World [#p0df494b]
ほぼ何もしない "Hello World" プログラムを作って Linux ker...
** ソースコード [#r86823f5]
&ref(hello_world.tar.gz,,添付ファイル); に一式をまとめて...
*** 実行部 [#h10ff46b]
#code(c,hello_world.c);
*** Makefile [#o9dc2a8d]
#code(txt,Makefile);
** hello_world.c が user space アプリケーションと違うとこ...
C 言語で Linux application の hello world プログラムを書...
*** module_init, module_exit [#d8f36181]
main() はありません。モジュールが kernel に組み込まれる時...
#code(c,"/define\s*module_init/..=-8+12",ogfileone:/inclu...
モジュールが「組み込まれた」、「外された」時に呼ばれる仕...
*** __init, __exit [#f0e4c8af]
関数に &ogdefs(__init,__init,linux/init.h); と &ogdefs(__...
- __init: モジュールをロードするときだけ呼び出す関数を修...
- __exit: モジュールをアンロードする時だけ呼び出す関数を...
__init と __exit は kernel のメモリ使用量をなるべく減らす...
#code(c,/define\s*__init/../__initconst/,ogfileone:/inclu...
#code(c,/define\s*__exit\s*__section/..+1,ogfileone:/incl...
*** printk [#w0e5feae]
&ogdefs(printk); は printf に相当する関数です。デバッグを...
#textbox(note,printk に浮動小数点形式の書式が無い){{
printkの書式に浮動小数点形式はありません。kernel の中では...
}}
*** KERN_INFO [#ac85fd7f]
&ogdefs(KERN_INFO,KERN_INFO,linux/kern_levels.h); は kern...
|Macro|Level|alternate function|alternate function&br;for...
|&ogdefs(KERN_EMERG,KERN_EMERG,linux/kern_levels.h);|CENT...
|&ogdefs(KERN_ALERT,KERN_ALERT,linux/kern_levels.h);|CENT...
|&ogdefs(KERN_CRIT,KERN_CRIT,linux/kern_levels.h);|CENTER...
|&ogdefs(KERN_ERR,KERN_ERR,linux/kern_levels.h);|CENTER:3...
|&ogdefs(KERN_WARNING,KERN_WARNING,linux/kern_levels.h);|...
|&ogdefs(KERN_NOTICE,KERN_NOTICE,linux/kern_levels.h);|CE...
|&ogdefs(KERN_INFO,KERN_INFO,linux/kern_levels.h);|CENTER...
|&ogdefs(KERN_DEBUG,KERN_DEBUG,linux/kern_levels.h);|CENT...
#textbox(note,KERN_XXX は行の先頭で有効です){{
KERN_XXX は行の先頭にあるものが有効です。printk を何回か...
}}
#textbox(caution,/sys/kernel/debug の下に何もない){{
Linux ディストリビューションあるいは SoC メーカーが提供し...
}}
&ogfiledirect(/proc/sys/kernel/printk リンク先の printk ...
別のページで各種のデバッグ手法について集中的に説明する予...
*** MODULE_LICENSE [#p712afbe]
&ogdefs(MODULE_LICENSE,MODULE_LICENSE,include/linux/modul...
|license 文字列|モジュールから結合可能な kernel symbol ex...
|"GPL", "GPL v2", "GPL and additional rights", "Dual BSD/...
|Proprietary|EXPORT_SYMBOL|
ライセンスの宣言通り、ソースコードを配布できるようにする...
モジュールのソースを公開したくなければ "Proprietary" を指...
#textbox(note,kernel に静的に結合する場合){{
kernel に静的に結合する場合は結合先のシンボルが EXPORT_SY...
}}
*** MODULE_DESCRIPTION, MODULE_AUTHOR [#mdfbd846]
&ogdefs(MODULE_DESCRIPTION,MODULE_DESCRIPTION,include/lin...
#pre(soft){{
&span(ConsoleOut){$ }; &span(ConsoleIn){/sbin/modinfo };&...
}}
** Makefile [#x4106800]
&ogfileone(module を構築するための Makefile の書き方 modu...
#textbox(note,/lib/modules/$(shell uname -r)/buil...
/lib/modules/$(shell uname -r)/build は今使ってい...
}}
** Linux kernel に動的に組み込むモジュールとして作成する ...
&ref(hello_world.tar.gz,,添付ファイル);を展開したディレク...
#pre(soft){{
&span(ConsoleOut){$ };&span(ConsoleIn){cd };&span(Console...
&span(ConsoleOut){$ };&span(ConsoleIn){make};
}}
特に驚くような警告やエラーは出ないはずです。最終的なター...
#pre(soft){{
&span(ConsoleOut){make -C /lib/modules/};&span(ConsoleOut...
}}
** Linux kernel に組み込む [#i3d8ce65]
make コマンドに続けて次のようにしてモジュールを組み込みま...
#pre(soft){{
&span(ConsoleOut){$ };&span(ConsoleIn){sudo insmod hello_...
&span(ConsoleOut){[sudo] password for };&span(ConsoleOut,...
}}
*** 何も起きない? dmesg で確かめよう [#v37a74c8]
コンソールには insmod コマンドに反応した表示は何も出ない...
#pre(soft){{
&span(ConsoleOut){$ };&span(ConsoleIn){dmesg};
...省略...
&span(ConsoleOut){[ 910.921955] hello_world: module veri...
&span(ConsoleOut){[ 910.921955] hello_world_init: Hello ...
}}
左側に表れている数値は printk timestamp または printk tim...
#textbox(note,小数点付で時刻が表示されている){{
小数点付で時刻が表示されています。しかし、この表示のため...
}}
#code(c,/static.*print_time/../^}$/,ogfileone:/kernel/pri...
** Linux kernel に組み込まれたことを確認する [#db7282e1]
モジュールが kernel に組み込まれていることを lsmod コマン...
#pre(soft){{
&span(ConsoleOut){$ };&span(ConsoleIn){lsmod};
&span(ConsoleOut){Module Size Used by};
&span(ConsoleOut,Focus){hello_world 16384 0};
&span(ConsoleOut){rfcomm 69632 0};
&span(ConsoleOut){bnep 24576 2};
&span(ConsoleOut){bluetooth 516096 10 bnep,r...
&span(ConsoleOut){nfsd 299008 13};
&span(ConsoleOut){autofs4 40960 4};
&span(ConsoleOut){auth_rpcgss 61440 1 nfsd};
&span(ConsoleOut){nfs_acl 16384 1 nfsd};
&span(ConsoleOut){nfs 249856 0};
&span(ConsoleOut){lockd 94208 2 nfs,nfs...
&span(ConsoleOut){grace 16384 2 nfsd,lo...
&span(ConsoleOut){sunrpc 327680 19 nfs,nf...
&span(ConsoleOut){fscache 65536 1 nfs};
&span(ConsoleOut){snd_intel8x0 40960 2};
&span(ConsoleOut){snd_ac97_codec 135168 1 snd_int...
&span(ConsoleOut){ac97_bus 16384 1 snd_ac9...
&span(ConsoleOut){snd_pcm 106496 2 snd_ac9...
&span(ConsoleOut){snd_seq_midi 16384 0};
&span(ConsoleOut){snd_seq_midi_event 16384 1 snd_seq...
&span(ConsoleOut){snd_rawmidi 32768 1 snd_seq...
&span(ConsoleOut){snd_seq 69632 2 snd_seq...
&span(ConsoleOut){joydev 20480 0};
&span(ConsoleOut){snd_seq_device 16384 3 snd_seq...
&span(ConsoleOut){snd_timer 32768 2 snd_pcm...
&span(ConsoleOut){snd 86016 11 snd_ac...
&span(ConsoleOut){serio_raw 16384 0};
&span(ConsoleOut){soundcore 16384 1 snd};
&span(ConsoleOut){8250_fintek 16384 0};
&span(ConsoleOut){i2c_piix4 24576 0};
&span(ConsoleOut){mac_hid 16384 0};
&span(ConsoleOut){parport_pc 32768 0};
&span(ConsoleOut){ppdev 20480 0};
&span(ConsoleOut){lp 20480 0};
&span(ConsoleOut){parport 45056 3 lp,ppde...
&span(ConsoleOut){hid_generic 16384 0};
&span(ConsoleOut){usbhid 53248 0};
&span(ConsoleOut){hid 118784 2 hid_gen...
&span(ConsoleOut){psmouse 122880 0};
&span(ConsoleOut){ahci 36864 5};
&span(ConsoleOut){libahci 32768 1 ahci};
&span(ConsoleOut){e1000 139264 0};
&span(ConsoleOut){pata_acpi 16384 0};
}}
** Linux kernel から外す [#c957a200]
rmmod コマンドでモジュールをアンロードしない限り、Linux k...
#pre(soft){{
&span(ConsoleOut){$ };&span(ConsoleIn){sudo rmmod hello_w...
}}
続けて、dmesg で確かめてみましょう。module_exit() で指定...
#pre(soft){{
&span(ConsoleOut){$ };&span(ConsoleIn){dmesg};
...省略...
&span(ConsoleOut){[ 910.921955] hello_world: module veri...
&span(ConsoleOut){[ 910.922372] hello_world_init: Hello ...
&span(ConsoleOut){[ 933.824630] hello_world_exit: Goodby...
}}
lsmod コマンドをもう一度し hello_world モジュールが外され...
#textbox(note,メモリアロケートをした場合はどうなるの?){{
モジュールでメモリアロケートをするのはまだ先の話です。モ...
}}
*** モジュールは一つだけ組み込める [#c6e7352f]
同じモジュールは 1 つだけ kernel に組み込めます。2 つ組み...
#pre(soft){{
&span(ConsoleOut){$ };&span(ConsoleIn){sudo insmod hello_...
&span(ConsoleOut){$ };&span(ConsoleIn){sudo insmod hello_...
&span(ConsoleOut){insmod: ERROR: could not insert module ...
}}
この結果から分ることは何でしょうか?
複数の同一デバイスを N 個接続した場合、1 個のモジュールは...
#textbox(note,どのデバイス・ドライバも同一のデバイスが複...
答えは No です。プラットホーム固有のデバイス(あるいは SoC...
}}
** module verification failed: signature and/or required ...
「kernel を汚した」というメッセージが気になります。このメ...
#pre(soft){{
&span(ConsoleOut){$ };&span(ConsoleIn){keydir=/lib/module...
&span(ConsoleOut){$ };&span(ConsoleIn){$keydir/scripts/si...
}}
** いくつかの疑問と希望 [#b2cd7dc7]
hello_world モジュールは何もしないプログラムでした。ここ...
*** printk は何処と結合しているの? [#g9da7396]
hello_world モジュールは printk 関数を使用しました。この...
*** 引数は受け取れないのか [#n042d5b9]
module_init() で指定した関数の引数は void でした。何も引...
*** エラーは返せないのか? [#tfc52d6b]
module_init() で指定した関数は int 型の値を返す関数です。...
module_exit() で指定した関数は void 型でした。モジュール...
#textbox(note,終了処理全般の戻り値はおおよそ void){{
Linux kernel 内で、Call Back や 関数テーブル経由(メソッド...
}}
** HelloWorld を修正する [#s74f31f6]
いくつかの疑問と希望を確かめ、叶えるために hello_world モ...
終了行:
* Hello World [#p0df494b]
ほぼ何もしない "Hello World" プログラムを作って Linux ker...
** ソースコード [#r86823f5]
&ref(hello_world.tar.gz,,添付ファイル); に一式をまとめて...
*** 実行部 [#h10ff46b]
#code(c,hello_world.c);
*** Makefile [#o9dc2a8d]
#code(txt,Makefile);
** hello_world.c が user space アプリケーションと違うとこ...
C 言語で Linux application の hello world プログラムを書...
*** module_init, module_exit [#d8f36181]
main() はありません。モジュールが kernel に組み込まれる時...
#code(c,"/define\s*module_init/..=-8+12",ogfileone:/inclu...
モジュールが「組み込まれた」、「外された」時に呼ばれる仕...
*** __init, __exit [#f0e4c8af]
関数に &ogdefs(__init,__init,linux/init.h); と &ogdefs(__...
- __init: モジュールをロードするときだけ呼び出す関数を修...
- __exit: モジュールをアンロードする時だけ呼び出す関数を...
__init と __exit は kernel のメモリ使用量をなるべく減らす...
#code(c,/define\s*__init/../__initconst/,ogfileone:/inclu...
#code(c,/define\s*__exit\s*__section/..+1,ogfileone:/incl...
*** printk [#w0e5feae]
&ogdefs(printk); は printf に相当する関数です。デバッグを...
#textbox(note,printk に浮動小数点形式の書式が無い){{
printkの書式に浮動小数点形式はありません。kernel の中では...
}}
*** KERN_INFO [#ac85fd7f]
&ogdefs(KERN_INFO,KERN_INFO,linux/kern_levels.h); は kern...
|Macro|Level|alternate function|alternate function&br;for...
|&ogdefs(KERN_EMERG,KERN_EMERG,linux/kern_levels.h);|CENT...
|&ogdefs(KERN_ALERT,KERN_ALERT,linux/kern_levels.h);|CENT...
|&ogdefs(KERN_CRIT,KERN_CRIT,linux/kern_levels.h);|CENTER...
|&ogdefs(KERN_ERR,KERN_ERR,linux/kern_levels.h);|CENTER:3...
|&ogdefs(KERN_WARNING,KERN_WARNING,linux/kern_levels.h);|...
|&ogdefs(KERN_NOTICE,KERN_NOTICE,linux/kern_levels.h);|CE...
|&ogdefs(KERN_INFO,KERN_INFO,linux/kern_levels.h);|CENTER...
|&ogdefs(KERN_DEBUG,KERN_DEBUG,linux/kern_levels.h);|CENT...
#textbox(note,KERN_XXX は行の先頭で有効です){{
KERN_XXX は行の先頭にあるものが有効です。printk を何回か...
}}
#textbox(caution,/sys/kernel/debug の下に何もない){{
Linux ディストリビューションあるいは SoC メーカーが提供し...
}}
&ogfiledirect(/proc/sys/kernel/printk リンク先の printk ...
別のページで各種のデバッグ手法について集中的に説明する予...
*** MODULE_LICENSE [#p712afbe]
&ogdefs(MODULE_LICENSE,MODULE_LICENSE,include/linux/modul...
|license 文字列|モジュールから結合可能な kernel symbol ex...
|"GPL", "GPL v2", "GPL and additional rights", "Dual BSD/...
|Proprietary|EXPORT_SYMBOL|
ライセンスの宣言通り、ソースコードを配布できるようにする...
モジュールのソースを公開したくなければ "Proprietary" を指...
#textbox(note,kernel に静的に結合する場合){{
kernel に静的に結合する場合は結合先のシンボルが EXPORT_SY...
}}
*** MODULE_DESCRIPTION, MODULE_AUTHOR [#mdfbd846]
&ogdefs(MODULE_DESCRIPTION,MODULE_DESCRIPTION,include/lin...
#pre(soft){{
&span(ConsoleOut){$ }; &span(ConsoleIn){/sbin/modinfo };&...
}}
** Makefile [#x4106800]
&ogfileone(module を構築するための Makefile の書き方 modu...
#textbox(note,/lib/modules/$(shell uname -r)/buil...
/lib/modules/$(shell uname -r)/build は今使ってい...
}}
** Linux kernel に動的に組み込むモジュールとして作成する ...
&ref(hello_world.tar.gz,,添付ファイル);を展開したディレク...
#pre(soft){{
&span(ConsoleOut){$ };&span(ConsoleIn){cd };&span(Console...
&span(ConsoleOut){$ };&span(ConsoleIn){make};
}}
特に驚くような警告やエラーは出ないはずです。最終的なター...
#pre(soft){{
&span(ConsoleOut){make -C /lib/modules/};&span(ConsoleOut...
}}
** Linux kernel に組み込む [#i3d8ce65]
make コマンドに続けて次のようにしてモジュールを組み込みま...
#pre(soft){{
&span(ConsoleOut){$ };&span(ConsoleIn){sudo insmod hello_...
&span(ConsoleOut){[sudo] password for };&span(ConsoleOut,...
}}
*** 何も起きない? dmesg で確かめよう [#v37a74c8]
コンソールには insmod コマンドに反応した表示は何も出ない...
#pre(soft){{
&span(ConsoleOut){$ };&span(ConsoleIn){dmesg};
...省略...
&span(ConsoleOut){[ 910.921955] hello_world: module veri...
&span(ConsoleOut){[ 910.921955] hello_world_init: Hello ...
}}
左側に表れている数値は printk timestamp または printk tim...
#textbox(note,小数点付で時刻が表示されている){{
小数点付で時刻が表示されています。しかし、この表示のため...
}}
#code(c,/static.*print_time/../^}$/,ogfileone:/kernel/pri...
** Linux kernel に組み込まれたことを確認する [#db7282e1]
モジュールが kernel に組み込まれていることを lsmod コマン...
#pre(soft){{
&span(ConsoleOut){$ };&span(ConsoleIn){lsmod};
&span(ConsoleOut){Module Size Used by};
&span(ConsoleOut,Focus){hello_world 16384 0};
&span(ConsoleOut){rfcomm 69632 0};
&span(ConsoleOut){bnep 24576 2};
&span(ConsoleOut){bluetooth 516096 10 bnep,r...
&span(ConsoleOut){nfsd 299008 13};
&span(ConsoleOut){autofs4 40960 4};
&span(ConsoleOut){auth_rpcgss 61440 1 nfsd};
&span(ConsoleOut){nfs_acl 16384 1 nfsd};
&span(ConsoleOut){nfs 249856 0};
&span(ConsoleOut){lockd 94208 2 nfs,nfs...
&span(ConsoleOut){grace 16384 2 nfsd,lo...
&span(ConsoleOut){sunrpc 327680 19 nfs,nf...
&span(ConsoleOut){fscache 65536 1 nfs};
&span(ConsoleOut){snd_intel8x0 40960 2};
&span(ConsoleOut){snd_ac97_codec 135168 1 snd_int...
&span(ConsoleOut){ac97_bus 16384 1 snd_ac9...
&span(ConsoleOut){snd_pcm 106496 2 snd_ac9...
&span(ConsoleOut){snd_seq_midi 16384 0};
&span(ConsoleOut){snd_seq_midi_event 16384 1 snd_seq...
&span(ConsoleOut){snd_rawmidi 32768 1 snd_seq...
&span(ConsoleOut){snd_seq 69632 2 snd_seq...
&span(ConsoleOut){joydev 20480 0};
&span(ConsoleOut){snd_seq_device 16384 3 snd_seq...
&span(ConsoleOut){snd_timer 32768 2 snd_pcm...
&span(ConsoleOut){snd 86016 11 snd_ac...
&span(ConsoleOut){serio_raw 16384 0};
&span(ConsoleOut){soundcore 16384 1 snd};
&span(ConsoleOut){8250_fintek 16384 0};
&span(ConsoleOut){i2c_piix4 24576 0};
&span(ConsoleOut){mac_hid 16384 0};
&span(ConsoleOut){parport_pc 32768 0};
&span(ConsoleOut){ppdev 20480 0};
&span(ConsoleOut){lp 20480 0};
&span(ConsoleOut){parport 45056 3 lp,ppde...
&span(ConsoleOut){hid_generic 16384 0};
&span(ConsoleOut){usbhid 53248 0};
&span(ConsoleOut){hid 118784 2 hid_gen...
&span(ConsoleOut){psmouse 122880 0};
&span(ConsoleOut){ahci 36864 5};
&span(ConsoleOut){libahci 32768 1 ahci};
&span(ConsoleOut){e1000 139264 0};
&span(ConsoleOut){pata_acpi 16384 0};
}}
** Linux kernel から外す [#c957a200]
rmmod コマンドでモジュールをアンロードしない限り、Linux k...
#pre(soft){{
&span(ConsoleOut){$ };&span(ConsoleIn){sudo rmmod hello_w...
}}
続けて、dmesg で確かめてみましょう。module_exit() で指定...
#pre(soft){{
&span(ConsoleOut){$ };&span(ConsoleIn){dmesg};
...省略...
&span(ConsoleOut){[ 910.921955] hello_world: module veri...
&span(ConsoleOut){[ 910.922372] hello_world_init: Hello ...
&span(ConsoleOut){[ 933.824630] hello_world_exit: Goodby...
}}
lsmod コマンドをもう一度し hello_world モジュールが外され...
#textbox(note,メモリアロケートをした場合はどうなるの?){{
モジュールでメモリアロケートをするのはまだ先の話です。モ...
}}
*** モジュールは一つだけ組み込める [#c6e7352f]
同じモジュールは 1 つだけ kernel に組み込めます。2 つ組み...
#pre(soft){{
&span(ConsoleOut){$ };&span(ConsoleIn){sudo insmod hello_...
&span(ConsoleOut){$ };&span(ConsoleIn){sudo insmod hello_...
&span(ConsoleOut){insmod: ERROR: could not insert module ...
}}
この結果から分ることは何でしょうか?
複数の同一デバイスを N 個接続した場合、1 個のモジュールは...
#textbox(note,どのデバイス・ドライバも同一のデバイスが複...
答えは No です。プラットホーム固有のデバイス(あるいは SoC...
}}
** module verification failed: signature and/or required ...
「kernel を汚した」というメッセージが気になります。このメ...
#pre(soft){{
&span(ConsoleOut){$ };&span(ConsoleIn){keydir=/lib/module...
&span(ConsoleOut){$ };&span(ConsoleIn){$keydir/scripts/si...
}}
** いくつかの疑問と希望 [#b2cd7dc7]
hello_world モジュールは何もしないプログラムでした。ここ...
*** printk は何処と結合しているの? [#g9da7396]
hello_world モジュールは printk 関数を使用しました。この...
*** 引数は受け取れないのか [#n042d5b9]
module_init() で指定した関数の引数は void でした。何も引...
*** エラーは返せないのか? [#tfc52d6b]
module_init() で指定した関数は int 型の値を返す関数です。...
module_exit() で指定した関数は void 型でした。モジュール...
#textbox(note,終了処理全般の戻り値はおおよそ void){{
Linux kernel 内で、Call Back や 関数テーブル経由(メソッド...
}}
** HelloWorld を修正する [#s74f31f6]
いくつかの疑問と希望を確かめ、叶えるために hello_world モ...
ページ名: