2012-05-02 12 views
3

組み込み機器でLinuxカーネルを起動するには、カーネルに特別なヘッダを付ける必要があります。カーネルにタグを付けるために使用されるプログラムは、デバイスの製造によって32ビットバイナリとしてのみ提供されます。 64ビットシステムに数百MBのライブラリをインストールするだけで、数バイトのカーネルにタグを付ける必要があるので、これは非常に面倒です。これは、カーネルがタグ付けされている方法である。Cプログラムでヘッダを書きますか?

$./mkimage -f kernel.cfg -d zImage_without_header zImage 

kernel.cfg:

########################################################## 
#ENCINFO.CFG 
# 
# information and command for encode the Linux zImage 
########################################################## 

# Magic number for the ImageHeader, use this to seach start of the Image Header 
# 
MAGIC_NUMBER 0x27051956 

#operation system type 
OS_TYPE linux 

#cpu architecture type 
CPU_ARCH arm 

#image type 
IMAGE_TYPE kernel 

#compress type 
COMPRESS_TYPE gzip 

# 
DATALOAD_ADDRESS 0x00008000 

# 
ENTRY_ADDRESS 0x00008000 

#image name string 
IMAGE_NAME kernel.img 

#model name string 
MODEL_NAME DNS-313 

# version string 
VERSION 1.00b18 

# mac address string 
MAC_ADDRESS   FF-FF-FF-FF-FF-FF 

#the beginning offset of writing header 
START_OFFSET   0x00 

#the end offset of writing header 
END_OFFSET   0xFF 

#whether overwrite 
OVERWRITE   n 

mkimageバイナリ例えばから入手可能であるmkimage異なりますDebianリポジトリは、私のデバイスでは動作しません。私は、1MBのファイルを作成しようとヘッダーを表示するには、それをタグ付けしている:最後のコマンドから

$dd if=/dev/zero bs=1k count=1024 of=zImage_without_header 
$./mkimage -f kernel.cfg -d zImage_without_header zImage 

出力:

Magic Number: 27051956 
Image Name: kernel.img 
Created:  Wed May 2 17:40:43 2012 
Image Type: ARM Linux Kernel Image (gzip compressed) 
Data Size: 1048576 Bytes = 1024.00 kB = 1.00 MB 
Load Address: 0x00008000 
Entry Point: 0x00008000 
Model Name: DNS-313 
Version : 1.00b18 
Mac Address: ff:ff:ff:ff:ff:ff 

$hexdump -C zImage 

最後のコマンドからの出力:

00000000 27 05 19 56 [2c 83 53 d5] 4f a1 [55 7b 00 10 00 00] |'..V,.S.O.U{....| 
00000010 00 00 80 00 00 00 80 00 [a7 38 ea 1c] 05 02 02 01 |.........8......| 
00000020 6b 65 72 6e 65 6c 2e 69 6d 67 00 00 00 00 00 00 |kernel.img......| 
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00000040 44 4e 53 2d 33 31 33 00 00 00 00 00 00 00 00 00 |DNS-313.........| 
00000050 31 2e 30 30 62 31 38 00 00 00 00 00 00 00 00 00 |1.00b18.........| 
00000060 ff ff ff ff ff ff 00 00 00 00 00 00 00 00 00 00 |................| 
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
* 
00100060 

カーネルには常にタグを付ける必要があります私は何も変更する必要はないので、上記のようなヘッダー。角括弧[]で囲まれた値は、ファイルサイズが変わったときに変わるようですが、どのように変わったのでしょうか。

小さなCプログラムでも同じことが達成できると思いますが、どこから始めたらいいのでしょうか?

ご意見やご提案は歓迎します。

+2

リクエストメーカーからのmkimageのソース。彼らは技術的に拒否することができますが、それは本当に悪い考えです。 – Joshua

+0

さまざまな値の一部またはすべてがチェックサムである可能性が高いようです。自分でヘッダーを作成する前に、それらが何であるかを知る必要があります。 –

+1

'4f a1 55 7b'はタイムスタンプ(May 2 @ 15:40:43 GMT)です。 「未知数」の2つはチェックサムです。ブートローダがu-bootの場合、これらのフィールドは次のフィールドでなければなりません:http://www.linux-m32r.org/public/codefestweek2008/takata/qemu-0.9.1/html/d1/d14/structuboot__image__header__t.html – indiv

答えて

0

それはロングショットかもしれませんが、あなたは「mkimage」ソースコードへのアクセス権を持っていない場合、あなたはobjdumpはとそれを解体しようとすると、何が起こっているかを把握しようとすることができます:

$ objdump -d ./mkimage 
関連する問題