kernel-mode quine

そういえば C で quine 書いた覚えがないなー、あと Linuxカーネルモジュール書いてみたいなー、と思ったので、練習として Linuxカーネルモジュールで quine を書いてみました。

ref: http://github.com/mame/kernel-mode-quine

ビルド方法。まず、環境にあわせて Makefile の KDIR をいじってください。Ubuntu ならいじらなくてもいけるかも。Debian だと linux-headers とか入れればこのままで行けるかも。とにかく make が通れば OK 。

$ vi Makefile
$ make

insmod でカーネルにロードする。素人が書いたカーネルモジュールなので、何が起きても知りません。

$ sudo insmod ./quine.ko

/proc/quine ができてるはず。

$ ls /proc/quine/
Makefile  quine.c

/proc/quine/quine.c は quine になっているはず。

$ diff /proc/quine/quine.c quine.c

疑い深い人はコピーして make してみてもよい。

$ mkdir /tmp/quine-build && cd /tmp/quine-build
$ cp /proc/quine/quine.c /proc/quine/Makefile .
$ sudo rmmod quine
$ make
$ sudo insmod ./quine.ko
$ diff quine.c /proc/quine/quine.c
$ diff Makefile /proc/quine/Makefile

遊び終わったら rmmod でカーネルからアンロードする。

$ sudo rmmod quine

quine 自体はとても普通。/proc/quine/quine.c の read proc の中から /proc/quine/quine.c 自身に再帰的にアクセスとかしたら面白いかと思ったけれど、カーネルモードからファイルを読み書きするのはぐぐってみると bad idea らしいのでやめといた。