bluebirdyy 发表于 2006-3-13 16:38:18

对于image.ram和image.rom的菜鸟问题

首先感谢lumit项目组给了我们这些刚接触ARM的新手们一个这么好的学习机会

这里有几个问题想请教一下:

1.在网站上下载arm-elf-tools和uClinux-dist-2004*之后,按照文档,成功地在image/ 下面生成了image.bin linux.test linux.data 和romfs.img,但是没有其它网络上文档中所说的image.rom和image.ram这两个文件.我参考了lumit的user guide,里面说明了这几个文件的关系,而且也讲了怎么得到image.ram
arm-elf-objcopy -O binary -R .note -R .comment -S linux image.ram
但是也没有怎么具体说明怎么得到image.rom

在继续查找网上资料后发现有这样的解决方法:
1、进入linux-2.4.x/arch/armnommu/boot/compressed目录执行
ln -s vmlinux.lds.in linux.lds.in(链接一个编译bzImage需要的文件实际上我的rom版跑出来还有问题,但为了编译还是要这一步)

2、进入linux-2.4.x/arch/armnommu目录,修改config.in里面存储器参数,原为8M DRAM,改为16M。
修改vmlinux-armv.lds.in,在
*(.got) /* Global offset table */ 下加上
romfs_data = .;
romfs.o
romfs_data_end = .;

