嵌入式文件系统

嵌入式文件系统

文件系统简介

在计算机系统中, 需要用到大量的程序和数据, 它们大部分以文件的形式存放在外部存储当中, 根据需要可随时调入内存使用

如果用户直接管理外存文件所面临的问题:

  • 必须熟悉外存的物理特性
  • 了解各种存储文件的属性
  • 记录文件在外存上的存储位置
  • 在多用户环境下, 必须能保证数据的安全性和一致性

为了解决文件的管理问题, 在操作系统中出现了—文件系统

文件系统的功能:

  • 负责存储器中文件的组织和分配
  • 提高对存储器资源的利用效率
  • 将文件的存取、 共享和保护等功能提供给操作系统和用户
  • 简化用户对文件的各项操作
  • 保证在多用户环境下文件的安全性和一致性

文件系统是操作系统的重要组成部分, 是实现文件多元化管理的必要条件

文件系统的一般定义是: 负责管理和存储文件信息的软件组件

操作系统对磁盘的管理

  • 无论是Windows还是Linux都将磁盘划分成指定大小的分区进行管理
  • 在特定分区安装操作系统、 系统启动所必需的文件, 其它磁盘空间作为普通分区提供给用户使用
  • 所有分区都可以根据用户需要, 安装不同的文件系统对文件进行管理
  • 一般操作系统都会支持多种常用文件系统格式 , 比如: FAT、 NTFS、 EXT4、 YAFFS2等

Linux文件系统分类

Linux支持多种文件系统, 包括minix、 ext、 vfat、 ntfs、iso9660、 jffs、 yaffs和nfs等

系统启动之后, 便可以自动或手动挂载需要用到的文件系统

一般不同的存储设备会采用不同的文件系统类型,以便更好的组织和管理存储设备上的文件与目录

常用的嵌入式文件系统 :

jffs文件系统 :

  • 最早是由瑞典Axis Communications公司为嵌入式系统开发的日志型文件系统
  • 目前jffs已经大量被jffs2取代
  • jffs2是RedHat公司基于jffs开发的闪存文件系统
  • jffs2最初是针对RedHat公司eCos相关产品开发的嵌入式文件系统,所以jffs2也可以用在Linux、 μCLinux等嵌入式OS中
  • jffs主要用于nor型闪存, 基于MTD驱动层, 特点是:
    • 可读写的、 支持数据压缩的、 日志型文件系统基于哈希表, 并提供了崩溃/掉电安全保护, 提供“ 写平衡” 支持等。
    • 缺点: 当文件系统已满或接近满时, 因为垃圾收集的关系而使jffs2的运行速度大大放慢。

ext4文件系统 :

  • ext4是主要为Linux使用mmc型存储器而设计的一种日志型文件系统
  • ext4引入了盘区概念, 每个盘区为一组连续的数据块, 相比于ext3提高了访问效率。
  • ext4支持在线碎片整理, 提高使用效率

ext4与ext3的主要区别在于:

  • ext3数据块分配每次只能分配1个4k块, ext4支持单次分配多个数据块, 降低IO访问开销。
  • ext4存储量最大支持1EB, 单文件最大支持到16TB, 远远大于ext3, 这对某些特殊用户来说至关重要

cramfs文件系统 :

  • 由Linux的创始人Linus Torvalds参与开发的一种只读的压缩文件系统
  • 在cramfs文件系统中, 每一页(4KB)被单独压缩, 可以随机页访问,其压缩比高达2:1, 为嵌入式系统节省大量的Flash存储空间
  • 使系统可通过更低容量的flash存储相同的文件, 从而降低系统成本
  • cramfs文件系统以压缩方式存储, 在运行时解压缩, 不支持应用程序以XIP方式运行, 所有的应用程序要求被拷到ram里去运行
  • cramfs经常跟yaffs文件系统配合使用, 以达到修改必须内容的目的

