<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>片っ端からメモってみる &#187; LinkStation/玄箱</title>
	<atom:link href="http://www.parlia.net/weblog/post/category/linux/linkstation/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.parlia.net/weblog</link>
	<description>Linuxサーバ構築やその他もろもろの備忘録</description>
	<lastBuildDate>Mon, 20 Jul 2009 03:54:19 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>ブートコード</title>
		<link>http://www.parlia.net/weblog/post/13.html/</link>
		<comments>http://www.parlia.net/weblog/post/13.html/#comments</comments>
		<pubDate>Sat, 16 Aug 2008 13:58:34 +0000</pubDate>
		<dc:creator>alte</dc:creator>
				<category><![CDATA[LinkStation/玄箱]]></category>

		<guid isPermaLink="false">http://www.parlia.net/weblog/?p=13</guid>
		<description><![CDATA[フラッシュ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 [...]]]></description>
			<content:encoded><![CDATA[<p>フラッシュROMの空いているところにνカーネルを書き込む。</p>
<ul>
<li>初期状態</li>
</ul>
<div>
<table border="0">
<thead>
<tr>
<td>アドレス</td>
<td>サイズ</td>
<td>kernel2.4.17</td>
<td>kernel2.4.20</td>
<td>kernel2.6.12</td>
<td> </td>
</tr>
</thead>
<tbody>
<tr>
<td>0x00380000-<br />
0x00400000</td>
<td>524288<br />
(512KB)</td>
<td>/dev/fl0</td>
<td>(read)/dev/mtd3<br />
(write)/dev/mtdblock3</td>
<td>/dev/mtdblock0</td>
<td>config save area</td>
</tr>
<tr>
<td>0x00000000-<br />
0x00300000</td>
<td>3145728<br />
(3MB)</td>
<td>/dev/fl1</td>
<td>/dev/mtd0<br />
/dev/mtdblock0</td>
<td>/dev/mtdblock1</td>
<td>firm image</td>
</tr>
<tr>
<td>0x00300000-<br />
0x00370000</td>
<td>458752<br />
(448KB)</td>
<td>/dev/fl2</td>
<td>/dev/mtd1<br />
/dev/mtdblock1</td>
<td>/dev/mtdblock2</td>
<td>bootcode</td>
</tr>
<tr>
<td>0x00370000-<br />
0x00380000</td>
<td>65536<br />
(64KB)</td>
<td>/dev/fl3</td>
<td>/dev/mtd2<br />
/dev/mtdblock2</td>
<td>/dev/mtdblock3</td>
<td>boot flag</td>
</tr>
<tr>
<td>0x00000000-<br />
0x00400000</td>
<td>4194304<br />
(4MB)</td>
<td>/dev/fl4</td>
<td>/dev/mtd4<br />
/dev/mtdblock4</td>
<td>/dev/mtdblock4</td>
<td>all</td>
</tr>
</tbody>
</table>
</div>
<p><span id="more-13"></span></p>
<pre># 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</pre>
<pre># 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</pre>
<ul>
<li>nkfd.o</li>
</ul>
<div class="ie5">
<table border="0">
<thead>
<tr>
<td>アドレス</td>
<td>サイズ</td>
<td>kernel2.4.17</td>
<td>kernel2.6.12</td>
</tr>
</thead>
<tbody>
<tr>
<td>0x00310000-0x00370000<br />
0x00380000-0x00400000</td>
<td>917504(896KB)</td>
<td>/dev/nkfd</td>
<td>/dev/mtdblock5</td>
</tr>
</tbody>
</table>
</div>
<p>nkfd.oによって0x00310000-0x00370000(fl2の後ろ),0x00380000-0x00400000(fl0)が /dev/nkfdに見えるようになる。</p>
<h2>ブートコードとnkfd.oのコンパイル</h2>
<p>パッチを当てる</p>
<pre>$ 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</pre>
<p>クロスコンパイル</p>
<pre>$ vi .hhl_cross_compile
powerpc-linux-</pre>
<p>make</p>
<pre>$ 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</pre>
<p>/dev/fl2 or /dev/mtdblock1 にνブートコードを書き込む</p>
<pre># dd if=nbootcode_hdhglan.bin of=/dev/mtdblock1</pre>
<h2>デバイスノードの作成</h2>
<p>/dev/nkfdを作成してnkfd.oを読み込む</p>
<pre># mknod /dev/nkfd b 251 0
# insmod nkfd.o</pre>
<p>確認</p>
<pre># dd if=/dev/nkfd of=nkfd.bin
# cat /dev/fl2 /dev/fl0 | tail -c 917504 - &gt; fl2_0
# cmp fl2_0 nkfd.bin</pre>
<h2>νカーネル書き込み</h2>
<p>kernimg.binを取り出す</p>
<pre># /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 &gt; kernimg.bin
# dd if=kernimg.bin of=/dev/nkfd</pre>
<h2>νカーネルの起動</h2>
<p>/dev/fl3 の先頭から256byteのところに'LOAD'と書き込む</p>
<pre># head -c 256 /dev/fl3 | sed "s/\$/LOAD/" &gt; /dev/fl3</pre>
<h2>ソースの修正</h2>
<p>今までのkernimg.binがそのまま使えるようにする。'nkernel'と入力するとνカーネルを起動する。</p>
<pre>$ 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-&gt;kernel_offset, info-&gt;kernel_size);
-       memcpy(zimage_start + info-&gt;kernel_size, (char *)info + info-&gt;initrd_offset, info-&gt;initrd_size);
-       zimage_size = info-&gt;kernel_size + info-&gt;initrd_size;
+       memcpy(zimage_start, (char *)info + info-&gt;kernel_offset, kern1size);
+       memcpy(zimage_start + kern1size, (char *)info + nkfd2offset, info-&gt;kernel_size - kern1size);
+       zimage_size  = (int)info-&gt;kernel_size;
        info = image_addr;
     } else {
        if (checksum_check((unsigned char*)info,info-&gt;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&lt;7 &amp;&amp; cmd_line[i] == "nkernel"[i]) ++i;
+       if (i &gt; 6) {
+               info = (struct firminfo *)NKERNEL_IMAGE_ADDRESS;
+               chkinitrd = 1;
+               goto force_nkernel;
+       }
 #endif /* FLASH_BOOT_IMAGE */

        /* mappings on early boot can only handle 16M */</pre>
<h2>kernel2.4.20用のnkfd.oの作成</h2>
<p>drivers/block/flashdisk/nkfd.cとinclude/melco/flashdisk.hをコピーする</p>
<pre>$ mkdir nkfd
$ cd nkfd/
$ ls
flashdisk.h  nkfd.c</pre>
<p>Makefileの作成</p>
<pre>$ 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</pre>
<p>カーネルソースの展開</p>
<pre>$ ls -l /usr/src/linux
lrwxrwxrwx    1 root     root           38 Aug  9 01:44
/usr/src/linux -&gt; /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 -&gt; asm-ppc/</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.parlia.net/weblog/post/13.html/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