3、进入linux-2.4.x/drivers/block目录,修改blkmem.c,定义一个
#ifdef CONFIG_BOARD_SNDS100
extern char romfs_data[];
#endif
再在
struct arena_t {
   .........
} arena[] = {后加上

#ifdef CONFIG_BOARD_SNDS100
       {0, romfs_data, -1},
#endif

4、修改uClinux-dist目录下(即总的编译目录)的Makefile,在
TFTPDIR    = /tftpboot 下加一行
LINUXTARGET = bzImage

5、修改vendors/Samsung/4510B/Makefile,原来的
-IMAGE    = $(IMAGEDIR)/image.bin
-ELFIMAGE = $(IMAGEDIR)/image.elf
两行改为
ROMIMAGE = $(IMAGEDIR)/image.rom
RAMIMAGE = $(IMAGEDIR)/image.ram
并取消其中最后连接的命令
                  $(CROSS_COMPILE)objcopy -O binary --remove-section=.romvec    --remove-section=.text --remove-section=.ramvec    --remove-section=.init    --remove-section=.bss --remove-section=.eram    $(ROOTDIR)/$(LINUXDIR)/linux $(IMAGEDIR)/linux.data
$(CROSS_COMPILE)objcopy -O binary --remove-section=.ramvec    --remove-section=.bss --remove-section=.data    --remove-section=.eram    --set-section-flags=.romvec=CONTENTS,ALLOC,LOAD,READONLY,CODE    $(ROOTDIR)/$(LINUXDIR)/linux $(IMAGEDIR)/linux.text
cat $(IMAGEDIR)/linux.text $(IMAGEDIR)/linux.data $(ROMFSIMG) > $(IMAGE)

改为
                  $(CROSS_COMPILE)ld -r -o $(ROOTDIR)/$(LINUXDIR)/romfs.o    -b binary $(ROMFSIMG)
$(CROSS_COMPILE)objcopy -O binary -R .note -R .comment    -S $(ROOTDIR)/$(LINUXDIR)/linux $(RAMIMAGE)

                  cp $(ROOTDIR)/$(LINUXDIR)/arch/armnommu/boot/zImage    $(ROMIMAGE)

上面步骤基本OK了,运行编译过程
make menuconfig   选中芯片4510,库先用uc-libc
make dep            生成依赖关系
make lib_only         编译库
make user_only      编译选中的用户程序
make romfs            生成romfs文件目录   
make image         第一次编译会有错误提示,但先生成了romfs.img,和romfs.o
make                  编译内核并与romfs.o连接成可运行的image.ram、image.rom

注意在 make user_only时如果因boa出错可先不选它,或选用户程序时不选old_password

生成的image.ram文件可以下载到4510板上运行,注意它的波特率是19200。

其中第5步 :
5、修改vendors/Samsung/4510B/Makefile,原来的
-IMAGE    = $(IMAGEDIR)/image.bin
-ELFIMAGE = $(IMAGEDIR)/image.elf
两行改为
ROMIMAGE = $(IMAGEDIR)/image.rom
RAMIMAGE = $(IMAGEDIR)/image.ram
并取消其中最后连接的命令
                  $(CROSS_COMPILE)objcopy -O binary --remove-section=.romvec    --remove-section=.text --remove-section=.ramvec    --remove-section=.init    --remove-section=.bss --remove-section=.eram    $(ROOTDIR)/$(LINUXDIR)/linux $(IMAGEDIR)/linux.data
$(CROSS_COMPILE)objcopy -O binary --remove-section=.ramvec    --remove-section=.bss --remove-section=.data    --remove-section=.eram    --set-section-flags=.romvec=CONTENTS,ALLOC,LOAD,READONLY,CODE    $(ROOTDIR)/$(LINUXDIR)/linux $(IMAGEDIR)/linux.text
cat $(IMAGEDIR)/linux.text $(IMAGEDIR)/linux.data $(ROMFSIMG) > $(IMAGE)

改为
                  $(CROSS_COMPILE)ld -r -o $(ROOTDIR)/$(LINUXDIR)/romfs.o    -b binary $(ROMFSIMG)
$(CROSS_COMPILE)objcopy -O binary -R .note -R .comment    -S $(ROOTDIR)/$(LINUXDIR)/linux $(RAMIMAGE)

                  cp $(ROOTDIR)/$(LINUXDIR)/arch/armnommu/boot/zImage    $(ROMIMAGE)
按照第5步这样修改是否就可以直接得到image.ram和image.rom?
由于 是新手,而且uClinux-dist的时间版本也不一样,所以想先请教一下这样是否可行

2.对于image.ram和image.rom的关系还是不是很清楚.Guide里面说,image.rom就是压缩过image.ram.那么是否说明,这两个文件只要取一个,然后按照你的需要烧到Flash或者SDRAM中去即可呢?

rootlinger 发表于 2006-3-13 16:52:55

image.rom=bootload+iamge.ram

bluebirdyy 发表于 2006-3-13 18:02:50

哦,那是这样么?

    -------------------
FLASH      image.rom
     (bootloader+
     image.ram)
    -------------------
SDRAM
    -------------------

也就是

    -------------------
FLASH    bootloader
    -------------------
SDRAM  image.ram
    -------------------

但是user guide里的原话是:

通常 image.rom 的文件大小要比 image.ram 小很多,这是因为 image.rom 是
一个压缩过的内核,前面加上一个小的解压程序负责把内核解压后搬到指定位置。
这个文件可以直接烧进 flash 中,当然也可以在 ram 中运行。这个文件实际上
就是通常 linux 生成的 zImage 文件。


那就应该不是一个简单的相加关系吧?应该怎么生成这个文件呢?

zswself 发表于 2006-7-31 11:08:42

我照楼主的方法生成了image.ram和image.rom.
image.ram下载到0x8000可以运行。image.rom烧写到flash中后,启动不了,信息如下
Bad Magic Number
这是怎么回事?

rootlinger 发表于 2006-7-31 21:52:35

各位,你们有没有编译ftpd阿?它我编译后,运行,好像需要个用户名和密码,不知道怎么回事啊/

lumit-support-1 发表于 2006-8-2 09:20:30

可以参考一下ftp匿名用户添加的过程
http://www.nschina.com/viewthread.php?tid=4648&extra=page%3D1

rootlinger 发表于 2006-8-2 10:02:29

多谢! :lol:
页: [1]
查看完整版本: 对于image.ram和image.rom的菜鸟问题