天天看點

mkimage使用詳解

uboot源代碼的tools/目錄下有mkimage工具,這個工具可以用來制作不壓縮或者壓縮的多種可啟動映象檔案。

mkimage在制作映象檔案的時候,是在原來的可執行映象檔案的前面加上一個0x40位元組的頭,記錄參數所指定的資訊,這樣uboot才能識别這個映象是針對哪個CPU體系結構的,哪個OS的,哪種類型,加載記憶體中的哪個位置, 入口點在記憶體的那個位置以及映象名是什麼

root@Glym:/tftpboot# ./mkimage

Usage: ./mkimage -l image

-l ==> list image header information

./mkimage -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image

-A ==> set architecture to 'arch'

-O ==> set operating system to 'os'

-T ==> set image type to 'type'

-C ==> set compression type 'comp'

-a ==> set load address to 'addr' (hex)

-e ==> set entry point to 'ep' (hex)

-n ==> set image name to 'name'

-d ==> use image data from 'datafile'

-x ==> set XIP (execute in place)

參數說明:

-A 指定CPU的體系結構:

取值 表示的體系結構

alpha Alpha 

arm A RM 

x86 Intel x86

ia64 IA64

mips MIPS

mips64 MIPS 64 Bit

ppc PowerPC

s390 IBM S390

sh SuperH

sparc SPARC

sparc64 SPARC 64 Bit

m68k MC68000

-O 指定作業系統類型,可以取以下值:

openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos

-T 指定映象類型,可以取以下值:

standalone、kernel、ramdisk、multi、firmware、script、filesystem

-C 指定映象壓縮方式,可以取以下值:

none 不壓縮

gzip 用gzip的壓縮方式

bzip2 用bzip2的壓縮方式

-a 指定映象在記憶體中的加載位址,映象下載下傳到記憶體中時,要按照用mkimage制作映象時,這個參數所指定的位址值來下載下傳

-e 指定映象運作的入口點位址,這個位址就是-a參數指定的值加上0x40(因為前面有個mkimage添加的0x40個位元組的頭)

-n 指定映象名

-d 指定制作映象的源檔案

<a href="http://www.cnitblog.com/luofuchong/archive/2007/01/12/21834.html">U-BOOT下使用bootm引導核心方法</a>

一、在開始之前先說明一下bootm相關的東西。

1、 首先說明一下,S3C2410架構下的bootm隻對sdram中的核心鏡像檔案進行操作(好像AT91架構提供了一段從flash複制核心鏡像的代碼, 不過針對s3c2410架構就沒有這段代碼,雖然可以在u-boot下添加這段代碼,不過好像這個用處不大),是以請確定你的核心鏡像下載下傳到sdram 中,或者在bootcmd下把flash中的核心鏡像複制到sdram中。

2、-a參數後是核心的運作位址,-e參數後是入口位址。

3、

1)如果我們沒用mkimage對核心進行處理的話,那直接把核心下載下傳到0x30008000再運作就行,核心會自解壓運作(不過核心運作需要一個tag來傳遞參數,而這個tag建議是由bootloader提供的,在u-boot下預設是由bootm指令建立的)。

2)如果使用mkimage生成核心鏡像檔案的話,會在核心的前頭加上了64byte的資訊,供建立tag之用。bootm指令會首先判斷bootm xxxx 這個指定的位址xxxx是否與-a指定的加載位址相同。

(1)如果不同的話會從這個位址開始提取出這個64byte的頭部,對其進行分析,然後把去掉頭部的核心複制到-a指定的load位址中去運作之

(2)如果相同的話那就讓其原封不同的放在那,但-e指定的入口位址會推後64byte,以跳過這64byte的頭部。

二、好,接着介紹使用mkimage生成鏡像檔案并下載下傳運作的方法。

方法一、

1、首先,用u-boot/tools/mkimage這個工具為你的核心加上u-boot引導所需要的檔案頭,具體做法如下:

[root@localhost tftpboot]#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage zImage.img

Image Name:   linux-2.6.14

Created:      Fri Jan 12 17:14:50 2007

Image Type:   ARM Linux Kernel Image (uncompressed)

Data Size:    1262504 Bytes = 1232.91 kB = 1.20 MB

Load Address: 0x30008000

Entry Point:  0x30008000

這裡解釋一下參數的意義: 

        -A ==&gt; set architecture to 'arch'

        -O ==&gt; set operating system to 'os'

        -T ==&gt; set image type to 'type'

        -C ==&gt; set compression type 'comp'

        -a ==&gt; set load address to 'addr' (hex)

        -e ==&gt; set entry point to 'ep' (hex)

        -n ==&gt; set image name to 'name'

        -d ==&gt; use image data from 'datafile'

        -x ==&gt; set XIP (execute in place)

2 、下載下傳核心 

U-Boot 1.1.3 (Jan 12 2007 - 16:16:36)

U-Boot code: 33F80000 -&gt; 33F9BAC0  BSS: -&gt; 33F9FBAC

RAM Configuration:

Bank #0: 30000000 64 MB

Nor Flash: 512 kB

Nand Flash:  64 MB

In:    serial

Out:   serial

Err:   serial

Hit any key to stop autoboot:  0

sbc2410=&gt;tftp 0x31000000 zImage.img         

TFTP from server 192.168.1.115; our IP address is 192.168.1.128

Filename 'zImage.img'.

Load address: 0x31000000

Loading: #################################################################

        #################################################################

        ####################################################

done

Bytes transferred = 1263324 (1346dc hex) 

3.運作 

sbc2410=&gt;bootm 0x31000000

