Hello Guest    ログイン
top > Linux > LinkStation/玄箱 > ブートコード

ブートコード

カテゴリー: LinkStation/玄箱| 公開: 2008/8/16 | 更新: 2008/9/11 | コメント(1)

フラッシュ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件のトラックバック

  1. 2010/4/10 0:22

    [...] 部分が違います。こちらを参照。 [...]

コメント送信

メールアドレスが公開されたり他で使用されたりすることはありません。