nfs文件系统 :

  • nfs是由Sun公司开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。
  • 在嵌入式Linux系统的开发调试阶段, 可利用该技术在主机上建立基于nfs的根文件系统, 挂载到嵌入式设备,可以很方便地修改根文件系统的内容。
  • 最开始即采用此种方式来开发和调试根文件系统。

使用nfs作为根文件系统的步骤:

查看u-boot中启动命令行参数:

printenv
bootargs=root=/dev/mmcblk0p8 rw rootfstype=ext4 init=/linuxrc lcd=wy070ml
tp=gslx680

设置u-boot从nfs启动根文件系统:

setenv bootargs noinitrd root=/dev/nfs
nfsroot=/home/edu/rootfs/,rsize=1024,wsize=1024
# 代表从10.0.13.223机子上/home/edu/rootfs/启动根文件系统
ip=10.0.13.123:10.0.13.223:10.0.13.254:255.255.255.0::eth0:off
init=/linuxrc console=ttySAC1,115200

虚拟文件系统 :

  • 为了对各类文件系统进行统一管理, Linux引入了虚拟文件系统— — VFS(Virtual File System), 为各类文件系统提供统一的操作界面和应用编程接口
  • VFS并不是一种实际的文件系统, 它是物理文件系统与服务之间的一个接口层
  • VFS只存在于内存中, 不存在于任何外存空间
  • VFS在系统启动时建立, 在系统关闭时消亡

虚拟文件系统的优势

通过虚拟文件系统, 我们可以利用标准的Linux系统调用,对不同介质上的不同文件系统进行读写操作, 例如:

可以让open()、 read()、 write()等系统调用不用关心底层的存储介质和文件系统类型就可以工作的粘合层

image-20200701181848271

Linux根文件系统目录结构

根文件系统特点:

  • Linux系统启动后, 首先由内核挂载的文件系统称为根文件系统, 其中包括系统启动所必需的文件
  • 在根文件系统的最顶层目录中, 每个目录都有其具体的目的和用途
  • 根文件系统的类型没有限制, 可以是Linux系统所支持的任意稳定可靠的文件系统类型
  • 在Linux下所有磁盘被挂载后才能使用, 这个挂载的目录被称为挂载点或安装点, 然后通过此目录来访问这个分区上的文件或其它目录

inux目录结构 :

  • Linux和unix都是一个以“ /”作为根的树状文件结构
  • “ /”因此被称为根目录, 其它所有的文件和目录都置于根目录之下
image-20200701190657159

早期的unix系统中, 各个厂家都定义了自己的unix文件系统结构, 且互不兼容, 比较混乱

1994年推出FHS(Filesystem Hierarchy Standard), 对根文件系统目录做了统一规范, 形成了FHS标准(文件系统目录标准)

Linux根文件系统标准目录如下 :

​ FHS定义的根文件系统顶层目录

目录名内容
bin提供基本的用户命令,如ls、cp等
boot该目录下存放的一般是Linux的启动文件和内核
dev设备文件或其他的特殊文件,如mmcblk0p2、fb0等
etc系统配置文件,包括启动文件
home多个用户的主目录
lib存放应用程序所需的基本库,运行时需要共享库,比如C、C++等标准库,GTK、QT等应用程序库
mnt用于临时挂载的文件系统,比如挂载U盘、SD卡等
opt某些第三方软件商软件的安装地点,某些自定义的软件包会安装到这里
proc操作系统运行时,进程信息及内核信息(比如模块加载数、中断申请与使用状态、进程运行状况等) 存放在这里,一般挂载proc文件系统,用来表示系统的运行状态,只存在内存当中
root根用户的主目录,与此对应,普通用户的目录是/home下的某个子目录
sbin主要放置系统管理和网络管理的必备程序,如ifconfig、rmmod等,通常需要root权限才能完全使用
sys与/proc相似,挂载sysfs文件系统
tmp一些需要生成临时文件的程序需要此目录,通常为空,且此目录必须可写,一般挂载ramfs文件系统
usr一般存放由用户自由添加的程序或开源库以及各种不常用的命令等,是共享和只读的
var一些变化的实例和工具等,存放可变的数据,如一些系统日志文件等

