本文主要是介绍Linux内核移植笔记 | 03 - 移植Linux 3.4.2 内核到JZ2440(使用busybox制作根文件系统),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
制作好的文件系统项目开源地址:https://github.com/Mculover666/rootfs-jz2440。
1. 编译安装busybox
系统环境:
- ubuntu 18.04 64bit
- arm-linux-gcc 4.4.3
1.1. 下载
官网下载挺快的:https://busybox.net/。
此处使用1.20.2
版本,在下载页面的最下面。
下载完成之后解压出来:
tar -jxf busybox-1.20.2.tar.bz2
经过编译测试:
- 1.20.2版本编译通过
- 1.27.2版本编译失败
- 1.30.1版本编译失败
1.2. 配置编译
busybox编译之前需要设置编译工具链:
cd busybox-1.20.2/
make menuconfig
进入配置项 Busybox Settings:
进入 Build Options :
找到Cross compiler prefix (交叉编译器前缀)并修改为arm-linux-
:
退出并保存,配置完成。
1.3. 编译
make
编译成功之后,开始使用busybox制作根文件系统。
2. 制作根文件系统
制作根文件系统映像文件,其实就是将我们上一节制作好的目录中的所有内容,按照一定的格式存放到一个文件中,这个文件可以直接烧写到存储器上,当系统启动后挂接这个设备,就可以读取到与原来目录一样的内容。
2.1. 安装busybox
首先新建一个安装目录 fs_mini_mdev_test 用于安装busybox,然后使用 CONFIG_PREFIX
环境变量指定该目录进行安装:
make install CONFIG_PREFIX=/home/ubuntu/busybox/fs_mini_mdev_test
安装完成之后,在安装目录中就有了基本命令的目录,如图:
2.2. 安装库
2.2.1. 寻找编译器库
首先找到交叉编辑器所在位置:
echo $PATH
然后进入到该目录:
cd /usr/arm-linux-toolchains4.4.3/bin
cd ..
寻找交叉编译器所使用的库文件:
find -name lib
找到了这5个库,接着来sys-root这两个库里都有哪些文件:
./arm-none-linux-gnueabi/sys-root/usr/lib
./arm-none-linux-gnueabi/sys-root/lib
2.2.2. 复制库文件
拷贝 sys-root/lib 库文件:
cd ~
mkdir /home/ubuntu/busybox/fs_mini_mdev_test/lib
cp -d /usr/arm-linux-toolchains4.4.3/arm-none-linux-gnueabi/sys-root/lib/*so* /home/ubuntu/busybox/fs_mini_mdev_test/lib/
接着再拷贝sys-root/usr/lib 库里的文件:
cd ~
mkdir /home/ubuntu/busybox/fs_mini_mdev_test/usr/lib
cp -d /usr/arm-linux-toolchains4.4.3/arm-none-linux-gnueabi/sys-root/usr/lib/*so* /home/ubuntu/busybox/fs_mini_mdev_test/usr/lib/
2.3. 构建etc目录
etc目录下的内容取决于要运行的程序,本教程中只创建三个文件:
- etc/inittab
- etc/init.d/rcS
- etc/fsttab
其中,init进程将根据inittab文件来创建其它子进程,比如调用脚本文件配置ip地址、挂接其它文件系统等,最后启动shell。
- ① 创建etc/inittab文件
仿照Busybox中example下的inittab文件内容,在fs_mini_mdev_test/目录下,创建etc目录,再进入目录创建一个inittab文件,编辑以下内容:
# /etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
- ② 创建etc/init.d/rcS文件
在etc目录下创建该文件,这是一个脚本文件,可以在里面添加需要自动执行的命令,编辑以下内容:
#!/bin/sh
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
再加上可执行权限,否则启动时会提示没有权限:
sudo chmod +x init.d/rcS
暂时不支持网卡,不配置ip。
- ③ 创建etc/fstab文件
该文件中的内容表示执行mount -a 命令后要挂载的文件系统,内容如下:
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
2.4. 构建dev目录
init 进程要用到两个设备文件,建立:
cd fs_mini_mdev_test/
mkdir dev
cd dev
sudo mknod console c 5 1
sudo mknod null c 1 3
2.5. 创建其它目录
其它目录可以是空目录,创建命令如下:
cd fs_mini_mdev_test/
mkdir proc mnt tmp sys root
3. 制作jffs2映像文件
接下来需要将制作好的根文件系统目录 fs_mini_mdev_test 制作为一个文件系统映像,因为Linux内核目前还没有配置支持yaffs2,所以使用jffs2来测试。
3.1. 安装mtd-utils工具
sudo apt-get install mtd-utils
3.2. 制作jffs2文件系统
首先确保在文件目录的上一级:
执行制作命令:
mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_test -o fs_mini_mdev_test.jffs2
这些参数的意思为:
-n
:不要在每个擦除块上都加上清除标志;-s 2048
:指明一页大小为2048字节;-e 128KiB
:指明一个擦除扇区大小为128KB;-d fs_mini_mdev_test
:指定要打包的根文件系统目录;-o fs_mini_mdev_test.jffs2
:指明输出的映像文件名称;
制作完成:
3.3. 烧写测试
参考教程:uboot研读笔记 | 10 - 移植uboot 2012.04到JZ2440(烧写Linux内核、烧写yaffs2文件系统)。
将该文件系统映像下载到windows主机中,存放到TFTP服务器目录,然后在开发板中使用uboot烧录nand flash中:
tftp 30000000 fs_mini_mdev_test.jffs2
nand erase.part filesystem
nand write.jffs2 30000000 260000 678c24
然后设置环境变量:
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
saveenv
重启开发板,测试是否可以挂载成功:
reset
3.4. 解决问题
这个问题是因为编译器编译时使用了eabi接口(Embedded Application Binary Interface,嵌入式应用二进制接口),但是内核中没有开启配置,所以内核提示这是非法指令。
解决方案就是:在内核中配置支持该接口。
进入内核目录:
make menuconfig
进入 Kernel Features :
选中图中这一项即可:
然后退出,保存设置,重新编译内核:
make uImage
编译成功后,内核大小为2361KB,超过划分的2MB分区,所以不能烧写到nand flash中,直接使用tftp下载到内存中运行,后续文章中裁剪内核<2MB之后才能烧写到nand flash中!
重新烧写内核,启动进行测试:
tftp 30000000 uImage
bootm 30000000
启动之后,可以看到Linux内核启动成功,根文件系统挂载成功,成功进入Linux命令行:
接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。
这篇关于Linux内核移植笔记 | 03 - 移植Linux 3.4.2 内核到JZ2440(使用busybox制作根文件系统)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!