trx和dd-wrt的firmware制作

trx和dd-wrt的firmware制作

早年写的笔记,压箱底了,翻出来晒晒

目          录

trx和dd-wrt的firmware制作...1

dd-wrt的firmware制作步骤...1

step1 制作vmlinuz.1

step2制作squashfsroot file system..2

step3制作trx.2

完整的制作脚本...2

target.squashfs的操作...3

TRX问题...4

 

dd-wrt的firmware制作步骤

在DD WRT中firmware的制作命令是:

../tools/trx -odd-wrt.v24_2.trx ./loader-0.02/loader.gz ../src/router/mipsel-uclibc/vmlinuztarget.squashfs

       从上面的命令可以得知,需要先制作好3个文件:loader.gz,vmlinuz和target.squashfs. loader.gz是系统自带的。

step1 制作vmlinuz

vmlinux是linux编译出来的初次结果。

 

后期处理如下:

 

cp /home/dd-wrt/DD-WRT/src/linux/brcm/linux.v24_2/arch/mips/bcm947xx/compressed/piggymipsel-uclibc/vmlinux

 

../../opt/loader-0.02/lzma e -lc2 -lp2 -pb2-d21 mipsel-uclibc/vmlinux mipsel-uclibc/vmlinuz

 

 

这样就得到vmlinuz。

另外一种方式得到vmlinuz,不过后面并没有使用。

./loader-0.02/lzma e ../src/linux/brcm/linux.v24_2/arch/mips/bcm947xx/compressed/piggyvmlinuz

./loader-0.02/lzma e../src/linux/brcm/linux.v24_2/arch/mips/bcm947xx/compressed/piggy vmlinuzmicro

 

step2制作squashfs root file system

install_mini.v24_2.sh找到下面一句:

../src/linux/brcm/linux.v24_2/scripts/squashfs/mksquashfs-lzma../src/router/mipsel-uclibc/target target.squashfs -noappend -root-owned –le

 

mksquashfs-lzma的命令语法

SYNTAX:./mksquashfs-lzma source1 source2...  dest [options] [-e list of exclude

dirs/files]

 

 

这个说明target.squashfs是用mksquashfs-lzma对/src/router/mipsel-uclibc/target目录下的文件压缩而成的。

 

step3制作trx

../tools/trx -o dd-wrt.v24_2.trx./loader-0.02/loader.gz ../src/router/mipsel-uclibc/vmlinuz target.squashfs

cp dd-wrt.v24_2.trx/GruppenLW/dd-wrt.v24_mini_generic.bin。

 

 

 

所以bin和trx就是同一个东西。

trx的用法

# ./trx

Error [0] : noinput files

usage: trx[options] [-b offset] [file] [-b offset] [-x start] [file] ...

options:

        -h, --help      This message

        -o, --output    Output stream (default stdout)

        -f, --flag      Flags (noheader)

        -b, --offset   Offset of file within output stream or

                        0 for immediately afterthe previous file

        -x, --start             Start of binary (used by USB RDLcode)

 

完整的制作脚本

       如果是烧录到belkin8230上,还需要在文件头前面加上32bytes的pattern。需要使用addpattern命令。

addpattern命令执行后的打印信息是:

# ./addpattern-i dd-wrt.v24_2.trx -o 8230_pt.bin -p W54U

 

---------- addcode pattern --------

input file is[dd-wrt.v24_2.trx]

output file is[8230_pt.bin]

code pattern is[W54U]

 

Makedate==>Year:2009,Month:9,Day:20,Hour:21,Min:31,Sec:42

 

Firmware version=>v4.20.7

利用addpattern生成的bin文件头和以前看到的别的有所不同,但是都是W54U,是可以正常升级的。不同如下图:

 

利用下面的脚本可以生成8230能用的bin文件8230_pt.bin

./mksquashfs-lzma./squashfs-root target.squashfs -noappend -root-owned -le

./trx -odd-wrt.v24_2.trx loader.gz vmlinuz target.squashfs

