Quantcast
Channel: CodeSection,代码区,Linux操作系统:Ubuntu_Centos_Debian - CodeSec
Viewing all articles
Browse latest Browse all 11063

移植Linux-4.7.4到JZ2440开发板

$
0
0

一.编译环境搭建:

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


移植Linux-4.7.4到JZ2440开发板

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/sh
PREFIX=arm-tonghuix-linux-gnueabi-
AFTFIX=arm-linux-
ln -s ${PREFIX}gcc ${AFTFIX}gcc
ln -s ${PREFIX}addr2line ${AFTFIX}addr2line
ln -s ${PREFIX}gdbtui ${AFTFIX}gdbtui
ln -s ${PREFIX}ar ${AFTFIX}ar
ln -s ${PREFIX}as ${AFTFIX}as
ln -s ${PREFIX}c++ ${AFTFIX}c++
ln -s ${PREFIX}c++filt ${AFTFIX}c++filt
ln -s ${PREFIX}cpp ${AFTFIX}cpp
ln -s ${PREFIX}g++ ${AFTFIX}g++
ln -s ${PREFIX}gccbug ${AFTFIX}gccbug
ln -s ${PREFIX}gcj ${AFTFIX}gcj
ln -s ${PREFIX}gcov ${AFTFIX}gcov
ln -s ${PREFIX}gdb ${AFTFIX}gdb
ln -s ${PREFIX}gfortran ${AFTFIX}gfortran
ln -s ${PREFIX}gprof ${AFTFIX}gprof
ln -s ${PREFIX}jcf-dump ${AFTFIX}jcf-dump
ln -s ${PREFIX}ld ${AFTFIX}ld
ln -s ${PREFIX}ldd ${AFTFIX}ldd
ln -s ${PREFIX}nm ${AFTFIX}nm
ln -s ${PREFIX}objcopy ${AFTFIX}objcopy
ln -s ${PREFIX}objdump ${AFTFIX}objdump
ln -s ${PREFIX}populate ${AFTFIX}populate
ln -s ${PREFIX}ranlib ${AFTFIX}ranlib
ln -s ${PREFIX}readelf ${AFTFIX}readelf
ln -s ${PREFIX}run ${AFTFIX}run
ln -s ${PREFIX}size ${AFTFIX}size
ln -s ${PREFIX}strings ${AFTFIX}strings
ln -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,进入uboot set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
set bootcmd 'nboot 0x32000000 kernel; bootm 0x32000000'
set ipaddr 192.168.199.148 #根据自己修改
set serverip 192.168.199.146 #根据自己修改
save
tftp 0x30000000 uImage
nand erase
nand write.jffs2 0x30000000 kernel $(filesize)
reset 如果系统启动成功则会最后显示类似end Kernel panic - not syncing: VFS: Una

Viewing all articles
Browse latest Browse all 11063

Trending Articles