雑記帳

ソフトを中心に雑記を書いてる割とすぐ転職したい人。コメント貰えると私が喜びます。

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のソースコード
      • 自分で直接打ったけど、内容はコピーです。(文字数をハードコーディングしてるのが素敵だ)
.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しか使えない。)