LinuxKernel解読室(6日目)
昨日は被災して停電でした。
本日は被災して仕事が休みになりました。
港の方に行くと、まだ断水とか停電があるみたいです。
あ〜、会社行きたくないなぁ。
では、気を取り直して読み進めたい。
とは言っても今日は読まないで、アセンブリ言語をにょろにょろいじる。
今日中に全く終わってない。(停電の関係とemacs忘れてたので10分くらいしか弄ってないです。)
- 第1章 1.4 プロセスディスパッチャの実装(の勉強)
- アセンブリ言語の勉強ナリ
- アセンブリの命令は、システムコール(番号で指定)と引数をレジスタで指定して、ソフトウェア割り込み(0x80)を突っ込むものらしい。
- システムコール番号を突っ込むのはeax。
- 引数は ebx, ecx, edx, eci, edi, ebp に突っ込むらしい。
- システムコール番号とシステムコールの対応は i386 Linux の場合 i386/kernel/syscall_table.S に記述がある。
- Ubuntu10.10では、たぶん/usr/src/linux-headers-2.6.35-22/include/asm-generic/unistd.hのやつがそれに見える。
- というわけでHelloWorldのソースコード。
- 自分で直接打ったけど、内容はコピーです。(文字数をハードコーディングしてるのが素敵だ)
- アセンブリの命令は、システムコール(番号で指定)と引数をレジスタで指定して、ソフトウェア割り込み(0x80)を突っ込むものらしい。
.file "testasm.s" .global main msg : .ascii "Hello World !!\n" main: movl $0x04, %eax movl $0x00, %ebx movl $msg, %ecx movl $15, %edx int $0x80 ret
-
-
- 実行結果は以下の通り
-
xxxxx@ubuntu:~$ ./test Hello World !! xxxxx@ubuntu:~$
とりあえず今日はコンパイル出来ることを確認。
C言語で_asm{〜〜}みたいなのを書けばgccじゃなくても良かったんだろうけど、せっかくだからLinuxでやりたいので。。。
(リアルな環境が乏しくてなれないWin7NotePCしか使えない。)