总结:

制作根文件系统的过程, 其实就是构造以上目录及系统启动所必需文件的过程

构建嵌入式根文件系统的工作, 也就从构建这几个文件夹开始

Linux系统启动流程

Bootloader引导内核的过程

其中一步是Bootloader将系统控制权交给内核之前, 会给内核传递参数, 具体内容如下

# root: 指定根文件系统在磁盘分区中的位置
# init: 指定Linux内核启动完毕后调用的第一个用户态程序
# console: 指定内核启动后首选的控制台设备(非必须)
root=/dev/mmcblk0p8 rw rootfstype=ext4 init=/linuxrc lcd=wy070ml tp=gslx680

linuxrc程序工作内容 :

linuxrc是由内核启动的第一个, 也是惟一的一个用户进程, PID为1

linuxrc通常和/bin/init一样, 除非用户重新实现它

linuxrc执行流程:

  • 设置SIGSEGV、 SIGILL、 SIGFPE、 SIGBUS信号处理函数
  • 初始化控制台, 设置环境变量( HOME、 SHELL、 USER等)
  • 解析/etc/inittab配置文件, 否则将运行默认配置
  • 监听特定子进程状态

linuxrc是后续进程的发起者

/etc/inittab配置文件的作用 :

/etc/inittab决定了接下来将要启动的脚本、 shell和应用程序

/etc/inittab配置文件结构 :

  • 每一行都指定一个子进程, 并确定了进程运行方式
  • 用冒号来分隔各字段的属性

具体格式:

# id: 表示这个子进程使用的控制台, 如果省略, 则使用与linuxrc进程一样的控制台
# runlevels: 该字段主要用于PC机, 对于嵌入式系统暂时没有处理, 可以省略
# action: 表示linuxrc进程将如何控制这个子进程, 具体取值见后面的表格
# process: 表示要启动的可执行程序或脚本, 如果process字段前面有“ -”字符, 说明这个应用支持“ 交互”
<id> : <runlevels> : <action> : <process>
# etc/inittab
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
#tty0::askfirst:-/bin/sh
::restart:/home/a.sh
::ctrlaltdel:/bin/umount -a -r

action的可选值

名称执行条件说明
sysinit系统启动后最先执行指定初始化脚本路径, 只执行一次, init进程等待它结束才继续执行其它动作
wait执行完sysinit进程后只执行一次, init进程等待它结束才继续执行其它动作
once执行完wait进程后只执行一次, init进程不等待它结束
respawn启动完once进程后init进程监测发现子进程退出时, 重新启动它
askfirst启动完respawn进程后与respawn类似, 不过init进程先输出“ Please press Enter to activate this console” , 等 用户输入回车后才启动子进程。
shutdown当系统关机时即重启、 关闭系统时执行的程序
restartinit进程接收到 SIGHUP信号时init进程重启时执行的程序, 通常是init程序本身。 先重新读取、 解析/etc/inittab文件, 再执行restart程序
ctrlaltdel按下Ctrl+Alt+Del按Ctrl+Alt+Del组合键时执行的程序

linuxrc解析inittab配置文件过程中, 被指定的用户程序解析执行顺序如下:

sysinit -> wait -> once -> respawn -> askfirst -> ctrlaltdel -> shutdown -> restart

程序执行顺序与配置文件中的书写顺序无关

执行完所有开机需要加载的进程或脚本后, 开始监听子进程的运行状态

如果respawn、 askfirst子进程退出, 则重启该进程

构建自己的根文件系统

从构建/bin、 /sbin、 /usr、 linuxrc开始

  • 从网上下载所有常用命令的源码
  • 采用交叉编译器, 重新编译好命令下载到开发板/bin、/sbin等目录下

问题:

  • 命令体积和数量都会很大, 不适合嵌入式系统对资源的有效利用

嵌入式领域将采取专用工具来制作常用命令和相关应用 ----- Busybox http://www.busybox.net

