嵌入式Linux文件系统知多少
Nand/Nor Flash
在嵌入式Linux产品中,通常使用的存储介质为Nand Flash和Nor Flash,而手机、相机等产品通常使用eMMC、SD Card作为存储介质,导致这种差异的原因主要是成本考量。
Nand Flash和Nor Flash具有低成本、高密度存储的优势。但是,它们在读写操作上又有各自的限制。Nand Flash和Nor Flash都没有片内FTL(Flash Transfer Layer)层,换句话说,它们都是raw flash。也就是说,本质上它们都是字符设备。未填写数据的时候,所有位都是高电平;写操作是将高电平变为低电平;只有擦操作才能将低电平变为高电平。所以Nand Flash和Nor Flash的写操作都只能通过先擦除再写入完成,读操作没有限制。
Nand Flash通常用来存储数据,它通过页(Page)和块(Block)两级结构组成,页大小通常为512Byte,类似于磁盘,块大小为8~32KB。读取和写入以页为单位进行,擦操作以块为单位进行。另外,针对每一页有16字节的OOB区,用来存放额外的信息以及ECC纠错码。Nand Flash比较容易出现坏块,其生命周期是擦写100万次。
Nor Flash通常用来存代码,因为它具有XIP(eXecute In Place)的特性,即片上执行,CPU可以把它当RAM使用,同时它也可以保存数据。Nor Flash的页大小通常为32Byte,块大小为128KB,芯片内部包含512Byte的写缓冲区。Nor Flash具有随机读和页读两种方式,擦除操作则是以块为单位,即128KB。Nor Flash在擦除操作之前,必须对每一位写0。Nor Flash的读速度比Nand Flash快,擦除和写入速度则比Nand Flash慢。另外,Nor Flash没有芯片内部的坏块处理,因为它比较少出现坏块,其生命周期是擦写10万次。
MTD(Memory Technology Devices)
MTD子系统在raw flash上提供了一层抽象层,并提供统一的API接口给文件系统层,这样文件系统就不用关心实际的Flash类型是Nand Flash还是Nor Flash。
MTD子系统有以下三种接口:
1) mtd字符设备:/dev/mtd0, /dev/mtd1等,通常包括一组ioctl进行读取、擦除、写入、标记坏块、获取flash信息等操作
2) sysfs 参考Documentation/ABI/testing/sysfs-class-mtd
3) /proc/mtd
MTD子系统给文件系统层提供的API都在include/linux/mtd/mtd.h中描述,其中最重要的是mtd_info结构体。内核3.4版本之前,文件系统层通过mtd_info的成员函数指针调用接口函数;内核3.4版本以后,通过mtd.h文件中声明的mtd_read() mtd_write()等函数实现。
MTD既可以是字符设备,也可以是块设备。
mtdblock驱动是一个过时的工具,用来在mtd设备之上模拟块设备。它不进行坏块处理,所以不能用于Nand Flash。它的工作原理是通过缓存数据块来实现,修改操作在内存中缓存的数据块进行,然后擦除实际物理块,再将缓存的数据写入物理块。这样会出现掉电的时候,数据丢失的现象。另外,它也不进行wear-leveling和bit-flips(位反转)处理。通常将mtdblock理解为FTL层,其实这种认知是错误的,尽量不要使用mtdblock,除非你知道自己在干什么。

