jslinux向けに最新カーネル3.8.5をビルド(つづき)

こちらの記事のつづきです。

ビルド

以下のファイルを生成して、「~/jslinux/」以下のものと差し替えます。

  • linuxstart.bin
  • vmlinux-3.8.5.bin


ビルドの手順は、大まかに以下の通りです。

  1. 「.config」の生成
  2. 「linuxstart-20120111」に付属の「Makefile」を修正
  3. 修正したMakefileで、「linuxstart.bin」と「vmlinux-38.bin」を生成
「.config」の生成

「linuxstart-20120111」に付属の「config_linux-2.6.20」を元に、
「make oldconfig」で「linux-3.8.5」用の「.config」を生成します。


コマンドライン上では以下の様に操作します。

$ cd ~/make_jskernel/linux-3.8.5/
$ make mrproper
$ cp ../linuxstart-20120111/config_linux-2.6.20 .config
$ make oldconfig

「make oldconfig」の実行後は、全てデフォルトの設定を選択するために、
Enterキーを押しっぱなしにしてください。
(そして、「make oldconfig」自体の実行が終了して、次のプロンプトが現れたら、キーを離します。)


また、「make mrproper」は、設定ファイルも含めてカーネルビルド時の中間ファイルを削除するコマンドです。

「linuxstart-20120111」に付属の「Makefile」を修正

以下の様に修正してください。

LD=ld -m elf_i386
CC=gcc -m32
CFLAGS= -O2 -Wall -fno-builtin -fno-stack-protector #-march=i386 
HOST_CFLAGS=-O2 -Wall
# modify to set the kernel path
===== ここから =====
KERNEL_PATH=../linux-3.8.5
===== ここまでの様に修正 =====

all: linuxstart.bin

linuxstart.out: linuxstart_head.o linuxstart.o libc.o
	$(LD) -o $@ -N -Ttext 0x00010000 $^

linuxstart.bin: linuxstart.out
	objcopy -O binary $< $@

%.o: %.c
	$(CC) $(CFLAGS)  -c -o $@ $<

%.o: %.S
	$(CC) -m32 -D__ASSEMBLY__ -c -o $@ $<

# target to generate kernel
kernel:
	make -C $(KERNEL_PATH) -j4
===== ここから =====
	objcopy -O binary $(KERNEL_PATH)/vmlinux vmlinux38.bin
===== ここまでの様に修正 =====

clean:
	rm -f linuxstart.bin linuxstart.out *.o *~ 
修正したMakefileで、「linuxstart.bin」と「vmlinux38.bin」を生成

「linuxstart.bin」は、「make」で、
「vmlinux38.bin」は、「make kernel」で生成します。


コマンドライン上での操作は以下の様になります。

  • 「linuxstart.bin」の生成
$ cd ~/make_jskernel/linuxstart-20120111/
$ make
  • 「vmlinux38.bin」の生成
$ cd ~/make_jskernel/linuxstart-20120111/
$ make kernel

生成したファイルで元ファイルを置換

先ほど生成した

  • linuxstart.bin
  • vmlinux38.bin

で「~/jslinux/」以下のファイルを置換します。


「linuxstart.bin」は、そのまま置換すれば良いですが、
「vmlinux38.bin」は、「vmlinux-2.6.20.bin」を置換するには、ファイル名の整合性が合わなくなるので、
「jslinux.js」を一部修正して、「vmlinux-3.8.5.bin」を読み込むようにし、
「vmlinux38.bin」を「vmlinux-3.8.5.bin」へリネームします。


コマンドライン上での操作は以下の様になります。

  • 「linuxstart.bin」
$ cd ~/jslinux/
$ mv linuxstart.bin linuxstart_old.bin
$ cp ~/make_jskernel/linuxstart-20120111/linuxstart.bin .
  • 「vmlinux-3.8.5.bin」

「~/jslinux/jslinux.js」の82行目辺りにある

pc.load_binary("vmlinux-2.6.20.bin", 0x00100000, start2);

を、以下の様に修正してください。

pc.load_binary("vmlinux-3.8.5.bin", 0x00100000, start2);


そして、以下の操作で適用します。

$ cp ~/make_jskernel/linuxstart-20120111/vmlinux38.bin ~/jslinux/vmlinux-3.8.5.bin

確認

そして、

へアクセスし、「uname -a」等でカーネルバージョンを確認します。

【追記】2013/04/07 22:34

カーネルバージョン「3.8.6」でも動作確認できました。


また、作業時に気付いたことがありましたので追記しておきます。
ローカル環境にウェブサーバを立てて作業している場合(今回、例として説明している場合)に関してで、
以下の2つに注意してください。

  • 「jslinux.js」で「vmlinux-*.bin」の変更時にはブラウザのキャッシュクリアが必要
  • バックスペースキーが効かない


2つ目に関しては、私の環境のみかも知れませんが、
ターミナル画面上でバックスペースキーが効きません。
(借りているVPS上で確認すると、バックスペースキーも正しく動作していました。)