SoC嵌入式软件架构设计之七:嵌入式文件系统设计
嵌入式的系统区(system disk,SD)包含操作系统、驱动、中间件、应用和字库、UI资源等文件,本文讲述SD区的文件系统设计。文件系统最基本的目标是为了实现单个文件的定位和读写。由于一般代码都是不可自改动的。即量产之后不会有写操作。嵌入式系统的SD文件系统就是为了可以简单、高效地定位某个文件和读取文件里的数据。设计原则和要点有下面几方面:
1. 逻辑连续存储单个文件,以扇区对齐。
SD区的单个代码和资源文件一般都不大。所以不必要像fat32文件系统那样用fat表把文件簇串起来。直接逻辑连续地存储起来就可以,这样定位也会更加简单高速,当然文件应该以扇区来对齐。方便读取,文件偏移信息也能用扇区数来记录。
2. SD头
这是对整个SD区属性的描写叙述,包含校验码、版本、日期、OEM厂商等等。有时为了保证知识产权,还会加上一些防止拷贝的加密ID信息。
3. DIR节
DIR节就是文件夹信息,即每一个文件在SD区中的定位信息。是SD文件系统最重要的数据结构。文件的定位就是依赖于文件夹信息进行。打包工具会按一定的顺序将各个文件打包。并相应按顺序产生每一个文件相应的文件夹信息。每一个文件的文件夹数据结构例如以下:
1)文件名称,通常是8+3格式
2)文件属性。区分系统文件和应用文件、隐藏文件等
3)文件在SD区中的偏移量,以扇区为单位
4)文件大小,字节为单位
5)校验码
4. 文件数据
DIR节之后就是一个个真实的代码和资源和配置等文件。
5. fopen
打开文件即依据文件名称在DIR节中匹配,匹配成功就可以获得文件在SD中的偏移量,将这偏移量右移9位(即512字节。一个扇区)即是文件的位置。fopen返回的是一个句柄,该句柄相应一个数据结构,结构一般包含:文件的起始位置、长度、当前读指针位置等。
记录起始位置和长度是为了防止越界读取。
6. fread
依据句柄的当前读指针进行读取。读后要改动当前读指针。
7. fseek
依据模式来直接改动读指针。
须要清除的是:SD区是一个逻辑区,其仅仅是固件的一部分。一个固件会包含引导区、SD区、VM区、特定功能区(如VM)。之后才是数据区。这个数据区就会部署fat32或者exfat等标准文件系统。
下一节再继续解说固件分布设计。
SoC嵌入式软件架构设计之七:嵌入式文件系统设计的更多相关文章
- SoC嵌入式软件架构设计
内存是SoC(System on Chip,片上系统)集成设计的重要模块,是SoC中成本比重较大的部分.内存管理的软硬件设计是SoC软件架构设计的重要一环,架构设计师必须要在成本和效率中取得平衡,做到 ...
- SoC嵌入式软件架构设计II:没有MMU的CPU虚拟内存管理的设计和实现方法
大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其它代码. 我们PC然在同一时间大量的应用,地址空间差点儿能够整个线性地址空间(除了部分留给操作系统或者预留它用).能够觉 ...
- SoC嵌入式软件架构设计II:否MMU的CPU虚拟内存管理的设计与实现方法
大多数的程序代码是必要的时,它可以被加载到内存中运行.手术后,可直接丢弃或覆盖其他代码.我们PC然在同一时间大量的应用,能够整个线性地址空间(除了部分留给操作系统或者预留它用),能够觉得每一个应用程序 ...
- SoC嵌入式软件架构设计之六:API设计方法
在嵌入式系统中,驱动都是以API的方式提供给应用进行调用.这里介绍嵌入式系统的API设计和管理方法. 驱动在系统中会按模块进行分类,比如按键驱动.LCD驱动.文件系统.card驱动.I2C驱动等等:每 ...
- SoC嵌入式软件架构设计之三:代码分块(Bank)设计原则
上一节讲述了在没有MMU的CPU(如80251.MIPS M控制器系列.ARM cortex m系列)上实现虚拟内存管理的集成硬件设计方法.新设计的内存管理管理单元要实现虚拟内存管理还须要操作系统.代 ...
- Hadoop HDFS分布式文件系统设计要点与架构
Hadoop HDFS分布式文件系统设计要点与架构 Hadoop简介:一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群 ...
- PowerDotNet平台化软件架构设计与实现系列(03):系统应用平台
为了复用和解耦,快速开发更多的系统和应用,我们对自己经常说的"系统"和"应用"进行更高级的提取和抽象. 十多年前入行,辗转至今,写过很多很多应用,个人喜欢分门别 ...
- 组件接口(API)设计指南-文件夹
组件接口(API)设计指南-文件夹 组件接口(API)设计指南[1]-要考虑的问题 组件接口(API)设计指南[2]-类接口(class interface) 组件接口(API)设计指南[3]-托付( ...
- loadrunner 场景设计-设置结果文件保存路径
场景设计-设置结果文件保存路径 by:授客 QQ:1033553122 Results->Results settings Results Name 结果文件夹名称 Directory 指定结果 ...
随机推荐
- mac下---charles抓包https
网上找的很多安装包都有问题,终于找到个可用的! 下载地址: http://pan.baidu.com/s/1pLAONbX ———————————————————————————— 教程转载:htt ...
- docker修改docker0 mtu
由于docker宿主机设置了mtu造成docker镜像中mtu和宿主机mtu不匹配,大包后网络不同.所以需要设置docker0的mtu. 1.修改docker.service vi /usr/lib/ ...
- java基础67 JavaScript通过关系找节点、添加附件(网页知识)
1.通过关系找节点(父子关系,兄弟关系) 1.1.常用方法 parentNode:获取当前元素的父节点. childNodes:获取当前元素的所有下一级子元素 firstChild:获取当 ...
- ioctl()函数获取本机IP、MAC
#include <sys/ioctl.h> int ioctl(int d, int request, ...); /* Socket configuration controls. * ...
- UFLDL(五)自编码算法与稀疏性
新教程内容太繁复,有空再看看,这节看的还是老教程: http://ufldl.stanford.edu/wiki/index.php/%E8%87%AA%E7%BC%96%E7%A0%81%E7%AE ...
- thinkphp5与thinkphp3.X对比
原文https://www.cnblogs.com/wupeiky/p/5850108.html 首先声明本章节并非是指导升级旧的项目到5.0,而是为了使用3.X版本的开发者更快的熟悉并上手这个全新的 ...
- java 闭包与回调
闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域. 内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象 ...
- MySQL学习笔记:字符串前后补全0
遇到一个需求:不足6位的需要自动补全6位,使用函数LPAD()和RPAD()补全. LPAD(str, len, padstr) 用字符串padstr对str进行左边填充补全直至它的长度达到len个字 ...
- for循环练习--杨辉三角
package org.hanqi.zwxx; public class Yonghuisanjiao{ public static void main(String[] args) { // TOD ...
- Linux下Github的使用方法
1 Linux下Git和GitHub环境的搭建 安装Git, 使用命令sudo apt-get install git 创建GitHub帐号 生成ssh key,使用命令 ssh-keygen -t ...