Linux 커널 이미지를 백업하는 방법

Linux 커널 이미지를 백업하는 방법

마더보드는 NAND 플래시 장치인 NAND 32MiB에서 임베디드 Linux v2.6.26.5를 실행하는 ARM926EJ CPU를 사용합니다. Linux는 NAND 장치의 MTD 파티션에 있습니다.

직렬 인터페이스에서 Linux 커널 이미지(SP2Xcybertan_rom_bin)를 백업하는 방법은 무엇입니까? tftp를 통해 보드에서 호스트 PC로 파일을 전송하는 TFTP 옵션이 없기 때문입니다. 낸드를 일부 메모리 주소로 읽고 출력을 터미널에 덤프하고 저장한 다음 16진수를 이진수로 변환할 수 있습니다.

nand read 0x20000000  0x80000  0x0017FF80
md.b 0x20000000 0x0017FF80

부팅 프로세스 로그에서:

U-Boot 2009.03 (Oct 06 2011 - 20:04:03)

Stack:->21F1EC74 U-Boot code: 21FC4D00->21FF9454  BSS:->21FFFF3B
CPU: PNX8181-2B OM6xxx-ARM926EJ-S(ARMv5TEJ) @ 221MHz(armclk), 110MHz(hclk)
Board: Vega_PNX8181_BaseStation Platform IV (LC)
I2C:   ready
RAM Configuration:
Bank #0: 20000000 32 MB
NAND:  32 MiB
In:    serial
Out:   serial
Err:   serial
Use Full Image's Kernel
Net:   VLAN Mode
L2 switch present
ETN1
Hit any key to stop autoboot:  0 

Loading from NAND 32MiB 3,3V 8-bit, offset 0x80000
   Image Name:   SP2Xcybertan_rom_bin
   Created:      1970-01-01   0:00:-1 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    1572736 Bytes =  1.5 MB
   Load Address: 20008000
   Entry Point:  20008000
## Booting kernel from Legacy Image at 20200000 ...
   Image Name:   SP2Xcybertan_rom_bin
   Created:      1970-01-01   0:00:-1 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    1572736 Bytes =  1.5 MB
   Load Address: 20008000
   Entry Point:  20008000
   Verifying Checksum ... OK
   Loading Kernel Image ... OK
OK

Starting kernel ...
Uncompressing Linux.........

환경 변수

firetux # printenv
baudrate=115200
ethaddr=FF:FF:FF:FF:FF:FF
netmask=255.255.255.0
ipaddr=192.168.1.1
serverip=192.168.1.100
bootfile=firetux.kernel
bootcmd1=setenv bootargs ${bootargs} && nboot 0x20200000 0 ${image_addr} && bootm 0x20200000
bootcmd2=setenv bootargs ${bootargs} && tftpboot 20200000 firetux.kernel && bootm 20200000
phymode=auto
mtdids=nand0=gen_nand
unlock=yes
verify=y
update.uboot=echo Update u-boot && tftpboot 0x20000000 nandboot.flash && nand erase 0x0 0x03ffff && nand write.jffs2 0x20000000 0x0 ${filesize}
update.kernel=echo Update kernel && tftpboot 0x20000000 uImage && nand erase 0x80000 0x180000 && nand write.jffs2 20000000 0x80000 0x180000
update.romimg=echo Update RomImage && tftpboot 0x20000000 romimage.img && nand erase 0x80000 0x13e0000&& nand write.jffs2 20000000 0x80000 ${filesize}
update.halfimg=echo Update HalfImage && tftpboot 0x20000000 recovery.img && nand erase 0x1460000 0x700000&& nand write.jffs2 20000000 0x1460000 ${filesize}
eraseenv=echo Erase Environment && nand erase 0x60000 0x20000
HwModel=Hw_Model=SPA122
bootcmd=run bootcmd1
halfImage=half_image=0
cy_boot_code_ver=1.0.1 (Oct  6 2011 - 20:04:00)
RouterMode=Router_Mode=0
stdin=serial
stdout=serial
stderr=serial
bootcmd=run bootcmd1
image_addr=0x80000
bootargs=console=ttyS1,115200n8 rootfstype=squashfs noalign half_image=0 verify=y Hw_Model=SPA122 Router_Mode=0
ethact=ETN1
bootdelay=3 

부팅 프로세스 측면에서 커널(uImage)과 romimage(romimg.img)의 차이점은 무엇입니까?

답변1

이를 수행하는 단계는 다음과 같습니다.

먼저 uImage 업데이트가 정확하다고 가정합니다.

update.kernel=echo Update kernel && tftpboot 0x20000000 uImage && nand erase 0x80000 0x180000 && nand write.jffs2 20000000 0x80000 0x180000

그 다음에:

nand read <memory offset> <nand start offset> <size>
md <memory offset> <size>

그래서:

nand read 0x20000000 0x80000 0x180000
md 0x20000000 0x180000

그런 다음 일련 번호에 대한 입력을 기록하고 이를 스크립트로 구문 분석하여 16진수 바이트를 가져와 이진 형식으로 파일에 출력하는 방법을 찾아야 합니다.

관련 정보