当前位置: 首页 > news >正文

正点原子imx6ull-mini移植文件系统

上一节移植的网络驱动,我去ifconfig eth0 up看并不是SMSC,而是gen PHY,用原子的zImage依旧存在这个问题,所以我暂且认为这并不是我造成的错误。那就接着用通用驱动呗。

一:修改Make file,这都是老演员了,每个工程都会区修改ARCH和CROSS_COMPILE这两个变量

CROSS_COMPILE ?= CROSS_COMPILE ?=/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-ARCH ?= arm

用绝对路径的目的是为了防止编译报错。

二:支持中文的修改,原来的文件默认是支持ASCII的,也就是0~127个字符

2.1:打开文件 /libbb/printable_string.c,找到函数 printable_string,缩减后的函数,其实就是注释掉边界0x7f==127相关代码


const char* FAST_FUNC printable_string(uni_stat_t *stats, const char *str)
{char *dst;const char *s;s = str;while (1) {unsigned char c = *s;if (c == '\0') {/* 99+% of inputs do not need conversion */if (stats) {stats->byte_count = (s - str);stats->unicode_count = (s - str);stats->unicode_width = (s - str);}return str;}if (c < ' ')break;/*if (c >= 0x7f)break;*/s++;}#if ENABLE_UNICODE_SUPPORTdst = unicode_conv_to_printable(stats, str);
#else{char *d = dst = xstrdup(str);while (1) {unsigned char c = *d;if (c == '\0')break;if (c < ' ' )*d = '?';d++;}if (stats) {stats->byte_count = (d - dst);stats->unicode_count = (d - dst);stats->unicode_width = (d - dst);}}
#endifreturn auto_string(dst);
}

2.2:以同样的方式修改/libbb/unicode.c里的unicode_conv_to_printable2

*d++ = (c >= ' ') ? c : '?';
if (c < ' ')

三:图形化配置busybox

3.1:取消选中Build static binary(no shared libs)

3.2:选中 vi-style line editing commands

3.3:取消选中Simplified modutils

3.4:选中mdev (16 kb)

3.5:选中Support Unicode和Check $LC_ALL, $LC_CTYPE and $LANG environment variables

四:编译busybox

make
make install CONFIG_PREFIX=~/linux/nfs/rootfs

五:向根文件系统添加lib库

5.1:在rootfs目录建立lib目录

mkdir lib

5.2:拷贝文件

cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib

5.2.1:此目录下有很多的*so*(*是通配符)和.a 文件,这些就是库文件,将此目录下所有的*so*和.a 文件都拷贝到 rootfs/lib 目录中,拷贝命令如下:

cp *so* *.a ~/linux/nfs/rootfs/lib/ -d

5.2.2:“-d”表示拷贝符号链接,这里有个比较特殊的库文件:ld-linux-armhf.so.3,此库文件也是个符号链接,相当于 Windows 下的快捷方式。会链接到库 ld-2.19-2014.08-1-git.so 上,输 入命令“ls ld-linux-armhf.so.3 -l”查看此文件详细信息

ls ld-linux-armhf.so.3 -l

5.2.3:软连接相当于一个复制品,只知道去哪找本尊,单本身不具有本尊的能力,所以我们要删掉软连接,把本尊(绿色的复制到lib目录下)

cd ~/linux/nfs/rootfs/lib
rm ld-linux-armhf.so.3cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib
cp ld-linux-armhf.so.3 ~/linux/nfs/rootfs/lib/cd ~/linux/nfs/rootfs/lib
ls ld-linux-armhf.so.3

5.2.4:接着进入/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib复制

cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
cp *so* *.a ~/linux/nfs/rootfs/lib/ -dcd ~/linux/nfs/rootfs/lib ; ls

5.3: 向 rootfs 的“usr/lib”目录添加库文件

5.3.1:在usr目录下新建lib目录

5.3.2:拷贝usr内的库文件

cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib
cp *so* *.a ~/linux/nfs/rootfs/usr/lib/ -d

