Linux内核移植笔记 | 03 - 移植Linux 3.4.2 内核到JZ2440(使用busybox制作根文件系统)

本文主要是介绍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制作根文件系统)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/415295

相关文章

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子