Busybox特点:

  • 提供完善的Linux命令工具集
  • 提供图形化的配置环境和默认配置选项
  • 所有功能均整合到busybox程序中, 实现不同命令的代码共享, 占用磁盘空间极小
  • 所有命令均通过软链接到/bin/busybox实现
  • 帮助用户实现了1号用户进程(linuxrc)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/838062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英语新概念2-回译法-lesson14

第一次回译 I had a amusing experience. I kept driving to the next town when I left a small village in the south of Franch.A teenager waved to me in the path.I stopped my car, he asked me to give him a lift.As soon as he get my car,I say good morning in Fr…

【Kubernetes】污点、容忍度、亲和性、调度和重启策略

标签、污点、容忍度、亲和性 一、标签1、定义2、给资源打标签【1】给Pod打标签【2】给Service打标签【3】给Node打标签 3、查看资源标签 二、节点选择器1、nodeName2、nodeSelector 三、污点、容忍度、亲和性1、node节点亲和性【1】硬亲和性【2】软亲和性 2、pod节点亲和性【1】…

安泰电子电压放大器应用及示例是什么样的

电压放大器是电子电路中常用的一种器件&#xff0c;用于将输入信号的电压放大至所需的输出电压。它在许多领域中有着重要的应用&#xff0c;包括通信、音频放大、仪器测量等。以下是电压放大器的一些应用及示例&#xff1a; 信号处理&#xff1a;在许多电子系统中&#xff0c;需…

Kasawaki川崎机器人故障维修

在当今的自动化工业领域&#xff0c;川崎工业机器人以其卓越的性能和可靠的工作效率赢得了广泛的赞誉。作为机器人的核心组成部分&#xff0c;伺服电机的作用至关重要。然而&#xff0c;就像所有机械设备一样&#xff0c;也可能会遭遇电机磨损或故障&#xff0c;需要适时的川崎…

vue自定义权限指令