## Booting image at 31000000 ...

  Image Name:   linun-2.6.14 

  Image Type:   ARM Linux Kernel Image (uncompressed)

  Data Size:    1263260 Bytes =  1.2 MB

  Load Address: 30008000

  Entry Point:  30008000

  Verifying Checksum ... OK

OK

Starting kernel ...

Uncompressing Linux.............................................................Linux version 2.6.14 (root@luofuchong) (gcc version 3.4.1) #21 Fri Oct 20 17:206CPU: ARM920Tid(wb) [41129200] revision 0 (ARMv4T)

Machine: SMDK2410

Memory policy: ECC disabled, Data cache writeback

CPU S3C2410A (id 0x32410002)

S3C2410: core 202.800 MHz, memory 101.400 MHz, peripheral 50.700 MHz

S3C2410 Clocks, (c) 2004 Simtec Electronics

CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on

USB Control, (c) 2006 sbc2410

CPU0: D VIVT write-back cache

CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets

CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets

Built 1 zonelists

Kernel command line: console="ttySAC0" root="/dev/nfs" nfsroot="192".168.1.115:/frien"irq: clearing subpending status 00000002

PID hash table entries: 512 (order: 9, 8192 bytes)

timer tcon="00500000", tcnt a509, tcfg 00000200,00000000, usec 00001e4c

Console: colour dummy device 80x30

Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)

Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)

Memory: 64MB = 64MB total

Memory: 62208KB available (1924K code, 529K data, 108K init)

Mount-cache hash table entries: 512

CPU: Testing write buffer coherency: ok

softlockup thread 0 started up.

NET: Registered protocol family 16

S3C2410: Initialising architecture

SCSI subsystem initialized

usbcore: registered new driver usbfs

usbcore: registered new driver hub

S3C2410 DMA Driver, (c) 2003-2004 Simtec Electronics

DMA channel 0 at c4800000, irq 33

DMA channel 1 at c4800040, irq 34

DMA channel 2 at c4800080, irq 35

DMA channel 3 at c48000c0, irq 36

NetWinder Floating Point Emulator V0.97 (double precision)

devfs: devfs_debug: 0x0

devfs: boot_options: 0x1

yaffs Oct 18 2006 12:39:51 Installing.

Console: switching to colour frame buffer device 30x40

fb0: s3c2410fb frame buffer device

fb1: Virtual frame buffer device, using 1024K of video memory

led driver initialized

s3c2410 buttons successfully loaded

s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2410

s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2410

s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2410

io scheduler noop registered

io scheduler anticipatory registered

io scheduler deadline registered

io scheduler cfq registered

RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize

usbcore: registered new driver ub

Cirrus Logic CS8900A driver for Linux (Modified for SMDK2410)

eth0: CS8900A rev E at 0xe0000300 irq="53", no eeprom , addr: 08: 0:3E:26:0A:5B

S3C24XX NAND Driver, (c) 2004 Simtec Electronics

s3c2410-nand: mapped registers at c4980000

s3c2410-nand: timing: Tacls 10ns, Twrph0 30ns, Twrph1 10ns

NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bi)Scanning device for bad blocks

Bad eraseblock 1884 at 0x01d70000

Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit":

0x00000000-0x00020000 : "vivi"

0x00020000-0x00030000 : "param"

0x00030000-0x00200000 : "kernel"

0x00200000-0x04000000 : "root"

usbmon: debugfs is not available

s3c2410-ohci s3c2410-ohci: S3C24XX OHCI

s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1

s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000

hub 1-0:1.0: USB hub found

hub 1-0:1.0: 2 ports detected

Initializing USB Mass Storage driver...

usbcore: registered new driver usb-storage

USB Mass Storage support registered.

usbcore: registered new driver usbmouse

drivers/usb/input/usbmouse.c: v1.6:USB HID Boot Protocol mouse driver

mice: PS/2 mouse device common for all mice

s3c2410 TouchScreen successfully loaded

UDA1341 audio driver initialized

NET: Registered protocol family 2

IP route cache hash table entries: 1024 (order: 0, 4096 bytes)

TCP established hash table entries: 4096 (order: 2, 16384 bytes)

TCP bind hash table entries: 4096 (order: 2, 16384 bytes)

TCP: Hash tables configured (established 4096 bind 4096)

TCP reno registered

TCP bic registered

NET: Registered protocol family 1

IP-Config: Complete:

     device=eth0, addr="192".168.1.128, mask="255".255.255.0, gw="192".168.1.1,

    host="luofuchong", domain=, nis-domain=(none),

    bootserver="192".168.1.1, rootserver="192".168.1.115, rootpath=

Looking up port of RPC 100003/2 on 192.168.1.115

Looking up port of RPC 100005/1 on 192.168.1.115

VFS: Mounted root (nfs filesystem).

Mounted devfs on /dev

Freeing init memory: 108K

init started:  BusyBox v1.1.3 (2006.09.20-14:52+0000) multi-call binary

Starting pid 696, console /dev/tts/0: '/etc/init.d/rcS'

Please press Enter to activate this console.

方法二、

[root@localhost tftpboot]#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img

Entry Point:  0x30008040

sbc2410=&gt;tftp 0x30008000 zImage.img         

Load address: 0x30008000

sbc2410=&gt;bootm 0x30008000

## Booting image at 30008000 ...

   Image Name:   linux-2.6.14

   Image Type:   ARM Linux Kernel Image (uncompressed)

   Data Size:    1261056 Bytes =  1.2 MB

   Load Address: 30008000

   Entry Point:  30008040

   Verifying Checksum ... OK

   XIP Kernel Image ... OK

繼續閱讀