I.MX6U嵌入式Linux驱动——系统移植之根文件系统构建

正点原子学习笔记

常用的 ls、mv、ifconfig 等命令其实就是一个个小软件,只是这些软件没有图形界面,而且需要输入命令来运行。这些小软件就保存在根文件系统中。

在Ubuntu中,根文件系统的目录名字为‘/’。在这个目录下,常用的有:
(1)/bin 目录
bin 文件就是可执行文件,一般都是一些命令,比如:ls、mv。
(2)/dev目录
和设备有关的文件。/dev/ttymxc0(I.MX6ULL 根目录会有此文件)就表示 I.MX6ULL 的串口 0,
(3)/etc 目录
存放着各种配置文件。
(4)/lib 目录
存放着 Linux 所必须的库文件。
(5)/mnt 目录
临时挂载目录,一般是空目录,可以在此目录下创建空的子目录,比如/mnt/sd。
(6)/proc 目录
虚拟文件系统,proc 里面的文件都是临时存在的。
(7)/usr 目录( Unix Software Resource)
软件资源目录。
(8)/var 目录
此目录存放一些可以改变的数据。
(9)/sbin 目录
主要用户系统管理。
(10)/sys 目录
系统启动以后此目录作为 sysfs 文件系统的挂载点。
(11)/opt
可选的文件、软件存放区,由用户选择将哪些文件或软件放到此目录中。

1、BusyBox 构建根文件系统

1.1、编译 BusyBox 构建根文件系统

BusyBox 是一个集成了大量的 Linux 命令和工具的软件,像 ls、mv、ifconfig 等命令。
BusyBox 可以在其官网下载到,官网地址为:https://busybox.net/

在Ubuntu下的nfs目录下创建rootfs子目录,将将busybox压缩包放到此子目录中。

tar -vxjf busybox-1.29.0.tar.bz2

1.1.1、修改Makefile,添加编译器

打开 busybox 的顶层 Makefile

//Makefile 代码段
164 CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
......
190 ARCH ?= arm

CORSS_COMPILE 使用了绝对路径!主要是为了防止编译出错!

1.1.2、busybox 中文字符支持

修改 busybox 源码,取消 busybox 对中文显示的限制,打开文件 busybox1.29.0/libbb/printable_string.c,找到函数 printable_string(),主要就是禁止字符大于 0X7F 以后 break 和输出‘?’。

打开文件 busybox-1.29.0/libbb/unicode.c,主要是禁止字符大于 0X7F 的时候设置为‘?’

1.1.3、配置 busybox

(1)使用默认配置

make defconfig

(2)图形化配置

make menuconfig

Location:
-> Settings
-> Build static binary (no shared libs) //不选择“Build static binary (no shared libs)
Location:
-> Settings
-> vi-style line editing commands //选择“vi-style line editing commands
Location:
-> Linux Module Utilities
-> Simplified modutils //取消选中“Simplified modutils”
Location:
-> Linux System Utilities
-> mdev (16 kb) //确保下面的全部选中,默认都是选中的
Location:
-> Settings
-> Support Unicode //选中
-> Check $LC_ALL, $LC_CTYPE and $LANG environment variables //选中

1.1.4、编译 busybox

要将编译结果存放到前面创建的 rootfs 目录中

make
make install CONFIG_PREFIX=/home/zuozhongkai/linux/nfs/rootfs

rootfs 目录下有 bin、sbin 和 usr 这三个目录。

1.2、向根文件系统添加 lib 库

1.2.1、向 rootfs 的“/lib”目录添加库文件

向根文件系统中添加动态库。在rootfs 目录下创建一个名为 “ lib ” 的文件夹。
lib库文件从交叉编译器中获取。我们把交叉编译器放在了“/usr/local/arm/”目录中。进入交叉编译器的/libc/lib目录:

cd /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib
cp *so* *.a /home/yang/linux/nfs/rootfs/lib/ -d      //将此目录下所有的*so*和.a文件都拷贝到 rootfs/lib 目录中,“-d”表示拷贝符号链接

在所拷贝的文件中,有一个库文件比较特殊:ld-linux-armhf.so.3,相当于一个快捷方式,因此要重新复制一遍。
先将先将 rootfs/lib 中的 ld-linux-armhf.so.3 文件删除掉

rm ld-linux-armhf.so.3

重新进入交叉编译器的/libc/lib目录,重新拷贝。

cd /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 /home/yang/linux/nfs/rootfs/lib/ 

进入交叉编译器的/lib目录

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

1.2.2、向 rootfs 的“usr/lib”目录添加库文件

在 rootfs 的 usr 目录下创建一个名为 lib 的目录。

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 /home/zuozhongkai/linux/nfs/rootfs/usr/lib/ -d 

1.3、创建其他文件夹

mkdir dev proc mnt sys tmp root

2、根文件系统初步测试

使用 NFS 挂载。uboot 里面的 bootargs 环境变量会设置“root”的值。

=> setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.217.129:/home/yang/linux/nfs/rootfs,proto=tcp rw ip=192.168.217.120:192.168.217.129:192.168.217.1:255.255.255.0::eth0:off' //设置 bootargs
=> saveenv //保存环境变量
=> boot //启动 Linux 内核

语法解释:
console:两个值,分别为:ttymxc0、115200
root:一个值,/dev/nfs
nfsroot:两个值,分别为:192.168.1.250:/home/yang/linux/nfs/rootfs、proto=tcp
ip:一个值,192.168.1.251:192.168.1.250:192.168.1.1:255.255.255.0::eth0:off

3、完善根文件系统

3.1、在rootfs中创建/etc/init.d/rcS 文件

rcS 是个 shell 脚本,Linux 内核启动以后需要启动一些服务,而 rcS 就是规定启动哪些文件的脚本文件。

1 #!/bin/sh
2 
3 PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
4 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
5 export PATH LD_LIBRARY_PATH
6 
7 mount -a
8 mkdir /dev/pts
9 mount -t devpts devpts /dev/pts
10
11 echo /sbin/mdev > /proc/sys/kernel/hotplug
12 mdev -s
chmod 777 rcS

3.2、创建/etc/fstab 文件

在 rootfs 中创建/etc/fstab 文件,fstab 在 Linux 开机以后自动配置哪些需要自动挂载的分区。

1 #<file system> 	<mount point> 	<type> 		<options> 		<dump> 		<pass>
2 proc 				/proc 			proc 		defaults 		0 			0
3 tmpfs 			/tmp 			tmpfs 		defaults 		0 			0
4 sysfs 			/sys 			sysfs 		defaults 		0 			0

3.3、创建/etc/inittab 文件

inittab 的详细内容可以参考 busybox 下的文件 examples/inittab。

1 #etc/inittab
2 ::sysinit:/etc/init.d/rcS
3 console::askfirst:-/bin/sh
4 ::restart:/sbin/init
5 ::ctrlaltdel:/sbin/reboot
6 ::shutdown:/bin/umount -a -r
7 ::shutdown:/sbin/swapoff -a

4、根文件系统其他功能测试

4.1、软件运行测试

在 ubuntu 下使用 vim 编辑器新建一个 hello.c 文件

1 #include <stdio.h>
2 
3 int main(void)
4 {
5 	while(1) {
6 		printf("hello world!\r\n");
7 		sleep(2);
8 	}
9 	return 0;
10 }
arm-linux-gnueabihf-gcc hello.c -o hello
file hello //查看 hello 的文件类型以及编码格式

将其拷贝到 rootfs/drivers 目录下。

/ # cd /drivers
/drivers # ./hello
/drivers # ps
/drivers # kill -9 进程号
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值