从两个角度来理解根文件系统的作用
运行用户应用程序
以目录+文件名的方式访问块存储设备
应用程序存在根文件系统中
从无到有在 ARM 开发板中搭建 linux 系统需要三个部分
- uboot:启动内核
- 内核:启动应用程序
- 根文件系统:被内核挂载、存放应用程序
那么如何理解应用程序?
类比在 ubuntu 中如何编写打印 “hello world” 应用程序
- 创建hello.c,编写如下代码
#include <stdio.h>
int main(void)
{
printf("hello world\n");
return 0;
}
- 使用命令 gcc -o hello hello.c 编译生成 hello 应用程序
- 在命令行中输入 ./hello 运行 hello 这个应用程序,控制台就会显示 hello world
# gcc -o hello hello.c
#./hello
hello world
同样的原理,如何在 ARM 开发板中运行上述的应用程序呢?
- 在 ubuntu 虚拟机中,假设已经安装好交叉编译环境(在 ubuntu 环境中生成在 ARM 平台上运行的程序)。使用命令 arm-linux-gcc -o hello hello.c 编译生成适合在开发板中运行的 hello 应用程序
- 将 hello 应用程序保存在根文件系统 app 文件夹中,并烧录到存储设备中去。调试好开发板和电脑之间的串口通信。开发板启动完毕后,在串口控制台输入 ./hello 运行应用程序。
/ # ls //根文件系统目录 ‘/’ 表示根目录
app etc linuxrc sbin usr
bin hello lost+found sys var
dev lib proc tmp
/ # cd app // 进入到 app 文件夹中
/app # ls
hello hello.c
/app # ./hello // 在串口控制台运行 hello
hello world // 运行结果,说明可以正常运行
其次,我们在串口控制台中运行的 shell 命令集本质也是应用程序,譬如 ls、cp、cd 等等。这些应用程序并不需要我们一个一个编写,使用 busybox 工具生成即可,后续文章会更新从 0 一步一步搭建根文件系统,运行打印"hello world"的应用程序。
所以基于 ARM 开发板做应用开发,比如摄像头需要启动摄像头相关的用户应用程序,而这些应用程序存放的载体–根文件系统。
用目录+文件名的方式访问块存储设备
块存储设备,比如硬盘、SD 卡、Nandflash,是分块(扇区)的,物理上从底层访问这类存储设备是按扇区号来访问的,比如一次只能擦写 512 字节。和内存的字节访问方式不同(比如用指针对内存中某一地址进行读写操作)。而文件系统封装了这些底层操作,可以以目录+文件名的方式来访问这些扇区。