移植Linux到s3c2410上


  刚开始接触Linux移植工作,开始的想法是想将uClinux移植到samsung s3c2410上,以前就知道uClinux是面向没有MMU(内存管理单元)的CPU的操作系统,看了s3c2410的官方资料(PS:全英文的,虽然过了英语六级,还是看得很累,IT行业的英语真TMD重要。谁叫NX的技术都是鸟人搞出来的呢!不仅想起了以前看到的一句话:中国搞的Linux那么多,但是在linux内核里留名的没有一个中国人。也知道s3c2410上的CPU是带MMU单元的。但是观点没转变过来,一根筋地想把s3c2410移植到s3c2410上。baidu了半天也没找到一点线索,只好自己硬着头皮继续做。

  看到linux 2.6的内核支持s3c2410,但是在编译uClinux时,在vendors(买主)里没有s3c2410这款板子。自己天真地将vendors/samsung里的4510B的文件copy一份改为s3c2410。最后编译是以失败告终.

  走投无路,到刚加入的嵌入式群里寻求帮助。高兴的是一位朋友给了我点提示:标准的linux的Linux内核是支持MMU的,而s3c2410是带MMU的。应该把标准的Linux内核移植到s3c2410上而不是移植uClinux,使用标准的Linux功能也更强.

  现在找到了一点曙光,人特别兴奋,也忒有干劲。下载arm-linux-交叉编译工具,由于以前升级时的内核2.6.18.2还在,所以准备将linux-2.6.18.2移植到s3c2410上。

  内核下载地址:www.kernel.org
  交叉编译工具:ftp://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2

  在网上搜集了一些资料,仔细看那些前辈的操作,看了s3c2410的官方资料。重新干活。

  将windows下的盘符挂载过来(还好我是双系统windows&linux,搞平台移植非常好的条件)。直接在这个盘符下进行交叉编译。

  #mount -t vfat -o iocharset=utf8 /dev/hda7 /mnt/hda7

  将arm-linux-gcc放到/下,#tar -xvjf arm-linux-gcc-3.4.1.tar.bz2 /*交叉编译工具将解压安装到/usr/local/arm下。

  修改环境变量:#echo "export PATH=/usr/local/arm/3.4.1/bin:$PATH" >> /etc/bashrc

  #cd /mnt/hda7/linux_softkernel_update/linux-2.6.18.2

  修改makefile文件:将相应体系结构和交叉编译工具改为:

  ARCH ?= arm
  CROSS_COMPILE ?=arm-linux-
  #cp arch/arm/configs/s3c2410_defconfig .config
  # make ARCH=arm CROSS_COMPILE=arm-linux- zImage

  结果提示错误:

  CHK include/linux/version.h
  SYMLINK include/asm-arm/arch -> include/asm-arm/arch-s3c2410
  ln: 正在创建连至‘arch-s3c2410’的符号链接‘include/asm-arm/arch’: 不允许的操作
  make: *** [include/asm-arm/.arch] 错误 1

  从错误提示上看,知道是符号链接不允许,不解,删掉以前的所有编译和配置:#make distclean ,重复昨天的操作。昏,错误提示仍在。以为是源程序被我改了.

  重新解压内核到root目录下:#cd /root/ARM/linux-2.6.18.2

  修改改目录下的Makefile文件,将相应体系结构和交叉编译工具改为:

  ARCH ?= arm
  CROSS_COMPILE ?=arm-linux-
  # make ARCH=arm CROSS_COMPILE=arm-linux- uImage //用u_boot引导的映象文件

  一堆鸟文闪过,哈哈,熟悉的编译内核的过程出现在眼前。终于编译成功了!

  #cd arch/arm/boot
  #ls

  看到编译后得到的映象文件(工作结果)zImage和Image,欣喜若狂。再回首之前碰到的问题:为什么在/root下能编译成功,而在/mnt/hda7下会出现创建符号链接错误呢?回想起以前看APUE(Advanced Programe in Unix Environment)时关于链接的知识。原来是符号链接不能跨分区的。

  Append.tips:

  ◎arch/arm/boot/compressed下的内核vmlinux就是Image,经过压缩成piggy.gz,再生成piggy.o与解压缩程序链接后生成内核zImage。

  ◎内核解压缩的过程是从ZTEXTADDR出的压缩内核中解压出vmlinux到zreladdr。ZTEXTADDR表示压缩内核加载的位置,zreladdr表示压缩后的位置。

  ◎ZTEXTADDR、ZBSSADDR是解压缩程序的代码锻、BSS段的地址。2.6内核通过CONFIG_ZBOOT_ROM_TEXT和CONFIG_ZBOOT_ROM_BSS两个参数来设置,2.4内核则在arch/$(arch)/boot/Makefile中设置。通常ZTEXTADDR设置成0x30008000,ZBSSADDR设置成空,表示紧接在前面一个段后面。

  ◎zreladdr、initrd_phys、params_phys三个变量只有在2.6内核中才有,分别表示:解压后的内核地址、initrd地址、参数表地址。通过在arch/$(arch)/$(machine)/Makefile.boot的zreladdr-y、initrd_phys-y、params_phys-y数来指定这三个变量的值。

  在编译power manager 时出现了一个警告:

  kernel/power/pm.c:206: warning: `pm_send_all' is deprecated (declared at kernel/power/pm.c:180)

相关内容