定义v-hasPermi指令 /*** v-hasPermi 操作权限处理*/import useUserStore from /store/modules/userexport default {mounted(el, binding, vnode) {const { value } bindingconst all_permission "*:*:*";const permissions useUserStore().permissions&#xff…

linux - 搭建部署ftp服务器

ftp 服务: 实现ftp功能的一个服务,安装vsftpd软件搭建一台ftp服务器 ftp协议: 文件传输协议 (file transfer protocol),在不同的机器之间实现文件传输功能, 例如 视频文件下载,源代码文件下载 公司内部:弄一个专门的文件服务器,将公司里的文档资料和视频都存放…

基于死区补偿的永磁同步电动机矢量控制系统simulink仿真模型

整理了基于死区补偿的永磁同步电动机矢量控制系统simulink仿真&#xff0c;该模型使用线性死区补偿的PMSM矢量控制算法进行仿真&#xff0c;使用Foc电流双闭环 。 1.模块划分清晰&#xff0c;补偿前后仿真有对比&#xff0c;易于学习; 2.死区补偿算法的线性区区域可调; 3.自…

5.13网络编程

只要在一个电脑中的两个进程之间可以通过网络进行通信那么拥有公网ip的两个计算机的通信是一样的。但是一个局域网中的两台电脑上的虚拟机是不能进行通信的&#xff0c;因为这两个虚拟机在电脑中又有各自的局域网所以通信很难实现。 socket套接字是一种用于网络间进行通信的方…

Python接口自动化测试之动态数据处理

在前面的知识基础上介绍了在接口自动化测试中&#xff0c;如何把数据分离出来&#xff0c;并且找到它的共同点&#xff0c;然后依据这个共同点来找到解决复杂问题的思想。我一直认为&#xff0c;程序是人设计的&#xff0c;它得符合人性&#xff0c;那么自动化测试的&#xff0…

自由职业是种怎样的体验?普通人如何成为一名自由职业者?

自由职业在哪都能办公自由职业在哪都要办公。 放弃幻想&#xff0c;没有不辛苦的工作&#xff0c;5年经验后端开发程序员&#xff0c;已经从事自由职业1年半&#xff0c;今天就来客观分享一下自由职业的利与弊。 时间自由&#xff0c;减少中间商赚差价 自由职业最让人羡慕的就…

React Native 开发心得分享

有一段时间没更新了&#xff0c;花了点时间研究了下 React Native&#xff08;后续用 RN 简称&#xff09;&#xff0c;同时也用该技术作为我的毕设项目(一个校园社交应用&#xff0c;仿小红书)&#xff0c;经过了这段时间的疯狂折腾&#xff0c;对 RN 生态有了一定的了解&…

图搜索算法-最小生成树问题-普里姆算法(prim)

相关文章&#xff1a; 数据结构–图的概念 图搜索算法 - 深度优先搜索法&#xff08;DFS&#xff09; 图搜索算法 - 广度优先搜索法&#xff08;BFS&#xff09; 图搜索算法 - 拓扑排序 图搜索算法-最短路径算法-戴克斯特拉算法 图搜索算法-最短路径算法-贝尔曼-福特算法 图搜索…

【069】基于SpringBoot+Vue实现的企业资产管理系统

系统介绍 基于SpringBootVue实现的企业资产管理系统管理员功能有个人中心&#xff0c;用户管理&#xff0c;资产分类管理&#xff0c;资产信息管理&#xff0c;资产借出管理&#xff0c;资产归还管理&#xff0c;资产维修管理。用户可以对资产进行借出和归还操作。因而具有一定…

软考-下午题-试题一

1、概念 2、答题技巧和规范 问题1、2&#xff1a;直接看 格式&#xff1a; 问题3&#xff1a; 格式&#xff1a; 3、例题 eg2&#xff1a;可以以后写完问题4之后&#xff0c;把问题3补充完整 问题4&#xff1a; 问题4 官方解释&#xff1a; 问题4&#xff08;3‘&#xff09; 2…

在做题中学习(58):和为K的子数组

560. 和为 K 的子数组 - 力扣&#xff08;LeetCode&#xff09; 因为是判断子数组的和 要返回 k 的次数&#xff0c;所以 解法&#xff1a;前缀和 哈希表 提出一个概念&#xff1a;以下标i为结尾的所有子数组 那要找出所有和 k的子数组 就相当于&#xff1a;找出所有值为…

JAVA实验项目(二): 抽象类、接口的定义与使用

实验项目二 抽象类、接口的定义与使用 Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&…

C#实现多线程的几种方式

前言 多线程是C#中一个重要的概念&#xff0c;多线程指的是在同一进程中同时运行多个线程的机制。多线程适用于需要提高系统并发性、吞吐量和响应速度的场景&#xff0c;可以充分利用多核处理器和系统资源&#xff0c;提高应用程序的性能和效率。 多线程常用场景 CPU 密集型任务…

物联网促进信息化——​青创智通工业物联网解决方案​

随着传感器网络&#xff08;WSN)、无线射频识别&#xff08;RFID&#xff09;以及微电子机械系统(MEIVIS&#xff09;等技术的不断成熟,扩展了人们对信息获取和使用的能力&#xff0c;并将提高制造效率、改善产品质量、降低产品成本和资源消耗、为用户提供更加透明和个性化的服…

玩转Matlab-Simscape(初级)- 05 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真(理论部分1)

** 玩转Matlab-Simscape&#xff08;初级&#xff09;- 05 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真&#xff08;理论部分1&#xff09; ** 目录 玩转Matlab-Simscape&#xff08;初级&#xff09;- 05 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真&am…

网关过滤器实现接口签名检验

背景 往往项目中的开放接口可能被别有用心者对其进行抓包然后对请求参数进行篡改&#xff0c;或者重复请求占用系统资源为此我们行业内使用比较多的策略是接口签名校验。签名校验的实现可以用注解aop的形式实现&#xff0c;也可以使用过滤器统一拦截校验实现&#xff0c;此篇文…