YAFFS/JFFS2/SQUASHFS/UBIFS
文件系统
mkimage
uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。
为什么uboot下会有这个工具呢?因为bootloader的类型有很多种,不同的bootloader在加载和启动内核时的方式大体上一致,但是具体实施上有细微的区别,mkimage的目的是在linux内核镜像文件(zImage)的基础上加上一段uboot可以识别的头部信息用来解析和加载内核镜像,通常最终生成的镜像文件名为uImage。该头部信息大小为0x40字节,记录mkimage参数所指定的信息,比如CPU体系结构、OS类型、镜像文件类型、内核镜像加载到内存的地址、压缩格式等。
Usage: ./mkimage -l image
-l ==> list image header information
./mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp' //压缩格式,可选none/gzip/bzip2
-a ==> set load address to 'addr' (hex) //内核加载到内存的地址
-e ==> set entry point to 'ep' (hex) //内核加载到内存的地址+0x40 (跳过0x40的头部,该参数可以忽略)
-n ==> set image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
./mkimage [-D dtc_options] -f fit-image.its fit-image
./mkimage -V ==> print version information and exit
参数说明:
-A 指定CPU的体系结构:
取值 表示的体系结构
alpha Alpha
arm A RM
x86 Intel x86
ia64 IA64
mips MIPS
mips64 MIPS 64 Bit
ppc PowerPC
s390 IBM S390
sh SuperH
sparc SPARC
sparc64 SPARC 64 Bit
m68k MC68000
-O 指定操作系统类型,可以取以下值:
openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos
-T 指定映象类型,可以取以下值:
standalone、kernel、ramdisk、multi、firmware、、filesystem
-C 指定映象压缩方式,可以取以下值:
none 不压缩
gzip 用gzip的压缩方式
bzip2 用bzip2的压缩方式
-a 指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage制作映象时,这个参数所指定的地址值来下载
-e 指定映象运行的入口点地址,这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头)
-n 指定映象名
-d 指定制作映象的源文件
示例:mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage zImage.img
vmlinux/Image/zImage
LD vmlinux 内核编译完成之后,链接各目标文件,生成ELF格式vmlinux
SYSMAP System.map
SYSMAP .tmp_System.map
OBJCOPY
arch/arm/boot/Image 通过objcopy提取vlinux中的代码段和数据段并打包生成arch/arm/boot/Image
Kernel:
arch/arm/boot/Image is ready
AS arch/arm/boot/compressed/head.o
GZIP
arch/arm/boot/compressed/piggy.gz
AS arch/arm/boot/compressed/piggy.o
CC
arch/arm/boot/compressed/misc.o
AS
arch/arm/boot/compressed/head-xscale.o
LD
arch/arm/boot/compressed/vmlinux 通过gzip压缩arch/arm/boot/Image并添加解压程序等生成ELF格式的arch/arm/boot/compressed/vmlinux
OBJCOPY
arch/arm/boot/zImage 通过objcopy提取arch/arm/boot/compressed/vmlinux中的代码段和数据段生成可以放在内存任意地址直接执行的arch/arm/boot/zImage
嵌入式Linux文件系统知多少的更多相关文章
- 制作嵌入式linux文件系统(ramdisk,cramfs,squashfs)
转:http://blog.csdn.net/zyb19831212/article/details/1887930 一.什么是文件系统 (Filesystem): A directory struc ...
- 【嵌入式 Linux文件系统】如何使用Initramfs文件系统
(1)#cd ../rootfs/ #ln -s ./bin/busybox init 创建软链接 (2)进入Linux内核 #make menuconfig General setup-->I ...
- 【嵌入式 Linux文件系统】如何使用NFS文件系统
(1)内核配置 取消选项 General setup-->Initial RAM filesystem and RAM disk (initramfs/initrd) support 进入Fil ...
- X86平台下嵌入式linux触摸屏解决方案(usb触摸屏控制器+完美校准方案+触摸屏QTE开发环境搭建)
一直在用X86平台,真心不想用WINCE和XPE,一些大的硬件供应商都不提供linux平台下的技术支持,比如研华的3343PC104系列的板子... 开发的问题如下: 1 USB控制器目前只有台湾和竹 ...
- 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)
深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...
- 【转】嵌入式Linux文件系统启动脚本及分析
原文网址:http://www.linuxidc.com/Linux/2011-03/33728.htm 在内核初始化完成后,嵌入式linux 文件系统的启动过程主要包含以下几个步骤: 1. 执行/s ...
- 嵌入式linux加载引导内核和根文件系统的方法
总体来说,嵌入式Linux内核和根文件的引导与PC机差不多.嵌入式linux内核和根文件系统可以存放在各种可能的存储设备中,一般情况下我 们将内核和根文件系统直接烧入到Flash中(包括NOR和NAN ...
- 嵌入式linux内核制作、根文件系统制作
嵌入式系统构成: 主要由bootloader.kernel.以及根文件系统三部分组成. 内核制作步骤: 制作嵌入式平台使用的linux内核制作方法与pc平台上的linux内核基本一致 1.清除原有配置 ...
- 嵌入式Linux内核+根文件系统构建工具-Buildroot 快速入手指导【转】
本文转载自:https://my.oschina.net/freeblues/blog/596448 嵌入式Linux内核+根文件系统构建工具-Buildroot 快速入手指导 buildroot 是 ...
随机推荐
- npm errno -4048错误
这种错误是缓存原因导致的,首先清除缓存 npm cache clean --force 然后校验缓存依赖的完整和有效性 npm cache verify 最后重新安装即可
- java学习day1
一.常用的DOS命令 1.打开cmd 窗口键+r --> 输入cmd --> 确认 2.常用的dos命令 dir:列出当前目录下的所有文件及文件夹 md:创建一个新的目录 rd:删除目录 ...
- python中输入某年某月某日,判断这一天是这一年的第几天?
输入某年某月某日,判断这一天是这一年的第几天?程序分析 特殊情况,闰年时需考虑二月多加一天: 直接上代码 #定义一个函数,判断是否为闰年 def leapyear(y): return (y % 40 ...
- 发布一本用 GitBook 编辑的书
在上一篇的文章里,我们已经写好了一本名叫 erdong-first-book 的书,但是在本地浏览很不方便,我们希望放到网络上,可以随时.方便的访问这个书籍.这个需求可以使用多种方式来实现,比如第一种 ...
- 如何将DataTable转换成List<T>
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- 如何在github上部署自己的前端项目
很多时候我们想需要一个地址就可以访问自己的前端作品, 但是注册一个服务器和域名是需要花钱,很多小伙伴都不愿意, 其实这种前端静态页面github就可以帮我们预览其效果,而且只要在有网的情况下都可以访问 ...
- RSA 非对称加密算法简述
RSA概述 首先看这个加密算法的命名.很有意思,它其实是三个人的名字.早在1977年由麻省理工学院的三位数学家Rivest.Shamir 和 Adleman一起提出了这个加密算法,并且用他们三个人姓氏 ...
- python 写matlab中的加性高斯白噪声AWGN
定义 原始信号:x 噪声信号:n 信噪比:SNR 信号长度:N def wgn(x, snr): snr = 10**(snr/10.0) xpower = np.sum(x**2)/len(x) n ...
- 正确理解MySQL中的where和having的区别
原文:https://blog.csdn.net/yexudengzhidao/article/details/54924471 以前在学校里学习过SQLserver数据库,发现学习的都是皮毛,今天以 ...
- L5 Swagger 使用说明
网上看了看,关于这个扩展介绍很少.今天工作恰好用到,研究了一下,觉得有必要分享一下. 一. 简介: 这个包是Swagger-php和Swagger-ui的封装,适用于Laravel5. 二.版本要求 ...