フラッシュROMの空いているところにνカーネルを書き込む。
- 初期状態
| アドレス | サイズ | kernel2.4.17 | kernel2.4.20 | kernel2.6.12 | |
| 0x00380000- 0x00400000 |
524288 (512KB) |
/dev/fl0 | (read)/dev/mtd3 (write)/dev/mtdblock3 |
/dev/mtdblock0 | config save area |
| 0x00000000- 0x00300000 |
3145728 (3MB) |
/dev/fl1 | /dev/mtd0 /dev/mtdblock0 |
/dev/mtdblock1 | firm image |
| 0x00300000- 0x00370000 |
458752 (448KB) |
/dev/fl2 | /dev/mtd1 /dev/mtdblock1 |
/dev/mtdblock2 | bootcode |
| 0x00370000- 0x00380000 |
65536 (64KB) |
/dev/fl3 | /dev/mtd2 /dev/mtdblock2 |
/dev/mtdblock3 | boot flag |
| 0x00000000- 0x00400000 |
4194304 (4MB) |
/dev/fl4 | /dev/mtd4 /dev/mtdblock4 |
/dev/mtdblock4 | all |
# for i in 0 1 2 3 4 do mknod /dev/fl$i b 250 $i done # ls -la /dev/fl* brw-r--r-- 1 root root 250, 0 Jan 5 2005 /dev/fl0 brw-r--r-- 1 root root 250, 1 Jan 5 2005 /dev/fl1 brw-r--r-- 1 root root 250, 2 Jan 5 2005 /dev/fl2 brw-r--r-- 1 root root 250, 3 Jan 5 2005 /dev/fl3 brw-r--r-- 1 root root 250, 4 Jan 5 2005 /dev/fl4
# for i in 0 1 2 3 4 do mknod /dev/mtd$i c 90 $( (i*2)) done # for i in 0 1 2 3 4 5 do mknod /dev/mtdblock$i b 31 $i done # ls -la /dev/mtd* crw-r--r-- 1 root root 90, 0 Jul 31 2005 /dev/mtd0 crw-r--r-- 1 root root 90, 2 Jul 31 2005 /dev/mtd1 crw-r--r-- 1 root root 90, 4 Jul 31 2005 /dev/mtd2 crw-r--r-- 1 root root 90, 6 Jul 31 2005 /dev/mtd3 crw-r--r-- 1 root root 90, 8 Jul 31 2005 /dev/mtd4 brw-r--r-- 1 root root 31, 0 Jul 31 2005 /dev/mtdblock0 brw-r--r-- 1 root root 31, 1 Jul 31 2005 /dev/mtdblock1 brw-r--r-- 1 root root 31, 2 Jul 31 2005 /dev/mtdblock2 brw-r--r-- 1 root root 31, 3 Jul 31 2005 /dev/mtdblock3 brw-r--r-- 1 root root 31, 4 Jul 31 2005 /dev/mtdblock4 brw-r--r-- 1 root root 31, 5 Aug 16 2005 /dev/mtdblock5
- nkfd.o
| アドレス | サイズ | kernel2.4.17 | kernel2.6.12 |
| 0x00310000-0x00370000 0x00380000-0x00400000 |
917504(896KB) | /dev/nkfd | /dev/mtdblock5 |
nkfd.oによって0x00310000-0x00370000(fl2の後ろ),0x00380000-0x00400000(fl0)が /dev/nkfdに見えるようになる。
ブートコードとnkfd.oのコンパイル
パッチを当てる
$ tar zxvf linux-2.4.17_mvl21-sandpoint_040729.tar.gz $ cd linux-2.4.17_mvl21-sandpoint $ bzip2 -dc ../linux-2.4.17_mvl21-nbootcode-20050205.patch.bz2 | patch -p1
クロスコンパイル
$ vi .hhl_cross_compile powerpc-linux-
make
$ make hdhglan_config $ make oldconfig $ make dep $ make bootcode $ ls arch/ppc/boot/images/ Makefile bootcode.bin $ make modules $ ls ./drivers/block/flashdisk/nkfd.o ./drivers/block/flashdisk/nkfd.o
/dev/fl2 or /dev/mtdblock1 にνブートコードを書き込む
# dd if=nbootcode_hdhglan.bin of=/dev/mtdblock1
デバイスノードの作成
/dev/nkfdを作成してnkfd.oを読み込む
# mknod /dev/nkfd b 251 0 # insmod nkfd.o
確認
# dd if=/dev/nkfd of=nkfd.bin # cat /dev/fl2 /dev/fl0 | tail -c 917504 - > fl2_0 # cmp fl2_0 nkfd.bin
νカーネル書き込み
kernimg.binを取り出す
# /root/bin/chkheader fl1.orig info_ver: 0x00000001 firmid: 0x00001001 firmname: KURO-BOX(IETSUNA) subver: FLASH 1.1 version: major 0x0001 minor 0x0002 build: 0x0000 year/mon/day: 2004/04/16 hour:min:sec: 11:46:41 size: 2847034 (0x002b713a) bytes chksum: 0x4c206901 kernel_offset: 108 (0x0000006c) bytes kernel_size: 719495 (0x000afa87) bytes initrd_offset: 719603 (0x000afaf3) bytes initrd_size: 2127431 (0x00207647) bytes checksum OK! # head -c 719603 fl1.orig > kernimg.bin # dd if=kernimg.bin of=/dev/nkfd
νカーネルの起動
/dev/fl3 の先頭から256byteのところに'LOAD'と書き込む
# head -c 256 /dev/fl3 | sed "s/\$/LOAD/" > /dev/fl3
ソースの修正
今までのkernimg.binがそのまま使えるようにする。'nkernel'と入力するとνカーネルを起動する。
$ diff -u arch/ppc/boot/common/misc-simple.c{.orig,}
--- arch/ppc/boot/common/misc-simple.c.orig 2005-08-13 05:02:26.000000000 +0900
+++ arch/ppc/boot/common/misc-simple.c 2005-08-13 08:43:01.441271157 +0900
@@ -163,6 +163,8 @@
set_image(struct firminfo *info, int chkinitrd)
{
int i = 0;
+ int kern1size = 0x5ff94;
+ int nkfd2offset = 0x70000;
_printk("\n******* Product Information *******\n");
_printk("----------------------------------\n");
@@ -214,9 +216,9 @@
if (info == (struct firminfo *)NKERNEL_IMAGE_ADDRESS) {
zimage_start = (char *)NKERNEL_CONCAT_ADDRESS;
- memcpy(zimage_start, (char *)info + info->kernel_offset, info->kernel_size);
- memcpy(zimage_start + info->kernel_size, (char *)info + info->initrd_offset, info->initrd_size);
- zimage_size = info->kernel_size + info->initrd_size;
+ memcpy(zimage_start, (char *)info + info->kernel_offset, kern1size);
+ memcpy(zimage_start + kern1size, (char *)info + nkfd2offset, info->kernel_size - kern1size);
+ zimage_size = (int)info->kernel_size;
info = image_addr;
} else {
if (checksum_check((unsigned char*)info,info->size) != 0) {
@@ -345,6 +347,7 @@
}
_printk("call set_image(%08x, %d)\n", info, chkinitrd);
+force_nkernel:
force_dbg += set_image(info, chkinitrd);
#else /* FLASH_BOOT_IMAGE */
/* we have to subtract 0x10000 here to correct for objdump including
@@ -476,6 +479,12 @@
memcpy (cmd_line, cmd_preset, sizeof(cmd_preset));
dbg_mode();
}
+ i=0;while(i<7 && cmd_line[i] == "nkernel"[i]) ++i;
+ if (i > 6) {
+ info = (struct firminfo *)NKERNEL_IMAGE_ADDRESS;
+ chkinitrd = 1;
+ goto force_nkernel;
+ }
#endif /* FLASH_BOOT_IMAGE */
/* mappings on early boot can only handle 16M */
kernel2.4.20用のnkfd.oの作成
drivers/block/flashdisk/nkfd.cとinclude/melco/flashdisk.hをコピーする
$ mkdir nkfd $ cd nkfd/ $ ls flashdisk.h nkfd.c
Makefileの作成
$ vi Makefile
CFLAGS = -Wall -O2 -DMODULE -D__KERNEL__
INCLUDE = -isystem /usr/src/linux/include/
nkfd.o:
gcc -c $(CFLAGS) $(INCLUDE) nkfd.c
clean:
rm -f nkfd.o
カーネルソースの展開
$ ls -l /usr/src/linux lrwxrwxrwx 1 root root 38 Aug 9 01:44 /usr/src/linux -> /mnt/kernel/linux-2.4.20_my02_hdhglan/ $ ls -l /usr/src/linux/include/asm lrwxrwxrwx 1 afres afres 7 Aug 9 01:34 /usr/src/linux/include/asm -> asm-ppc/
トラックバックURL
1件のトラックバック
[...] 部分が違います。こちらを参照。 [...]