Welcome 微信登录

首页 / 操作系统 / Linux / 移植Linux-4.7.4到JZ2440开发板

一.编译环境搭建:1.Linux源码下载:https://www.kernel.org/
2.安装交叉编译工具链:
①手动下载配置工具链: (1):解压 arm-linux-gcc-3.4.1.tar.bz2
#tar -jxvf arm-linux-gcc-3.4.1.tar.bz2
解压过程需要一段时间,解压后的文件形成了 ../temp/usr/local/ 文件夹,进入该文件夹,将arm文件夹拷贝到/usr/local/下
# cd usr/local/
#cp -rv arm /usr/local/
现在交叉编译程序集都在/usr/local/arm/3.4.1/bin下面了 (2):修改/etc/profile文件: # vim /etc/profile 增加路径设置,在末尾添加如下,保存/etc/profile文件:
export PATH=$PATH:/usr/local/arm/3.4.1/bin (3):立即使新的环境变量生效,不用重启电脑: 对应方法二:# source /etc/profile (4): 检查是否将路径加入到PATH: # echo $PATH
显示的内容中有/usr/local/arm/bin,说明已经将交叉编译器的路径加入PATH。
(5).测试是否安装成功
# arm-linux-gcc -v

使用crosstoll-ng构建交叉编译工具链:
(1)官网下载:http://crosstool-ng.org/
(2)编译(确认/opt/cross/bin已经安装):./configure --prefix=/opt/cross    : 报错的话缺what装what
make                                  
  make install
    (3)使用crosstool-ng构建交叉编译工具链: 1. 在合适的地方新建一个crosstool-ng工作目录。这个目录将会存储工具链的配置文件,自动下载的文件,构建过程中产生的一些中间文件,最后建立在普通可读写目录:
mkdir -p /home/sheldon/workspace/linux/crosstool
2. 进入前面一步建立的目录:
cd /home/sheldon/workspace/linux/crosstool
3. 执行 ct-ng menuconfig进入配置界面:(找不到执行档就链接一下:sudo ln -s /opt/cross/bin/ct-ng /usr/bin/ct-ng)
ct-ng menuconfig
4.  选择‘Paths and misc options’菜单,激活’  Try features marked as EXPERIMENTAL’选项,这一步很重要。 5.  在‘Paths and misc options’ 菜单下,修改‘Directory containing customsource components’值,设置为你想要最终存放工具链的目录。
(${HOME}/src) Local tarballs directory  # 指定制作编译器所需要的源码包的下载存放,可以修改成任意位置,请注意权限。现在指定到~/src下。
  (/opt/${CT_TARGET}) Prefix directory  # 制作好的编译器所放置的目录 6.  返回主菜单,选择‘Target options’ , [*] Use EABI # 是否实用EABI方式,对某些指令采用异常的方式来处理(如除法指令),建议选中 7.  ‘Target architecture ’选项选择‘ arm’;‘Endianness ’选项选择‘ Little endian’;‘Bitness’选项选择‘32-bit’。Floating point: (software) ---> # 对于很多ARM架构CPU来说是不支持硬浮点运算的,所以选择软件方式有更好的兼容性 8.  返主菜单,选择‘Operating system’(跳过‘Toolchain options’,这里使用缺省选项就够了) 9.  ‘Target OS’选择‘linux’, ‘Linuxkernel version’选项中选择你所使用的内核版本 10. 返回主菜单,选择‘Binary utilities’ 11. 选择你需要的版本,笔者直接选择最高版本(如果需要编译Linaro版本,请先激活‘Show Linaro versions’选项)。 12. 返回主菜单,选择‘C compiler’ 13. 选择你所使用的GCC版本(笔者选择5.1.0,如果需要编译Linaro版本,请先激活‘Show Linaro versions’选项),因为笔者需要使用GCC的一个新特性,所以激活‘Compile libsanitizer’选项,一般情况下,保持缺省值就够了。 14. Toolchain options --->(tonghuix) Tuple"s vendor string # 这里可以修改成你自己的个性化名称,最后会生成形如arm-yourname-linux-gnueabi这样的编译器前缀 15. 其它选项用缺省值,退出并保存配置工具 16. 执行ct-ng build编译工具链
ct-ng build 17. 使用交叉编译器的时候一般是采用arm-tonghuix-linux-gnueabi这样的命令的,但是很多标准Makefile需要实用标准的交叉编译器的名称,一般这个名称是arm-linux-gcc这样的。 那么我们在生成交叉编译器的目录下写一个link.sh脚本,新建一些软链接。 >link.sh#!/bin/shPREFIX=arm-tonghuix-linux-gnueabi-AFTFIX=arm-linux-ln -s ${PREFIX}gcc ${AFTFIX}gccln -s ${PREFIX}addr2line ${AFTFIX}addr2lineln -s${PREFIX}gdbtui ${AFTFIX}gdbtuiln -s${PREFIX}ar ${AFTFIX}arln -s${PREFIX}as ${AFTFIX}asln -s${PREFIX}c++ ${AFTFIX}c++ln -s${PREFIX}c++filt ${AFTFIX}c++filtln -s${PREFIX}cpp ${AFTFIX}cppln -s${PREFIX}g++ ${AFTFIX}g++ln -s${PREFIX}gccbug ${AFTFIX}gccbugln -s${PREFIX}gcj ${AFTFIX}gcjln -s${PREFIX}gcov ${AFTFIX}gcovln -s${PREFIX}gdb ${AFTFIX}gdbln -s${PREFIX}gfortran ${AFTFIX}gfortranln -s${PREFIX}gprof ${AFTFIX}gprofln -s${PREFIX}jcf-dump ${AFTFIX}jcf-dumpln -s${PREFIX}ld ${AFTFIX}ldln -s${PREFIX}ldd ${AFTFIX}lddln -s${PREFIX}nm ${AFTFIX}nmln -s${PREFIX}objcopy ${AFTFIX}objcopyln -s${PREFIX}objdump ${AFTFIX}objdumpln -s${PREFIX}populate ${AFTFIX}populateln -s${PREFIX}ranlib ${AFTFIX}ranlibln -s${PREFIX}readelf ${AFTFIX}readelfln -s${PREFIX}run ${AFTFIX}runln -s${PREFIX}size ${AFTFIX}sizeln -s${PREFIX}strings ${AFTFIX}stringsln -s${PREFIX}strip ${AFTFIX}strip 写完这个link.sh文件以后执行一下: sh link.sh   得到标准名称的交叉编译工具链,可以在makefile中使用类似arm-linux-gcc这样的名称了。 18. 把你的工具链目录设置到$PATH 环境变量: sudo vi /etc/environment 修改PATH的值 PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/sheldon/x-tools/arm-unknown-linux-gnueabi/bin/" . /etc/environment 使生效环境变量