./addpattern -idd-wrt.v24_2.trx -o 8230_pt.bin -p W54U

 

 

 

 

target.squashfs的操作

       上面已经讲到target.squashfs制作,下面讲讲target.squashfs的解压。有了这两个操作方法,就可以随意修改root filesystem。

       虽然同样是squash-lzma格式,openwrt的mksquashfs-lzma和unsquashfs-lzma和DDWRT的并不一样。所以无法使用openwrt中已经编译好的unsquashfs-lzma来进行解压target.squashfs。DDWRT当中

 

 

打开squashfs-tools/makefile

将all:mksquashfs-lzma unsquashfs 修改为

all: mksquashfs-lzma unsquashfs unsquashfs-lzma

 

另外加上

unsquashfs-lzma: unsquashfs.o

       $(CXX)unsquashfs.o -L$(LZMAPATH) –llzma -lpthread -o $@

这样编译完了就好了。编译好的unsquashfs-lzma可以解压ddwrt的target.squashfs。

 

 

TRX问题

       trx的操作是将几个文件合成,并且加上文件头。在本例中的命令如下:

./trx -o dd-wrt.v24_2.trx loader.gz vmlinuztarget.squashfs

 

比较dd-wrt.v24_2.trx和loader.gz

 

 

前面有一些文件头的差别。

 

在从0x1c到0x9a5处loader.gz就结束了。一共2442bytes

0x1c=280x9a5=2469        2469-28+1=2442

loader.gz大小也是2442bytes

 

对比后面和vmlinuz对比。

从0x9a8到0x9fe69为vmlinuz完全相同的内容。vmlinuz大小为652,482bytes

0x9a8= 2472       0x9fe69=654953

654953 – 2472 +1=652,482

vmlinuz和loader.gz空出了2byte的0x0

 

再对比target.squashfs

 

从0x9fe6c到0x2c96ec为target.squashfs完全相同的内容。target.squashfs大小为2,269,184bytes

0x2c96ec- 0x9fe6c +1=0x229881 = 2267264

 

这个好像不对。

 

在dd-wrt.v24_2.trx中0x 2c96c9是最后一个非0数字,计算看看。

2c96c9- 9fe6c + 1=0x22985e = 2267230

在suqashfs当中,0x 22985d是最后一个非0数字这么算起来,suqashfs的有效长度为0x 0x22985d + 1 = 0x2267230.

 

从写操作可以看出,trx先加入了一个28bytes的文件头,然后在相连的两个文件当中插入两个byte的0x0.

 

疑问:

1.     系统如何识别组合文件

2.     连续两个0x00是否就是文件分割符?其他地方有没有连续的两个0x0.

发现loader.gz有连续的4个0出现。

 

那么系统是根据什么来切分文件的?除了文件头以外,组合文件没有任何其他独立的内容。

 

0x1c在文件头中发现,,这个是第2个文件的开始

0x9a8也在文件头中发现,这个是第2个文件的开始

9fe6c在文件头中发现,这个是第3个文件的开始

 

如果把4bytes作为一个地址来读的话就比较清楚了。

 

用find命令在整个dd-wrt文件夹搜索trx。

 

找到asustrx.c,定义的结构体如下

struct trx_header {

       uint32_tmagic;                  /*"HDR0" */

       uint32_tlen;                /* Length of fileincluding header */

       uint32_tcrc32;                   /* 32-bit CRCfrom flag_version to end of file */

       uint32_tflag_version;  /* 0:15 flags, 16:31version */

       uint32_toffsets[3];      /* Offsets of partitionsfrom start of header */

};

 

#define TRX_MAGIC  0x30524448   /*"HDR0" */

#define TRX_VERSION     1

#define TRX_MAX_LEN    0x3A0000

#define TRX_NO_HEADER      1            /*Do not write TRX header */  

 

第一个是magic。第二个是整个文件的长度,是0x2ca0。第三个是CRC。

 

 

你可能感兴趣的:(trx和dd-wrt的firmware制作)