5.3.3: 至此,根文件系统的库文件就全部添加好了,可以使用“du”命令来查看一下 rootfs/lib 和 rootfs/usr/lib 这两个目录的大小,命令如下:

cd ~/linux/nfs/rootfs/
du ./lib ./usr/lib -sh

5.3.4:创建其它目录

mkdir dev;mkdir mnt;mkdir proc;mkdir root;mkdir sys;mkdir tmp;

建议把这个配置好的文件系统拷贝一份,以防万一误操作。

5.4:根文件系统初步测试

5.4.1:配置bootargs

接下来我们使用测试一下前面创建好的根文件系统 rootfs,测试方法就是使用 NFS 挂载uboot 里面的 bootargs 环境变量会设置“root”的值,所以我们将 root 的值改为 NFS 挂载即可。 在 Linux 内核源码里面有相应的文档讲解如何设置,文档为 Documentation/filesystems/nfs/ nfsroot.txt,格式如下:

root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>

根据上面的格式 bootargs 环境变量的 root 值如下:

root=/dev/nfs nfsroot=192.168.1.250:~/linux/nfs/rootfs,proto=tcp rw
ip=192.168.1.251:192.168.1.250:192.168.1.1:255.255.255.0::eth0:off

“proto=tcp”表示使用 TCP 协议,“rw”表示 nfs 挂载的根文件系统为可读可写。启动开发 板,进入 uboot 命令行模式,然后重新设置 bootargs 环境变量,命令如下:

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.31.197:/home/zhulinux/linux/nfs/rootfs,proto=tcp rw ip=192.168.31.190:192.168.31.197:192.168.31.1:255.255.255.0::eth0:off' //设置 bootargs
saveenv //保存环境变量//nfsroot=192.168.31.197 ubuntuIP地址
//ip=192.168.31.190:192.168.31.197:192.168.31.1:255.255.255.0
//依次是 板子IP Ubuntu IP 网口 IP(也就是...1)子网掩码固定的

注意这里的挂载路径要用绝对路径。相对路径我试了出错,挂载不上。

5.4.2 : 完善根文件系统

5.4.2.1:创建/etc/init.d/rcS 文件

rcS 是个 shell 脚本,Linux 内核启动以后需要启动一些服务,而 rcS 就是规定启动哪些文件 的脚本文件。在 rootfs 中创建/etc/init.d/rcS 文件

cd ~/linux/nfs/rootfs
mkdir etc/init.d
touch rcS
gedit rcS
chmod 777 rcS
#!/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATHmount -a
mkdir /dev/pts
mount -t devpts devpts /dev/ptsecho /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
5.4.2.2: 创建/etc/fstab 文件

cd ~/linux/nfs/rootfs/etc
touch fstab
gedit fatab
#<file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0

再次启动linux内核

5.4.2.3:创建/etc/inittab 文件

cd ~/linux/nfs/rootfs/etc
touch inittab
gedit inittab
#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

6:软件运行测试

6.1:交叉编译C程序测试

在Ubuntu下写个c语言小程序

cd ~/linux/nfs/rootfs
mkdir drivers
cd drivers
touch hello.c
gedit hello.c
#include <stdio.h>int main(void)
{while(1) {printf("hello world!\r\n");sleep(2);}return 0;
}

 利用交叉编译器编译成能在ARM架构上运行的程序

arm-linux-gnueabihf-gcc hello.c -o hello

file hello //查看 hello 的文件类型以及编码格式

重启linux内核,在串口中输入

cd /drivers //进入 drivers 目录
./hello //执行 hello

要想 终止 hello 的运行,按下“ctrl+c”组合键即可,“./hello &”就是让 hello 在后台运行

在后台运 行的软件可以使用“kill -9 pid(进程 ID)”命令来关闭掉,首先使用“ps”命令查看要关闭的软 件 PID 是多少,ps 命令用于查看所有当前正在运行的进程,并且会给出进程的 PID。

kill -9 75

6.2: 中文字符测试

在rootfs/drivers中创建一个中文txt文档,再次启动linux内核

