嵌入式驱动开发
基于topeet imx6ull
根文件系统的构建
-
根文件系统是一个可以运行的最小文件系统[^文件系统]。
文件系统: linux文件系统中的文件包括数据和文件的结构,用户和程序能接触到的信息都在里面
-
跟文件系统:内核驱动时候所挂载(mount)的第一个文件系统,之后会把一些初始化脚本和服务加载到内存中去运行
名称 | 功能 |
---|---|
/bin | 系统存放可执行文件的目录,在/bin目录下面可以被root和一般用户使用 |
/dev | 外部设备的文件夹,操作这个文件夹相当于操作对应文件 |
/etc | 主要配置文件 |
/lib | 存放着linux需要的库文件 |
/mnt | 临时挂在目录 |
/opt | 第三方软件放置的目录 |
/proc | 一个虚拟文件系统,存放的数据都在内存中,比如系统核心,状态等 |
/usr | 系统默认的软件下载地点 |
/sbin | root的软件库 |
/var | 存放一些可以改变的数据 |
/sys | 核心与系统硬件相关的信息 |
busybox
一款构建根目录的文件
操作方法menuconfig
-
修改makefile文件
-
164行改为你的路径
CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
-
190 改为arm
ARCH ?= arm
-
-
编译安装
$ make -j4
$ make install
构建根文件系统
编译完成busybox
之后,需要向根文件目录里面添加需要的文件
$ mkdir + name
包括以下目录:dev、etc、lib、mnt、proc、root、sys、tmp
之后需要往对应的文件夹里面添加对应的文件
-
/lib
-
linux程序一般都是需要动态库的,所以向lib里面添加动态库
-
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/taqiyya/2021/busybox/busybox-1.29.0/rootfs/lib/ -d
- 第一行进入了对应的路径
- 第二行是把东西复制到文件夹里面
-
ld-linux-armhf.so.3
在跟文件系统里面不能作为符号链接文件,需要修改为普通文件库-
$ cd ~/2021/busybox/busybox-1.29.0/rootfs/lib/
进入库
$ rm 2021/busybox/busybox-1.29.0/rootfs/lib/ld-linux-armhf.so.3
移除目标文件
$ 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 ~/2021/busybox/busybox-1.29.0/rootfs/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/taqiyya/2021/busybox/busybox-1.29.0/rootfs/lib/ -d
-
-
向/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/taqiyya/2021/busybox/busybox-1.29.0/rootfs/usr/lib -d
添加必要文件
-
添加/etc/init.d/rcS
-
创建文件,在rootfs目录下
$ mkdir -p etc/init.d/
$ cd etc/init.d/
$ vim rcS
-
rcS文件的内容如下
#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib export PATH LD_LIBRARY_PATH mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s `
-
文件内容
- 表示他语言
- 可执行文件可能存在的目录,库文件的目录
- 添加变量
- mount 挂载所有的文件系统,这些文件系统由文件/etc/fsab/指定,所以还要创建对应文件
- 后将devpts 挂载到/dev/pts 目录中
- 使用mdev 来管理热插拔设备,通过这两行,Linux 内核就可以在/dev 目录下自动
创建设备节点。
-
给文件权限
$ chmod 777 rcS
-
-
创建/etc/fstab文件
-
fstab文件是在linux开机以后自动配置那些需要自动挂载的分区
-
语法格式
-
:要挂载的特殊的设备,也可以是块设备,比如/dev/sda 等等。
:挂载点必须为当期已经存在的目录。
:文件系统类型,比如ext2、ext3、proc、romfs、tmpfs 等等。
:挂载选项,用于设置挂载参数,一般使用defaults,也就是默认选项。
defaults:rw, suid, dev, exec, auto, nouser, and async。
auto:系统自动挂载。fstab 默认就是这个选项。
noauto :开机不自动挂载。
nouser:只有超级用户可以挂载。ro:按只读权限挂载。 rw:按可读可写权限挂载。 user:任何用户都可以挂载。
:为1 的话表示允许备份,为0 不备份,一般不备份,因此设置为0。
:磁盘检查设置,为0 表示不检查。根目录‘/’设置为1,其他的都不能设置为1,其他的分
区从2 开始。一般不在fstab 中挂载根目录,因此这里一般设置为0。
-
-
创建文件
$ cd etc/
$ vim fstab
-
文件内容
# /etc/fstab: static file system information. # # Use 'vol_id --uuid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /tmp tmpfs defaults 0 0
-
-
-
创建/etcinittab
- inittab 的详细内容可以参考busybox 下的文件examples/inittab。init 程序会读取/etc/inittab 这个文件,
inittab 由若干条指令组成。每条指令的结构都是一样的,由以“:”分隔的4 个段组成,
<id>:<runlevels>:<action>:<process>
-
标记 意义 登记项标识符,最多四个字符 动作关键字。用于指定init(M)命令或进程对相应进程实施的动作 所要执行的shell 命令.任何合法的shell 语法均适用于该字段 -
action包括
-
创建一个文件/etc/inittab
$ cd etc
$ vim 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
- 注解
- 系统启动以后运行脚本
- 将console作为控制台
- 重启时候运行:/sbin/init
- 按下ctrl+alt+del 组合键的话就运行/sbin/reboot,看来ctrl+alt+del 组合键用于重启系统
- 关机的时候执行/bin/umount,也就是卸载各个文件系统。
- 关机的时候执行/sbin/swapoff,也就是关闭交换分区。
- inittab 的详细内容可以参考busybox 下的文件examples/inittab。init 程序会读取/etc/inittab 这个文件,
生成文件系统镜像
$ sudo tar jcvf rootfs.tar.bz2 bin dev etc lib linuxrc mnt proc root sbin sys tmp usr
压缩命令,把文件压缩,通过filezilla更换掉Mfgtool2对应的文件,然后烧录即可
结果图
经验
- 基本上一次成
- 把rcS打错了,然后用securecrt的时候报错说找不到文件,然后发现文件名错了,重命名之后重新压缩一下就好了