3

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

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

カーネル.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 バイナリは、Debian リポジトリなどから入手できる mkimage とは異なり、私のデバイスでは動作しません。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 プログラムでも同じことができると思いますが、どこからどのように始めたらよいかわかりません。

提案やアイデアは大歓迎です。

4

1 に答える 1

0

長い道のりかもしれませんが、「mkimage」ソースコードにアクセスできない場合は、objdumpを使用して逆アセンブルし、何が起こっているのかを理解してみてください。

$ objdump -d ./mkimage
于 2012-05-14T17:38:47.547 に答える