6.3:开机自启动测试

测试 hello 软件的时候都是等 Linux 启动进入根文件系统以后手动输入命令 “./hello”来完成的。

进入根文件系统的时候 会运行/etc/init.d/rcS 这个 shell 脚本,因此我们可以在这个脚本里面添加自启动相关内容。

修改rcS脚本

#!/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATHmount -a
mkdir /dev/pts
mount -t devpts devpts /dev/ptsecho /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s#开机自启动
cd /drivers
./hello &
cd /

也就是添加了3行代码

6.4:外网连接测试

网站的连接测试,而是百度、淘宝等这些网站的测试。也 就是说看看我们的开发板能不能上网,能不能和我们的局域网外的这些网站进行通信。测试方 法很简单,就是通过 ping 命令来 ping 一下百度的官网:www.baidu.com。输入如下命令

ping www.baidu.com

可以看出,测试失败,提示 www.baidu.com 是个“bad address”,也就是地址不对,显然我 们的地址是正确的。之所以出现这个错误提示是因为 www.baidu.com 的地址解析失败了,并没 有解析出其对应的 IP 地址。我们需要配置域名解析服务器的 IP 地址,一般域名解析地址可以 设置为所处网络的网关地址,比如 192.168.1.1。也可以设置为 114.114.114.114,这个是运营商 的域名解析服务器地址。 在 rootfs 中新建文件/etc/resolv.conf,然后在里面输入如下内容:

cd ~/linux/nfs/rootfs
cd etc
touch resolv.conf
gedit resolv.conf
nameserver 114.114.114.114 //电信的域名服务器好像
nameserver 192.168.31.1 //自己网关

至此三巨头算结束了

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 视频加密软件哪个好?怎么进行视频文件加密?
  • pyenv-win | python版本管理,无需卸载当前版本
  • 上传文件传参 pc端vue的formData
  • Jenkins集成JDK、git、gitee、maven逐步实现自动拉取,自动部署,自动启动
  • 重塑生态体系 深挖应用场景 萤石诠释AI时代智慧生活新图景
  • 前端练习<HtmlCSS>——照片墙(附完整代码及实现效果)
  • 嵌入式C++、STM32、MySQL、GPS、InfluxDB和MQTT协议数据可视化:智能物流管理系统设计思路流程(附代码示例)
  • hamcrest 断言框架使用示例和优势分析
  • 与Bug较量:Codigger之软件项目体检Software Project HealthCheck来帮忙
  • 【ffmpeg命令入门】视频的旋转与翻转
  • 搭建本地私有知识问答系统:MaxKB + Ollama + Llama3 (wsl网络代理配置、MaxKB-API访问配置)
  • MongoDB多数据源配置与切换
  • Flink 技术与应用(一)
  • 推荐3款将相片变为动漫风格的免费AI工具推荐
  • 设计模式-创建型模式
  • 分享的文章《人生如棋》
  • AHK 中 = 和 == 等比较运算符的用法
  • HashMap ConcurrentHashMap
  • httpie使用详解
  • Java 网络编程(2):UDP 的使用
  • Java多态
  • JDK9: 集成 Jshell 和 Maven 项目.
  • jquery ajax学习笔记
  • MYSQL 的 IF 函数
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 初探 Vue 生命周期和钩子函数
  • 警报:线上事故之CountDownLatch的威力
  • 聊聊redis的数据结构的应用
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 优化 Vue 项目编译文件大小
  • 云大使推广中的常见热门问题
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #13 yum、编译安装与sed命令的使用
  • #Java第九次作业--输入输出流和文件操作
  • #Spring-boot高级
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • $.ajax()
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (10)ATF MMU转换表
  • (C)一些题4
  • (C语言)二分查找 超详细
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (强烈推荐)移动端音视频从零到上手(下)
  • (十六)视图变换 正交投影 透视投影
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)setTimeout 和 setInterval 的区别
  • (转)shell调试方法
  • .equals()到底是什么意思?
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .NET 常见的偏门问题
  • .net 提取注释生成API文档 帮助文档