Linux学习 :移植linux-3.4.83到JZ2440开发板
一.编译环境搭建:
1.linux源码下载:https://www.kernel.org/ (最新) https://mirrors.edge.kernel.org/pub/linux/kernel/ (历史版本)
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/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
②修改Makefile如下:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
③使用默认配置: 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_map_io(void)函数
static void __init smdk2440_map_io(void) { s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc)); //s3c24xx_init_clocks(16934400); s3c24xx_init_clocks(12000000); //修改为JZ2440的晶振频率:12M s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs)); }
最后make uImage,在/arch/arm/boot下生成uImage
三.修改U-boot支持新内核:
启动jz2440,进入uboot
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
set bootcmd 'nand read 30000000 kernel;bootm 30000000'
set ipaddr 192.168.1.17 #根据自己修改
set serverip 192.168.1.123 #根据自己修改
save
tftp 0x30000000 uImage
nand erase.part kernel
nand write.i 0x30000000 kernel $filesize
reset
如果系统启动成功则会最后显示类似end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-bl,则证明系统启动成功,下面就是制作根文件系统了。
四.制作新根文件系统采用ubifs文件系统:
首先下载busybox,我这里用的版本是1.20.0
cd busybox1.20.0
make menconfig
Busybox Settings -->
Build options -->
Cross Compiler prefix
填arm-linux-
Build Options --->
[*]Build BusyBox as a static binary (no shared libs)
make (sync 和 nsenter 有些问题,去掉没编)
make CONFIG_PREFIX=/home/sheldon/workspace/mount/busybox-1.28.1/out_ubifs install
cp /home/sheldon/workspace/tool/opt/FriendlyARM/toolschain/4.4.3/lib/*.so.* /home/sheldon/workspace/mount/busybox-1.28.1/out_ubifs -d
cp -r /home/sheldon/workspace/mount/busybox-1.28.1/examples/bootfloppy/etc /home/sheldon/workspace/mount/busybox-1.28.1/out_ubifs
vi etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
::shutdown:/bin/umount -a -r
vi etc/fstab
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
vi etc/init.d/rcS
#! /bin/sh mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s
cd /home/sheldon/workspace/mount/busybox-1.28.1/out_ubifs
mkdir dev
cd dev
sudo mknod null c 1 3
sudo mknod console c 5 1
cd ..
mkdir proc mnt tmp sys root home
cd ..
mkfs.ubifs -r out_ubifs -m 2048 -e 129024 -c 2044 -o fs_jz2440.img
#129024*2044=251MB PS: mkfs.ubifs源码编译指令:make WITHOUT_XATTR=1
vim ubinize.cfg
cd /home/sheldon/workspace/mount/busybox-1.28.1/out_ubifs
mkdir dev
cd dev
sudo mknod null c 1 3
sudo mknod console c 5 1
cd ..
mkdir proc mnt tmp sys root home
cd ..
mkfs.ubifs -r out_ubifs -m 2048 -e 129024 -c 2044 -o fs_jz2440.img
#129024*2044=251MB PS: mkfs.ubifs源码编译指令:make WITHOUT_XATTR=1
vim ubinize.cfg
[ubifs] mode=ubi image=fs_jz2440.img vol_id=0 vol_size=10MiB # >= 编译生成文件系统大小 vol_type=dynamic vol_name=rootfs vol_flags=autoresize
ubinize -o ubi.img -m 2048 -p 128KiB -s 512 ubinize.cfg
生成ubi.img
ubinize -o ubi.img -m 2048 -p 128KiB -s 512 ubinize.cfg
生成ubi.img
ubinize -o ubi.img -m 2048 -p 128KiB -s 512 ubinize.cfg
生成ubi.img
最后烧写:
tftp 0x30000000 ubi.img
nand erase.part rootfs
nand write.i 0x30000000 rootfs $filesize
修改# bootargs=console=ttySAC0,115200 root=/dev/mtdblock3 init=/linuxrc rootfstype=yaffs2
set bootargs console=ttySAC0,115200 ubi.mtd=3 root=ubi0:rootfs rootfstype=ubifs
save
reset
-end-
posted on 2016-09-18 17:07 sheldon_blogs 阅读(3958) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY