FATFS文件系统剖析(全)

FATFS文件系统剖析(全)
FATFS文件系统剖析(全)

FATFS文件系统剖析1:

FAT16:

数据按照其不同的特点和作用大致可分为5部分:MBR区、DBR区、FAT区、DIR区和DATA区,相比fat12多了DBR区

Main boot record: MBR(0--1bdh)磁盘参数存放

DPT(1beh--1fdh)磁盘分区表

55,aa 分区结束标志

DBR(Dos Boot Record)是操作系统引导记录区的意思

FAT区(有两个,一个备份):对于fat16,每一个fat项16位,所以可寻址的簇项数为65535(2的16次方)。而其每簇大小不超过32k,所以其每个分区最大容量为2G。fat32,每一个fat项32位,可寻址簇数目为2的32次方。

DIR区(根目录区):紧接着第二FAT表(即备份的FAT表)之后,记录着根目录下每个文件(目录)的起始单元,文件的属性等。定位文件位置时,操作系统根据DIR中的起始单元,结合FAT表就可以知道文件在硬盘中的具体位置和大小了。

DATA区:实际文件内容存放区。

FAT32:

暂时放在这里,不讨论!

Fatfs:嵌入式fat文件系统,支持fat16,fat32。

包含有ff.h,diskio.h,integer.h,ffconf.h 四个头文件以及ff.c 文件系统实现。当然要实现具体的应用移植,自己要根据diskio.h实现其diskio。c 底层驱动。

diskio.h : 底层驱动头文件

ff.h : 文件系统实现头文件,定义有文件系统所需的数据结构

ff.c : 文件系统的具体实现

如下开始逐个文件加以分析:

integer.h :仅实现数据类型重定义,增加系统的可移植性。

ffconf.h : 文件系统配置---逐个配置,先配置实现一个最小的fat文件系统,下面来分析各配置选项:

#define _FFCONF 8255 //版本号

#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ //在这里与先前版本有些许变化,是通过配置头配置两种不同大小的文件系统,这里配置为0。

#define _FS_READONLY 1//定义文件系统只读,也就不能写修改,在此定义为1,这样文件系统会大大缩小,简化学习理解过程。

#define _FS_MINIMIZE 3 /* 0 to 3 */ 这个选项是用于过滤掉一些文件系统功能,为0时是全功能,3是功能实现最小

#define _USE_STRFUNC 0 /* 0:Disable or 1/2:Enable */ 是否使用字符串文件接口,为0,不使用

#define _USE_MKFS 0 /* 0:Disable or 1:Enable */ 制作文件系统,这个功能实现是还要_FS_READONLY=0

#define _USE_FORWARD 0 /* 0:Disable or 1:Enable */ f_forward function 实现还需_FS_TINY =1

#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */ 快速查找功

#define _CODE_PAGE 936 // 936 - Simplified Chinese GBK (DBCS, OEM, Windows)

#define _USE_LFN 0/* 0 to 3 */ 0:不使用长文件名

#define _MAX_LFN 255/* Maximum LFN length to handle (12 to 255) */

#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */

#define _FS_RPATH 0 /* 0 to 2 */ 不使用相对路径

/*---------------------------------------------------------------------------/

/ Physical Drive Configurations

/----------------------------------------------------------------------------*/

#define _VOLUMES 1

/* Number of volumes (logical drives) to be used. */

#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ 512字节每扇区

#define _MULTI_PARTITION 0 /* 0:Single partition or 1:Multiple partition */ 只有一个分区

#define _USE_ERASE 0 /* 0:Disable or 1:Enable */

/* To enable sector erase feature, set _USE_ERASE to 1. */

/*---------------------------------------------------------------------------/

/ System Configurations

/----------------------------------------------------------------------------*/

#define _WORD_ACCESS 0 /* 0 or 1 */ 0: Byte-by-byte access.

/* Include a header file here to define sync object types on the O/S */

/* #include , , or ohters. */

#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable */ 同步选项

#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */

#define _SYNC_t HANDLE /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */

#define _FS_SHARE 0 /* 0:Disable or >=1:Enable */ 共享选项

如上已经配置成了一个最小的fat文件系统。

Diskio.h:底层驱动头文件,就一些状态宏的定义和底层驱动函数的申明,看源码一目了然。

实现相应的diskio.c 。

根据我的配置:只需要根据不同的存储介质实现相应的disk_initialize ,disk_status,disk_read三个函数就够了,

我在这里实现上s3c2440上的SD卡驱动:

DSTATUS disk_initialize (BYTE nDisk)

{

return 1;

}

DSTATUS disk_status (BYTE nDisk)

{

return 1;

}

DRESULT disk_read (BYTE nDisk, BYTE* b, DWORD c, BYTE d)

{

return 0;

}

编译报错get_fattime 没实现:

DWORD get_fattime (void)

{

return 0;

}

转自博客,供大家相互交流!

FATFS文件系统剖析2:

分析下ff.h和ff.c两个文件。

先来分析ff.h中定义的几个结构体:

typedef struct {

BYTE fs_type; // 系统类型,为0时系统没有被挂载

BYTE drv; // 物理磁盘驱动号

BYTE csize; // 每簇的扇区数目,簇是文件数据分配的基本单位

BYTE n_fats; // 文件分配表的数目,一般为两个(一个备份fat表) //Fatfs文件系统应该是:引导扇区,文件分配表2个,根目录区,和数据区 BYTE wflag; // 文件活动窗体是否改动标志,为1要回写

BYTE fsi_flag; // 文件信息回写标志

WORD id; // 文件系统加载id号

WORD n_rootdir; // 根目录区目录项数目(针对FAT12/16,FAT32不使用)

#if _MAX_SS != 512

WORD ssize; // 每扇区多少字节

#endif

#if _FS_REENTRANT

_SYNC_t sobj; // 允许重入,则定义同步对象

#endif

#if !_FS_READONLY

DWORD last_clust; // 最新分配的簇

DWORD free_clust; // 空闲簇

DWORD fsi_sector; // 文件信息扇区(仅用于FAT32)

#endif

#if _FS_RPATH

DWORD cdir; //使用相对路径,文件系统的当前起始路径0(root 路径)

#endif

DWORD n_fatent; //文件分配表占用的扇区 n_fatent=数据簇数目+2

DWORD fsize; //每FAT表有多少个扇区

DWORD fatbase; //文件分配表开始扇区

DWORD dirbase; // 如果是FAT32,根目录开始扇区需要首先得到 DWORD database; // 数据起始扇区

DWORD winsect; // win中当前指定的扇区

BYTE win[_MAX_SS]; //扇区操作缓存

} FATFS;

typedef struct {

FATFS* fs; // 指向的文件系统

WORD id; // 自身文件系统挂载id号即fs->id

BYTE flag; // 文件状态

BYTE pad1; //文件在簇里面扇区偏移(0--fs->csize)

DWORD fptr; //文件当前读写指针位置,当文件打开时为0

DWORD fsize; //文件大小(按字节计算)

DWORD org_clust; // 文件起始簇(0 when fsize==0)

DWORD curr_clust; // 文件当前操作簇

DWORD dsect; // 文件当前操作扇区

#if !_FS_READONLY

DWORD dir_sect; // 包含路径入口的扇区号

BYTE* dir_ptr; // 目录入口指针

#endif

#if _USE_FASTSEEK

DWORD* cltbl; //指向查找映射表的簇(null on file open)

#endif

#if _FS_SHARE

UINT lockid; // 文件锁ID号(index of file semaphore table) #endif

#if !_FS_TINY

BYTE buf[_MAX_SS]; // 文件读写缓存

#endif

} FIL;

typedef struct {

FATFS* fs; // 对应的文件系统

WORD id; // 自身文件系统挂载id号即fs->id

WORD index; // 目前读写索引号 /* Current read/write index number */

DWORD sclust; // 目录表起始簇(0:Root dir)

DWORD clust; // 目前处理的簇

DWORD sect; // 目前簇里对应的扇区

BYTE* dir; //指向当前在win[]中的短文件名入口项/* Pointer to the current SFN entry in the win[]

BYTE* fn; //指向短文件名 (in/out) {file[8],ext[3],status[1]}

#if _USE_LFN

WCHAR* lfn; //指向长文件名缓冲 /* Pointer to the LFN working buffer */

WORD lfn_idx; /* Last matched LFN index number (0xFFFF:No LFN) */

#endif

} DIR;

typedef struct { //文件目录表项大小=4+2+2+1+13

DWORD fsize; /* File size */

WORD fdate; /* Last modified date */

WORD ftime; /* Last modified time */

BYTE fattrib; /* Attribute */ // 文件属性

TCHAR fname[13]; /* Short file name (8.3 format) */

#if _USE_LFN //长文件名支持

TCHAR* lfname; /* Pointer to the LFN buffer */

UINT lfsize; /* Size of LFN buffer in TCHAR */

#endif

} FILINFO;

结构是搞清楚了,但其里面的具体联系怎么也还收理不清楚。只有看ff.c来疏通了!

里面东西还是蛮多的,咋一看,3000多行类(太多,在这里就根据我的配置,进行逐个分析吧),从头到尾,一个一个来。

首先是三个内存操作和以个字符查找处理函数,不说不解释。

然后是:

static

FRESULT move_window (

FATFS *fs, /* File system object */

DWORD sector /* Sector number to make appearance in the fs->win[] */

) /* Move to zero only writes back dirty window */

该函数就是把指定扇区sector中的数据读到fs->win[]里面

DWORD clust2sect ( /* !=0: Sector number, 0: Failed - invalid cluster# */

FATFS *fs, /* File system object */

DWORD clst /* Cluster# to be converted */

)

计算簇clst在对应文件系统fs里面的扇区号

DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, Else:Cluster status */

FATFS *fs, /* File system object */

DWORD clst /* Cluster# to get the link information */

)

获取簇clst在文件系统fs中FAT表里面fat入口

static

FRESULT dir_sdi (

DIR *dj, /* Pointer to directory object */

WORD idx /* Directory index number */

)

根据根目录索引号idx获取相应的目录信息存储到dj结构里面

static

FRESULT dir_next ( /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:EOT and could not stretch */

DIR *dj, /* Pointer to directory object */

int stretch /* 0: Do not stretch table, 1: Stretch table if needed */

)

获取当前目录项的索引值+1 ,对应的目录项信息

static

FRESULT dir_find (

DIR *dj /* Pointer to the directory object linked to the file name */

)

在目录表中查找与dj->fn相同文件名的目录项

static

FRESULT create_name (

DIR *dj, /* Pointer to the directory object */

const TCHAR **path /* Pointer to pointer to the segment in the path string */

)

创建一个文件名为path指向的dj目录项

static

FRESULT follow_path ( /* FR_OK(0): successful, !=0: error code */

DIR *dj, /* Directory object to return last directory and found object */

const TCHAR *path /* Full-path string to find a file or directory */

)

获取文件路径path对应的目录项填入dj里面

static

BYTE check_fs ( /* 0:The FAT BR, 1:Valid BR but not an FAT, 2:Not a BR, 3:Disk error */ FATFS *fs, /* File system object */

DWORD sect /* Sector# (lba) to check if it is an FAT boot record or not */

)

读取文件系统fs的一号扇区,进行MBR 检查,文件系统类型区分

static

FRESULT chk_mounted ( /* FR_OK(0): successful, !=0: any error occurred */

const TCHAR **path, /* Pointer to pointer to the path name (drive number) */

FATFS **rfs, /* Pointer to pointer to the found file system object */

BYTE chk_wp /* !=0: Check media write protection for write access */

)

测试文件系统是否已挂在,如没有,就进行挂载,文件系统结构初始化

static

FRESULT validate ( /* FR_OK(0): The object is valid, !=0: Invalid */

FATFS *fs, /* Pointer to the file system object */

WORD id /* Member id of the target object to be checked */

)

检测文件系统是否可用

如下是现配置好的文件系统引出的四个接口函数:

FRESULT f_mount ( //挂在一个逻辑的文件系统

BYTE vol, /* Logical drive number to be mounted/unmounted */

FATFS *fs /* Pointer to new file system object (NULL for unmount)*/ )

系统挂载

FRESULT f_open (

FIL *fp, /* Pointer to the blank file object */

const TCHAR *path, /* Pointer to the file name */

BYTE mode /* Access mode and file open mode flags */

)

文件打开,包括(真正的文件系统初始化,系统检测)

FRESULT f_read (

FIL *fp, /* Pointer to the file object */

void *buff, /* Pointer to data buffer */

UINT btr, /* Number of bytes to read */

UINT *br /* Pointer to number of bytes read */

)

文件读

FRESULT f_close (

FIL *fp /* Pointer to the file object to be closed */ )

文件关闭

转自博客,供大家相互交流!

LINUX文件系统制作详细

Linux文件系统制作流程 关键词:ARM Linux yaffs文件系统移植 Linux文件系统简介 Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。 Linux下的文件系统结构如下: Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。 不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM(DRAM,

SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2,yaffs,cramfs,romfs,ramdisk,ramfs/tmpfs等。 >基于FLASH的文件系统 Flash(闪存)作为嵌入式系统的主要存储媒介,有其自身的特性。Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向Flash写入内容时,需要先擦除对应的存储区间,这种擦除是以块(block)为单位进行的。 闪存主要有NOR和NAND两种技术(简单比较见附录)。Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序。因此,必须针对Flash 的硬件特性设计符合应用要求的文件系统;传统的文件系统如ext2等,用作Flash的文件系统会有诸多弊端。 在嵌入式Linux下,MTD(Memory Technology Device,存储技术设备)为底层硬件(闪存)和上层(文件系统)之间提供一个统一的抽象接口,即Flash的文件系统都是基于MTD驱动层的(参见上面的Linux下的文件系统结构图)。使用MTD 驱动程序的主要优点在于,它是专门针对各种非易失性存储器(以闪存为主)而设计的,因而它对Flash有更好的支持、管理和基于扇区的擦除、读/写操作接口。 顺便一提,一块Flash芯片可以被划分为多个分区,各分区可以采用不同的文件系统;两块Flash芯片也可以合并为一个分区使用,采用一个文件系统。即文件系统是针对于存储器分区而言的,而非存储芯片。 1.jffs2 JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux,uCLinux中。 Jffs2:日志闪存文件系统版本2(Journalling Flash FileSystem v2) 主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。 目前jffs3正在开发中。关于jffs系列文件系统的使用详细文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt。 jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另外,jffsx文件系统在

系统分析报告

系统分析报告 Company number:【WTUT-WT88Y-W8BBGB-BWYTT-19998】

宿舍管理信息系统分析报告 一、引言 1、新系统的名称:学生宿舍管理信息系统 2、系统开发背景: 随着时代的发展,计算机技术越来越深入各行各业,为广大的用户提供了更为周到和便捷的服务。目前各行各业广泛使用专用系统,其内容范围跨越了教育科研、文化事业、金融、商业、新闻出版、娱乐、体育等各个领域,其用户群十分庞大,因此,设计开发好一个专用系统对一个机构或部门的发展十分重要。近年来,随着用户要求的不断提高及计算机科学的迅速发展,特别是数据库技术的广泛应用,向用户提供的服务将越来越丰富,越来越人性化。 对于学校而言,学生宿舍管理是必不可少的组成部分。目前仍然存在有学校停留在宿舍管理部门人员手工记录数据的阶段,手工记录对于规模小的学校来说勉强可以接受;但对于学生信息量比较庞大,需要记录存档的数据比较多的高校来说,人工记录是相当麻烦的,而且当查找某条记录时,由于数据量庞大,只能依靠人工去一条一条地查找,这样不但麻烦而且浪费许多时间,工作效率比较低。采用计算机来管理宿舍和学生的信息,大大提高了查询的速度,节约了人力和物力资源,达到了预期的要求。 3、系统开发的目标 由于先前宿舍管理的工作流程建立在手工操作之上而导致处理速度过慢,不能满足上级管理层和住宿学生的要求,所以新系统开发的目标是:适应快速增长学生数的要求,立足于现有的人力资源,充分利用计算机的强大功能,加强住宿工作各阶段的科学管理,并对管理决策提供良好支持。 4、主要功能 (1)、预分宿舍,新生报道之前就根据其专业为其分配宿舍。 (2)、调整宿舍,根据学生入住情况和申请换宿舍的情况,为学生合理安排宿舍。 (3)、对于入住新生的资料、交费情况、每月每个宿舍的水电费等数据能够准确录入。只有对基本数据快速、准确的录入,才能为后继工作提供良好的支持。

busybox详解制作根文件系统

详解制作根文件系统 单击,返回主页,查看更多内容 一、FHS(Filesystem Hierarchy Standard)标准介绍 当我们在linux下输入ls / 的时候,见到的目录结构以及这些目录下的内容都大同小异,这是因为所有的linux发行版在对根文件系统布局上都遵循FHS标准的建议规定。 该标准规定了根目录下各个子目录的名称及其存放的内容: 制作根文件系统就是要建立以上的目录,并在其中建立完整目录内容。其过程大体包括: ?编译/安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录 ?利用交叉编译工具链,构建/lib目录 ?手工构建/etc目录 ?手工构建最简化的/dev目录 ?创建其它空目录 ?配置系统自动生成/proc目录 ?利用udev构建完整的/dev目录 ?制作根文件系统的jffs2映像文件 下面就来详细介绍这个过程。 二、编译/安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录

这些目录下存储的主要是常用命令的二进制文件。如果要自己编写这几百个常用命令的源程序,my god,这简直是一个噩梦!好在我们有嵌入式Linux系统的瑞士军刀——busybox,事情就简单很多。 1、从https://www.360docs.net/doc/7418543823.html,/下载busybox-1.7.0.tar.bz2 2、tar xjvf busybox-1.7.0.tar.bz2解包 3、修改Makefile文件 175 ARCH ?= arm 176 CROSS_COMPILE ?= arm-linux- 4、make menuconfig配置busybox busybox配置主要分两部分。 第一部分是Busybox Settings,主要编译和安装busybox的一些选项。这里主要需要配置:

实验四Linux内核移植实验

合肥学院 嵌入式系统设计实验报告 (2013- 2014第二学期) 专业: 实验项目:实验四 Linux内核移植实验 实验时间: 2014 年 5 月 12 实验成员: _____ 指导老师:干开峰 电子信息与电气工程系 2014年4月制

一、实验目的 1、熟悉嵌入式Linux的内核相关代码分布情况。 2、掌握Linux内核移植过程。 3、学会编译和测试Linux内核。 二、实验内容 本实验了解Linux2.6.32代码结构,基于S3C2440处理器,完成Linux2.6.32内核移植,并完成编译和在目标开发板上测试通过。 三、实验步骤 1、使用光盘自带源码默认配置Linux内核 ⑴在光盘linux文件夹中找到linux-2.6.32.2-mini2440.tar.gz源码文件。 输入命令:#tar –jxvf linux-2.6.32.2-mini2440-20110413.tar对其进行解压。 ⑵执行以下命令来使用缺省配置文件config_x35 输入命令#cp config_mini2440_x35 .config;(注意:x35后面有个空格,然后有个“.”开头的 config ) 然后执行“make menuconfig”命令,但是会出现出现缺少ncurses libraries的错误,如下图所示: 解决办法:输入sudo apt-get install libncurses5-dev 命令进行在线安装ncurses libraries服务。

安装好之后在make menuconfig一下就会出现如下图所示。 ⑶配置内核界面,不用做任何更改,在主菜单里选择退出,并选“Yes”保存设置返回到刚命令行界面,生成相应配置的头文件。 编译内核: #make clean #make zImage 在执行#make zImage命令时会出现如下错误: 错误:arch/arm/mach-s3c2440/mach-mini2440.c:156: error: unknown field 'sets' specified in initializer 通过网上查找资料 于是在自己的mach-mini2440.c中加入 #include

文件系统移植

嵌入式linux内核上文件系统的移植 实验目的:在已经能运行的内核上架构文件系统 其实,虽然 root_qtopia 这个文件系统的GUI 是基于Qtopia 的,但其初始化启动过程 却是由大部分由busybox 完成,Qtopia(qpe)只是在启动的最后阶段被开启。由于默认的内核命令行上有 init=/linuxrc, 因此,在文件系统被挂载后,运行的第一个程 序是根目录下的linuxrc。这是一个指向/bin/busybox 的链接,也就是说,系统起来后运行的 第一个程序也就是busybox 本身。 这种情况下,busybox 首先将试图解析/etc/inittab 来获取进一步的初始化配置信息(参 考busybox 源代码init/init.c 中的parse_inittab()函数)。而事实上,root_qtopia 中并没有/et c/inittab 这个配置文件,根据busybox 的逻辑,它将生成默认的配置 实验过程: 一、获取yaffs2源代码 现在大部分开发板都可以支持 yaffs2 文件系统,它是专门针对嵌入式设备,特别是使用nand flash 作为存储器的嵌入式设备而创建的一种 文件系统,早先的yaffs 仅支持小页(512byte/page)的nand flash,现 在的开发板大都配备了更大容量的nand flash,它们一般是大页模式 (2K/page),使用yaffs2 就可以支持大页的nand flash,下面是yaffs2 的移植详细步骤。 在https://www.360docs.net/doc/7418543823.html,/node/346 可以下载到最新的yaffs2 源代码,需要使用git工具( 安装方法见本手册第一章),在命令行输入:#git clone git://https://www.360docs.net/doc/7418543823.html,/yaffs2 稍等片刻,就可以下载到最新的yaffs2 的源代码目录,本光盘中也有单独的yaffs2 源代码包( 文件名为:yaffs2-src-20100329.tar.gz)

信息化系统诊断分析报告

上海理光传真机有限公司 信息系统分析报告 策划设计:专家组 上海三元企业管理有限公司 目录 第一部分:各系统的现状分析.................................... 一、信息系统现状分析 ............................................. 二、EDP系统的现状与问题分析...................................... 应用情况........................................................ 存在问题........................................................ 三、销售系统分析 ................................................. 应用现状........................................................ 存在问题........................................................ 四、财务系统分析 .................................................

应用现状........................................................ 存在问题........................................................ 五、N OTES办公系统分析............................................. 应用现状........................................................ 存在问题........................................................第二部分:现存问题的原因分析.................................. 一、各子系统内部的缺陷(详见现状分析)............................ 二、企业缺乏一个比较前瞻性的战略,导致信息系统的定位与 规划不明确 ....................................................... 三、子系统之间无法实现信息共享 ................................... 四、缺少一个统一负责信息系统规划和管理的部门,而是分散 在各部门,各司其职,缺乏总体协调 .................................第三部分:上海理光信息系统规划的对策建议...................... 一、信息系统规划的目标 ........................................... 二、信息系统应用系统分析 ......................................... (一)信息系统愿景.............................................. (二)信息系统应用总体结构...................................... (三)订单获取与完成流程........................................ (四)制造与物料流程应用系统.................................... (五)新产品研究与开发流程...................................... (六)售后服务流程应用系统...................................... (七)财务流程应用系统............................................

基于busybox的根文件系统制作

龙源期刊网 https://www.360docs.net/doc/7418543823.html, 基于busybox的根文件系统制作 作者:李飞,武金虎,石颖博 来源:《电脑知识与技术》2010年第17期 摘要:Busybox是构建嵌入式Linux文件系统的必备软件,它是所有文件和设备节点的起始点,是决定系统能否正常启动的关键。通过busybox-1.1.3为例,进行配置、编译、安装等过程,从而形成简单的根文件系统映像文件,为以后嵌入式Linux系统的移植打下了良好的开端。 关键词:Busybox;嵌入式Linux;Linux操作系统;根文件系统;cramfs 文件系统 中国分类号:TP316.81文献标识码:A文章编号:1009-3044(2010)17-4655-02 Making Root File System Based on Busybox LI Fei, WU Jin-hu, SHI Ying-bo (College of Computer Science and Information, Guizhou University, Guiyang 550025, China) Abstract: Busybox is an essentiaL software to buiLd an embedded Linux fiLe system. It is the starting node point of aLL the fiLes and devices and the key whether the system can have a normaL start. Taking busybox-1.1.3 for exampLe, making a simpLe root image system fiLe by configuration compiLation and instaLLation Lays a good foundation for migration of the embedded Linux system. Key words: busybox; embedded linux; Linux OS; root file system; cramfs file system 1 根文件系统结构 根文件系统是所有文件和设备节点的起始点,包括系统所必须的各种工具软件、库文件、 脚本、配置文件等一系列的文件。一个基本的Linux根文件系统包含有以下的目录:dev、proc、bin、etc、usr、Lib、temp、var、usr等等目录。其中dev是设备文件节点目录,proc是挂载proc文件系统所用的目录,bin目录下面包含了系统的基本命令,etc目录是系统启动脚本所在的目录,Lib是系统默认的动态链接库目录,usr是用户目录,temp是临时目录,用来保存临时文 件,var目录包含系统运行时要改变的数据。以上都是根文件系统所必须的目录 2 Busybox简介 熟练嵌入式Linux的朋友对busybox一定不会陌生,它是标准Linux工具的一个单个可执行实现,被形象的称为嵌入式Linux系统中的“瑞士军刀”,因为它将许多常用的UNIX工具和命令 结合到一个单独的可执行程序中。虽然busybox中的这些工具相对于GNU常用工具功能有所

FAT文件系统原理详细介绍

FAT文件系统原理详细介绍 2012-03-29 23:09 434人阅读评论(0) 收藏举报 FAT文件起源于70年代末80年代初,用于微软的MS-DOS操作系统。它开始被设计成一个简单的文件系统用于小于500K的软件盘。后来被功能被大大增强用于支持越来越大的媒质。现在的文件系统有FAT12,FAT16和FAT32三种子类。 FAT12是最早的一版,主要用于软盘,它对簇的编址采用12bit宽度的数,所以称为FAT12。12bit的地址可以寻址4096个簇,事实上在FAT12中只能寻址4078个簇(在Linux 下可寻址4084个簇),有一些簇号是不能用的,在后面会给出具体的说明。磁盘的扇区是用16bit的数进行计算的,所以磁盘的容量就被局限在32M空间之内。 在FAT16中,采用了16bit宽的簇地址,32bit宽扇区地址。虽然32bit的扇区地址可以寻址2^32*512,约2个TB的容量,但于由规定每簇最大的容量不超过1024*32,所以FAT16文件系统的容量也就限制到了2^16*1024*32,大约2.1GB的空量,并且实际还达不到这个值。 FAT32文件系统使用了32bit宽的簇地址,所以称为FAT32。但在微软件的文件系统中只使用了低28位,最大容量为2^28*1024*32,约8.7TB的空量。有的人认为32bit全用,最大容量为2^32*1024*32,这种说法是不正确的。 虽然FAT32具有容纳近乎8.7TB的容量,但实际应用中通常不使用超过32GB的FAT32分区。WIN2000及之上的OS已经不直接支持对超过32GB的分区格式化成FAT32,但WIN98依然可以格式化大到127GB的FAT32分区,但不推荐这样做。 下面是一个FAT分区的构成概况 需要说明的是: 1.引导扇区和其他保留扇区一起称为保留扇区,而其他保留扇区是可选的,当没有时候,引导扇区后紧跟的就是FAT表1 2.根目录区是仅FAT12/16才有,FAT32的目录项位于数据区。由于FAT12/16的根目录区是一个固定的区域,所以它的根目录的项数是有限制的,意即不能在根录建立超过这个定数的目录项数。 (一)引导扇区与BPB BPB(BIOS Parametre Block)是FAT文件系统中第一个重要的数据结构,它位于该FAT分区的第一个扇区,同时也属于FAT文件系统基本区域的保留区, 在下面的描述中。凡名称以BPB_开头的都是BPB的一部分,凡名称与BS_开头的项

根文件系统移植

实验五根文件系统移植 实验目的: 通过本次实验,使大家学会根文件系统移植的具体步骤,并对根文件系统有更近一步的感官认识。让同学理解由于根文件系统是内核启动时挂在的第一个文件系统,那么根文件系统就要包括Linux启动时所必须的目录和关键性的文件,任何包括这些Linux 系统启动所必须的文件都可以成为根文件系统。 实验硬件条件: 1、实验PC机一台,TINY6410开发板一台 2、电源线,串口线,数据线。 实验软件条件: 1、VMware Workstation, 2、Ubuntu10.04 3、mktools-20110720.tar.gz 4、busybox-1.13.3-mini2440.tgz, 5、SecureCRT以及dnw烧写工具 实验步骤: 一、实验步骤 1.进入rootfs目录,查看压缩文件,具体操作指令如下:

2.发现有两个压缩文件夹,分别进行解压: 3.tar xvzf busybox-1.13.3-mini2440.tgz, 4.tar xvzf mktools-20110720.tar.gz,解压完成后, 5.查看文件夹#ls

二、实验步骤 1.修改架构,编译器#cd busybox-1.13.3/ 2.进入后查看#ls 3.#gedit Makefile 4.修改 164行 CROSS_COMPILE ?=arm-linux- 5.修改190行 ARCH ?= arm 6.保存后,退出!

三、实验步骤 1.修改配置 #make menuconfig 2.若出现如下提示

3.需调整到最大化。

4.把Busybox Settings -----→>Build Option ------→> Build BusyBox as astatic binary (no shared libs) 选择上,其他的默认即可。 然后一直退出,保存即可 5.接着执行 make接着执行 make install 6.最终生成的文件在_install 中 #cd _install

U盘引导根文件系统

1.linux PC机上格式化SD卡 在桌面的PC机上用SD读卡器操作SD卡: 一般情况下PC机上第一个U盘整体设备结点是/dev/sda,第二个是/dev/sdb,在RHEL5下它会被自动mount到/media/disk和/media/disk_1 目录. U盘/dev/sdb上第一个分区是/dev/sdb1,第二是/dev/sdb2 依此类推. 根文件系统采用符号链接等特性,用FAT32是不行的,这里直接采用标准的ext3的文件系统.在实测时,把U盘整个做一个分区做ext3根文件系统.总是出不少问题(可能步骤也不对),因此按网上推荐的,做二个分区,第一个分区采用vfat格式,第二个分区才采用ext3的格式. 1.1 用fdisk分区 执行fdisk /dev/sdb fdisk有如下常用选项 1. 输入m 显示所有命令列示。 2. 输入p 显示硬盘分割情形。 3. 输入a 设定硬盘启动区。 4. 输入n 设定新的硬盘分割区。 4.1. 输入e 硬盘为[扩展]分割区(extend)。 4.2. 输入p 硬盘为[首要]分割区(primary)。 5. 输入t 改变硬盘分割区属性。 6. 输入d 删除硬盘分割区属性。 7. 输入q 结束不存入硬盘分割区属性。 8. 输入w 结束并写入硬盘分割区属性 如果以前U盘有分区,需要输入d命令来依次删除分区,以下执行两次n命令创建一个400M 的FAT分区,以及把剩下的分区设为ext3,最后用w命令把结果保存下来.

Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-1020, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-1020, default 1020): +400M Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (202-1020, default 202): Using default value 202 Last cylinder or +size or +sizeM or +sizeK (202-1020, default 1020): Using default value 1020 Command (m for help): p Disk /dev/sdb: 2041 MB, 2041577472 bytes 63 heads, 62 sectors/track, 1020 cylinders Units = cylinders of 3906 * 512 = 1999872 bytes Device Boot Start End Blocks Id System /dev/sdb1 1 201 392522 b W95 FAT32 /dev/sdb2 202 1020 1599507 83 Linux Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: 设备或资源忙. The kernel still uses the old table. The new table will be used at the next reboot. WARNING: If you have created or modified any DOS 6.x partitions, please see the fdisk manual page for additional information.

FATFS深入理解

一、通过格式化命令-看磁盘文件系统的建立过程 1、添加format命令,单步调试 所有的底层驱动函数都已经准备好。添加格式化命令format后,编译下载。 Format命令的执行主要是调用f_mkfs()函数,下面进行单步调试。 以下主要列出函数的主要执行步骤: res=f_mkfs( 0, 1, 4096 ); //1表示不需要引导扇区。4096是8个扇区。 进入f_mkfs()函数,这里只列出主要执行步骤: if (disk_ioctl(drv, GET_SECTOR_COUNT, &n_part) != RES_OK || n_part < MIN_SECTOR) return FR_MKFS_ABORTED;这个函数调用后,n_part=0x000F,3400 = 996 352,这是SD的总块数。allocsize /= SS(fs); 等于8/*Number of sectors per cluster */ n_clst = n_part / allocsize; //等于0x1E680 = 124 544 簇。 if (n_clst >= 0xFFF5) fmt = FS_FAT32; 所以文件系统确定为FAT32类型。 n_fat = ((n_clst * 4) + 8 + SS(fs) - 1) / SS(fs); 等于0x3CE = 974,表示FAT要占据974个扇区。 n_rsv = 33 - partition; 保留扇区32个。 n_dir = 0; b_fat = b_part + n_rsv; /* FATs start sector 32扇区*/ b_dir = b_fat + n_fat * N_FATS; /* Directory start sector 0x3EE =1006,由于FAT表个数设为1个,所以目录区=FAT起始+FAT占用扇区数*/ b_data = b_dir + n_dir; /* Data start sector */ 以上三项确定FAT区域、根目录区、数据区的起始扇区。 disk_ioctl(drv, GET_BLOCK_SIZE, &n) != RES_OK,这个函数调用没有正确返回可擦出扇区的总数。接下来程序会出错,因此退出,修改disk_ioctl()函数后,再次分析。把这个函数返回值直接改为32。并且把FAT表的个数定义为2. N_FATS改为2后,根目录区、数据区的起始扇区的起始扇区变为0x7BC=1980扇区。继续往下执行。 n = (b_data + n - 1) & ~(n - 1); n_fat += (n - b_data) / N_FATS;这两句话对fat所占扇区数进行了修正,保证擦除时,以32个扇区为一个单位。 n_clst = (n_part - n_rsv - n_fat * N_FATS - n_dir) / allocsize; =0x1E588。 tbl = fs->win; /* Clear buffer */ mem_set(tbl, 0, SS(fs)); 清零文件系统缓冲区。 mem_set(tbl, 0, SS(fs)); ST_DWORD(tbl+BS_jmpBoot, 0x90FEEB); /* Boot code (jmp $, nop) */ ST_WORD(tbl+BPB_BytsPerSec, SS(fs)); /* Sector size */ tbl[BPB_SecPerClus] = (BYTE)allocsize; /* Sectors per cluster */ ST_WORD(tbl+BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */ 上面的工作主要是填充引导扇区缓冲区,也就是常说的DBR扇区缓冲,等所有的参数写好,就可以写回磁盘。 ST_WORD(tbl+BS_55AA, 0xAA55); /* Signature */ if (disk_write(drv, tbl, b_part+0, 1) != RES_OK) return FR_DISK_ERR; //这就是在写有效引导标志sec[510]=0x55, sec[511]=0xAA。 if (fmt == FS_FAT32) disk_write(drv, tbl, b_part+6, 1); //FAT32在第六扇区有个备份引导扇区。 for (m = 0; m < N_FATS; m++) { mem_set(tbl, 0, SS(fs)); /* 1st sector of the FAT */ if (fmt != FS_FAT32) { n = (fmt == FS_FAT12) ? 0x00FFFF00 : 0xFFFFFF00; n |= partition; ST_DWORD(tbl, n); /* Reserve cluster #0-1 (FAT12/16) */ } else { ST_DWORD(tbl+0, 0xFFFFFFF8); /* Reserve cluster #0-1 (FAT32) */

FATFS文件系统移植和应用

FATFS文件系统的移植 作者:LJ 时间:2010年11月12日 随着信息技术的发展,目前常用文件系统主要有微软的FAT12、FAT16、FAT32、NTES文件系统,以及Linux系统的EXT2、EXT3等。由于Windows操作系统的广泛应用,当前很多嵌入式产品中用的最多的还是FAT文件系统。所以,选择一款容易移植和使用,并且占用资源少而功能全面的文件系统就显得非常重要了。 FATFS文件系统是一个完全免费且开源的FAT文件系统模块,由小日本工程师编写,它支持FAT12、FAT16和FAT32文件系统,专门为小型的嵌入式系统而设计。模块用标准的C语言编写,可以很容易地移植到各种硬件平台。 在“驱动程序”文件夹中有一个“FatFs R0.07c”文件夹,这是官方提供的FATFS文件系统的源码和文档,版本为R0.07c。打开“doc”文件夹下的“00index_e.html”英文网页文档,里面有FATFS文件系统的全部API函数说明,相对应的应用实例和如何编写硬件接口程序的说明。如果您的英文不怎么好,建议您先装一个有道词典,使用屏幕取词功能,能帮助我们阅读和理解。“00index_j.html”则是日文版的网页,毕竟是小日本写的。“src”文件夹存放有FATFS文件系统源码,下面是该文件夹下各个文件或文件夹存放的内容说明:“ff.h”文件:FATFS文件系统的配置和API函数声明; “ff.c”文件:FATFS源码;

“diskio.h”文件:FATFS与存储设备接口函数的声明; “diskio.c”文件:FATFS与存储设备接口函数; “integer.h”文件:FATFS用到的所有变量类型的定义; “option”文件夹:存放一些外接函数,下一实例有实际的讲解; “00readme.txt”文件:FATFS版本及相关信息说明; 编译工程,没有通过,根据编译信息提示在“diskio.c”文件中在几个函数没有定义。这很正常,因为我们还没有编写文件系统与存储设备的接口函数。下面来分析“diskio.c”文件中各个函数的功能:“DSTATUS disk_initialize ( BYTE drv )”是存储媒介的初始化函数,由于我们使用的是SD卡,所以实际上是对SD卡的初始化; “DSTATUS disk_status ( BYTE drv )”状态检测函数,检测是否支持当前的存储设备,支持返回0; “DRESULT disk_read (BYTE drv, BYTE *buff, DWORD sector, BYTE count)”是读扇区函数,drv是要读扇区的存储媒介号,*buff 存储读取的数据,sector是读数据的开始扇区,count是要读的扇区数。在SD卡的驱动程序中,分别提供了读一个扇区和读多个扇区的函数。当count == 1时,用读一个扇区函数;当 count > 1时,用读多个扇区的函数,这样提高了文件系统读效率。操作成功返回0。 “DRESULT disk_write(BYTE drv, BYTE *buff, DWORD sector, BYTE count)”写扇区函数,drv是要写扇区的存储媒介号,*buff存储写入的数据,sector是写开始扇区,count是要写的扇区数。同样在SD卡的驱动程序中,分别提供了写一个扇区和写多个扇区的函数。

系统分析与设计报告

系统分析与设计报告 撰写要求 实验报告撰写的基本要报告原则上不少于4000字,需在封面注明设计选题、班级、姓名、学号及课题设计日期、地点,其正文至少包括如下几个面的容: (1)企业简介和系统可行性分析 (2)系统分析部分 1)组织结构图 2)管理功能图 3)业务流程图 4)数据流程图 5)数据字典 6)数据加工处理的描述 7)管理信息系统流程设想图(新系统模型) (3)系统设计部分 1)功能结构图设计 2)新系统信息处理流程设计 3)输出设计(主要指打印输出设计) 4)存储文件格式设计(数据库结构设计) 5)输入设计(主要指数据录入卡设计) 6)代码设计(职工证号和部门代号等) 7)程序设计说明书 (4)系统实施部分(信管班需写此部分容,非信管班不作要求) 1)程序框图 3)模拟运行数据 4)打印报表 5)系统使用说明书 (5)附录或参考资料

案例: 东红照明有限公司 库存管理信息系统的分析、设计和实施 说明:本例时间较早,开发工具选用VFP。在学习过程中,可以现有的硬件和软件环境进行系统再开发实现,学习重点放在在系统分析、系统设计实际过程、法及容。 这里给出一个库存管理信息系统开发的实例,目的是使大家进一步深入了解开发任一个管理信息系统必须经历的主要过程,以及在开发过程的各个阶段上开发者应当完成的各项工作容和应当提交的书面成果。 一、东红照明有限公司产品库存管理系统简介 东红照明有限公司是我国东北地区一家生产照明灯的老企业,每年工业产值在四千万元左右。该厂目前生产的产品如表l所示。 表1 某厂产品品种规格、单价及定额储备

工厂的产品仓库管理组隶属于销售科领导,由七名职工组成,主要负责产品的出入库管理、库存帐务管理和统计报表,并且应当随时向上级部门和领导提供库存查询信息。为了防止超储造成产品库存积压,同时也为了避免产品库存数量不足而影响市场需求,库存管理组还应该经常提供库存报警数据(与储备定额相比较的超储数量或不足数量)。 产品入库管理的过程是,各生产车间随时将制造出来的产品连同填写好的入库单(入库小票)一起送至仓库。仓库人员首先进行检验,一是抽检产品的质量是否合格,二是核对产品的实物数量和规格等是否与入库单上的数据相符,当然还要校核入库单上的产品代码。检验合格的产品立即进行产品入库处理,同时登记产品入库流水帐。检验不合格的产品要及时退回车间。 产品出库管理的过程是,仓库保管员根据销售科开出的有效产品出库单(出库小票)及时付货,并判明是零售出库还是成批销售出库,以便及时登记相应的产品出库流水帐。 平均看来,仓库每天要核收三十笔入库处理,而各种出库处理约五十笔。每天出入库处理结束后,记帐员就根据入库流水帐和出库流水帐按产品及规格分别进行累计,以便将本日发生的累计数填入库存台帐。 产品入库单如表2所示,出库单如表3所示,入库流水帐如表4所示,出库流水帐如表5和表6所示,而库存台帐帐页如表7所示。 产品库存的收发存月报表是根据库存台帐制作出来的。产品库存查询是通过翻阅几本帐之后实现的。目前库存报警功能尚未实现。 表2 产品入库单第册号 表3产品出库单第册号 表4 产品入库流水帐页 表5产品零售出库流水帐页 表6产品批发出库流水帐页

FATFS文件系统剖析1

FATFS文件系统剖析1: FAT16: 数据按照其不同的特点和作用大致可分为5部分:MBR区、DBR区、FAT区、DIR区和DATA区,相比fat12多了DBR区 Main boot record: MBR(0--1bdh)磁盘参数存放 DPT(1beh--1fdh)磁盘分区表 55,aa 分区结束标志 DBR(Dos Boot Record)是操作系统引导记录区的意思 FAT区(有两个,一个备份):对于fat16,每一个fat项16位,所以可寻址的簇项数为65535(2的16次方)。而其每簇大小不超过32k,所以其每个分区最大容量为2G。fat32,每一个fat项32位,可寻址簇数目为2的32次方。 DIR区(根目录区):紧接着第二FAT表(即备份的FAT表)之后,记录着根目录下每个文件(目录)的起始单元,文件的属性等。定位文件位置时,操作系统根据DIR中的起始单元,结合FAT表就可以知道文件在硬盘中的具体位置和大小了。 DATA区:实际文件内容存放区。 FAT32: 暂时放在这里,不讨论! Fatfs:嵌入式fat文件系统,支持fat16,fat32。 包含有ff.h,diskio.h,integer.h,ffconf.h 四个头文件以及ff.c 文件系统实现。当然要实现具体的应用移植,自己要根据diskio.h实现其diskio。c 底层驱动。 diskio.h : 底层驱动头文件 ff.h : 文件系统实现头文件,定义有文件系统所需的数据结构 ff.c : 文件系统的具体实现

如下开始逐个文件加以分析: integer.h :仅实现数据类型重定义,增加系统的可移植性。 ffconf.h : 文件系统配置---逐个配置,先配置实现一个最小的fat文件系统,下面来分析各配置选项: #define _FFCONF 8255 //版本号 #define _FS_TINY 0 /* 0:Normal or 1:Tiny */ //在这里与先前版本有些许变化,是通过配置头配置两种不同大小的文件系统,这里配置为0。 #define _FS_READONLY 1//定义文件系统只读,也就不能写修改,在此定义为1,这样文件系统会大大缩小,简化学习理解过程。 #define _FS_MINIMIZE 3 /* 0 to 3 */ 这个选项是用于过滤掉一些文件系统功能,为0时是全功能,3是功能实现最小 #define _USE_STRFUNC 0 /* 0:Disable or 1/2:Enable */ 是否使用字符串文件接口,为0,不使用 #define _USE_MKFS 0 /* 0:Disable or 1:Enable */ 制作文件系统,这个功能实现是还要_FS_READONLY=0 #define _USE_FORWARD 0 /* 0:Disable or 1:Enable */ f_forward function 实现还需_FS_TINY =1 #define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */ 快速查找功 能 #define _CODE_PAGE 936 // 936 - Simplified Chinese GBK (DBCS, OEM, Windows) #define _USE_LFN 0/* 0 to 3 */ 0:不使用长文件名 #define _MAX_LFN 255/* Maximum LFN length to handle (12 to 255) */ #define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */

相关文档
最新文档