| 在S3C4510B评估板上移植uclinux-20030305全过程 |
| 类别:嵌入式系统 |
|                         作者 liber来自: 北京      --------------------------------------------------------------------------------跟踪3天反汇编代码,终于将uclinux-20030305在S3C4510B-p.htm" target="_blank" title="S3C4510B货源和PDF资料">S3C4510B-p.htm" target="_blank" title="S3C4510B-p.htm" target="_blank" title="S3C4510B货源和PDF资料">S3C4510B货源和PDF资料">S3C4510B-p.htm" target="_blank" title="S3C4510B货源和PDF资料">S3C4510B的板子上跑了起来,现将移植的全过程写出来,与大家分享      一、下载所需工具、压缩包      uClinux-dist-20030305.tar.gz(http://www.uclinux.org/)      arm-elf-tools-20030314.sh      二、要修改的文件列表:      1. ../linux-2.4.x/arch/armnommu/mach-snds100/arch.c      MACHINE_START(SAMSUNG-p.htm" target="_blank" title="SAMSUNG货源和PDF资料">SAMSUNG, "SNDS100")-〉MACHINE_START(SNDS100, "SNDS100")      [说明]这个文件的错误是旧版的遗迹,以前的版本对于4510b使用统一的标识samsung但是由于最新版新加入了对samsung其他板子的支持,所以,修改了这一标识,对于s3c4510b改用snds100,但是这一修改在这个版本中并没有完全统一起来,这也是多处错误的根本原因。      2. ../linux-2.4.x/arch/armnommu/config.in      在if [ "$CONFIG_BOARD_SNDS100" = "y" ]项中添加:      define_bool CONFIG_CPU_S3C4510 y      [说明]在这个配置文件中,CONFIG_BOARD_SNDS100一项居然少了cpu类型定义,对比其他项就会发现这一问题,该项在armnommu/kernel/head-armv.S中用到。      3. ../linux-2.4.x/arch/armnommu/mach-snds100/Makefile      O_TARGET := samsung.o ->O_TARGET := snds100.o      [说明]这个makefile的修改是为了和1保持一致,再make的过程中,使用snds100标识链接文件。      4. ../linux-2.4.x/arch/armnommu/kernel/head-armv.S      #if defined(CONFIG_ARCH_SAMSUNG-p.htm" target="_blank" title="SAMSUNG货源和PDF资料">SAMSUNG) && defined(CONFIG_CPU_ARM710) ->      #if defined(CONFIG_CPU_S3C3410) || defined(CONFIG_CPU_S3C4530)      [说明]这里也是由于samsung和snds100使用环乱造成的,如果不修改,之后的一段程序将被预编译,会出现LC0重定义的错误,因为此前的snds100已经声明LC0,实际上之后的程序时不应该被预编译的,那些是3410和4530专用的。      5. /Makefile      TFTPDIR = /tftpboot后加上:      LINUXTARGET=bzImage      # normal make targets 中加入:      .PHONY: images      images:      $(MAKE) -C $(VENDDIR) images      all: subdirs romfs modules modules_install image linux 后加入 images      [说明]这里的修改,和6的第一条是为了生成压缩的rom映像文件和ramf可执行的bin文件。      6. /vendors/Samsung/4510B/Makefile      最后加入:      images:      arm-elf-objcopy -O binary -R .note -R .comment -S $(ROOTDIR)/$(LINUXDIR)/linux $(IMAGEDIR)/uclinux_ram.bin      cp $(ROOTDIR)/$(LINUXDIR)/arch/armnommu/boot/zImage $(IMAGEDIR)/uclinux_rom.bin      同时注释掉:$(CROSS_COMPILE)objcopy …… 部分      在 genromfs -v -V "ROMdisk" -f $(ROMFSIMG) -d $(ROMFSDIR) 后加入(这里生成romfs.o):      arm-elf-ld -r -o $(ROOTDIR)/$(LINUXDIR)/romfs.o -b binary $(ROMFSIMG)      [说明]第一条是5的延续,第二条是生成romfs.o文件,以备后用。      7. ../linux-2.4.x /arch/armnommu/boot/compressed/Makefile      找到$(LD) $(ZLDFLAGS) $(HEAD) $(OBJS) piggy.o -o $(LINUX) 改为:      $(LD) $(ZLDFLAGS) $(HEAD) $(OBJS) piggy.o $(LIBGCC) -o $(LINUX)      [说明]生成linux kernel,包含必要的库支持,$(LIBGCC)来自于arm-elf-tools库。      找到ZLDFLAGS = -p -X -T $(LINUX).lds改为:      ZLDFLAGS = -p -X -T vmlinux.lds      [说明]这各链接文件是为带mmu的板子准备的,生成带自解压的映像文件,由$(LINUX)控制,这里我们直接使用,也可以直接将这个链接文件改名为linux.lds.      8. ../linux-2.4.x /arch/armnommu/vmlinux-armv.lds.in      找到 *(.got) /* Global offset table */      在其后加入:      romfs_data = .;      romfs.o      romfs_data_end = .;      在这里注意格式,这三句话之前后缩进;      [说明]在这个连接文件中将romfs.o连接到.text section中。      9. ../linux-2.4.x/arch/armnommu/mm/proc-arm6,7.S      mov r0, #0      #ifdef CONFIG_CPU_WITH_CACHE 改为:      #ifdef CONFIG_CPU_WITH_CACHE      mov r0, #0      [说明]这里可能是careless的错误,对比旧版就可以理解。      10. ../linux-2.4.x /drivers/block/blkmem.c      /*      * Please, configure the ROMFS for your system here      */      /*S3C4510b */      #ifdef CONFIG_ARCH_SAMSUNG-p.htm" target="_blank" title="SAMSUNG货源和PDF资料">SAMSUNG      extern char romfs_data[];      extern char romfs_data_end[];      #endif      找到:      arena[] = { 加入:      #ifdef CONFIG_ARCH_SAMSUNG-p.htm" target="_blank" title="SAMSUNG货源和PDF资料">SAMSUNG      {0, romfs_data, -1},      #endif      [说明]这里象0927版一样少了针对samsung 的rom代码,同时也是为了和10保持一致。      11. /arch/armnommu/tools/mach-types      snds100 ARCH_SNDS100 SNDS100 90改为:      snds100 BOARD_SNDS100 SNDS100 90      [说明]这应该是最先该的一个错误,在0305版中使用的是BOARD_SNDS100而该文件中继续沿用以前的格式ARCH_*,这个问题会导致arch_setup()的时候产生内存溢出错误。      三、编译过程      1.make config(menuconfig/xconfig)      选择Samsung/4510B linux-2.4.x uC-libc 其他各项根据需要配置      2.make dep      3.make lib_only      4.make user_only      5.make romfs      6.make image      7.make      ok在imges文件夹得到uclinux_ram.bin和uclinux_rom.bin如果有调试器可直接将前者烧入sdram中运行,后者烧进flash中运行,hoho马上你就可以看到熟悉的启动画面。 [补]      生成的uclinux_rom.bin烧写在flash中,上电复位时,从rom开始执行(compressed/head.S),先将rom中的映像文件拷进ram,然后是地址重定位,重定位之后ram位于0x0,而rom位于0x1000000,之后从0x8000开始执行初始化,之后是start_kernel() ... ...                |
- AT89C51单片..
- 2008-1-17
- AT89C51单片..
- 2008-1-17
- 嵌入式电脑控制系统..
- 2008-1-17
- 基于嵌入式技术的网..
- 2008-1-2
- 威达电P4嵌入式平..
- 2007-12-27
- NORCO硬件平台..
- 2007-12-27
- UGM 嵌入式影像..
- 2007-12-20
- 嵌入式系统设计的核..
- 2007-12-17
- 发展基于嵌入式计算..
- 2007-12-10
- 基于RT-Linu..
- 2007-11-15
- 嵌入式实时操作系统..
- 2007-11-12
- 基于RT-Linu..
- 2007-11-1
- Windows 9..
- 2007-8-9
- 一种新型编码芯片及..
- 2007-8-9
- 把网络引进嵌入式控..
- 2007-8-9
- Windows N..
- 2007-7-29
- 嵌入式系统的开发利..
- 2007-7-29
- 基于驱动程序的协议..
- 2007-7-29
- 具有DSP功能的1..
- 2007-8-9
- 微控制器的抗干扰软..
- 2007-8-9