二.编译linux内核:
①清除一下之前的配置:make mrproper
②使用默认配置: make s3c2410_defconfig
③再配置自己的需求:make menuconfig 进入【Device Drivers】---> Memory Technology Device (MTD) support ---> <*>Enable UBI 进入 【File System】---> Miscellaneous filesustems ---> <*>UBIFS file system 进入【Kernel Features】---> [*] Use the ARM EABI to compile the kernel [*] Allow old ABI binaries to run with this kernel (EXPERIMENTAL)  修改./arch/arm/mach-s3c24xx/common-smdk.c中的smdk_default_nand_part[]结构体数组  static struct mtd_partition smdk_default_nand_part[] = { [0] = { .name = "bootloader", .size = SZ_256K, .offset = 0, }, [1] = { .name = "params", .offset = MTDPART_OFS_APPEND, .size = SZ_128K, }, [2] = { .name = "kernel", .offset = MTDPART_OFS_APPEND, .size = SZ_8M, }, [3] = { .name = "rootfs", .offset = MTDPART_OFS_APPEND, .size = MTDPART_SIZ_FULL, } };  修改./arch/arm/mach-s3c24xx/mach-smdk2440.c中的smdk2440_init_time(void)函数  static void __init smdk2440_init_time(void)??? { s3c2440_init_clocks(12000000);//板子的晶振是12M samsung_timer_init(); }  修改makeflie的第255和256行  ARCH?= arm CROSS_COMPILE ?= arm-linux-  最后make uImage,在/arch/arm/boot下生成uImage
三.修改U-boot支持新内核:
启动jz2440,进入ubootset bootargs console=ttySAC0,115200 root=/dev/mtdblock3set bootcmd "nboot 0x32000000 kernel; bootm 0x32000000"set ipaddr 192.168.199.148#根据自己修改set serverip 192.168.199.146#根据自己修改savetftp 0x30000000 uImagenand erasenand write.jffs2 0x30000000 kernel $(filesize)reset如果系统启动成功则会最后显示类似end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-bl,则证明系统启动成功,下面就是制作根文件系统了。


四.制作新根文件系统采用ubifs文件系统:

首先下载busybox,我这里用的版本是1.20.0cd busybox1.20.0make menconfigBusybox Settings -->Build options -->Cross Compiler prefix填arm-linux-Build Options --->[*]Build BusyBox as a static binary (no shared libs)makemake CONFIG_PREFIX=~/2440/ubifs installcd "/home/zzm/arm/opt/FriendlyARM/toolschain/4.4.3/lib"cp *.so.* ~/2440/ubifs/lib -dcd ~/2440/ubifscp -r ~/2440/busybox-1.20.0/examples/bootfloppy/etc ./ vim inittab内容如下:::sysinit:/etc/init.d/rcSconsole::askfirst:-/bin/sh::ctrlaltdel:/bin/umount -a -r::shutdown:/bin/umount -a -rvim fstab内容如下:proc/proc procdefaults0 0tmpfs /tmptmpfs defaults0 0sysfs /syssysfs defaults0 0tmpfs /devtmpfs defaults0 0vim init.d/rcS内容如下:#! /bin/shmount -amkdir /dev/ptsmount -t devpts devpts /dev/ptsecho /sbin/mdev > /proc/sys/kernel/hotplugmdev -scd ~/2440/ubifsmkdir devcd devsudo mknod null c 1 3sudo mknod console c 5 1cd ..mkdir proc mnt tmp sys root homecd ..mkfs.ubifs -r ubifs -m 2048 -e 129024 -c 105 -o fs_jz2440.img#129024*105=13MBvim ubinize.cfg[ubifs]mode=ubiimage=fs_jz2440.imgvol_id=0vol_size=13MiB vol_type=dynamicvol_name=rootvol_flags=autoresizeubinize -o ubi.img -m 2048 -p 128KiB -s 512 ubinize.cfg生成ubi.img最后烧写tftp 0x30000000 ubi.imgnand erase rootnand write.i 0x30000000 root $(filesize)bootargs=console=ttySAC0,115200 ubi.mtd=3 root=ubi0:root rootfstype=ubifsset bootcmd "nboot 0x32000000 kernel; bootm 0x32000000"savereset本文永久更新链接地址