嵌入式linux系统文件,嵌入式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,除非你知道自己在干什么。

cb27f5f276ff604a037a472cd751ff83.png

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

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

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

相关文章

三分钟上手Highcharts简易甘特图

根据业务需求,找到了这个很少使用的图形,话不多说,看看该如何使用。首先要引入支持文件:可根据链接下载。 exporting.js:https://img.hcharts.cn/highcharts/modules/exporting.js xrange.js:https://img.h…

WEB语义化

WEB语义化让机器读懂内容,HTML就带有一定「语义」的标签,比如段落,标题,表格和图片等。让机器读懂内容,那么两种方案:第一种让机器变得更人工智能化,也就是现在大火的AI。第二种是人们去发布认可…

Jetty 9.1上的Java WebSockets(JSR-356)

最终发布了Jetty 9.1 ,将Java WebSockets(JSR-356)引入了非EE环境。 这真是个好消息,今天的帖子将介绍如何将这个出色的新API与Spring Framework一起使用。 JSR-356定义了基于注释的简洁模型,以允许现代Java Web应用程…

如何用python画组合图形_python结合G2绘制精美图形

$.getJSON(top10.json, function (data) { var Frame G2.Frame; var frame new Frame(data); var chart new G2.Chart({ id: c1, width: 500, height: 400 }); chart.source(frame, { pct: {alias: 年化相对收益率(%)}, }); // 去除 X 轴标题 chart.axis(name, { title: nul…

edup无线网卡驱动安装linux,UBUNTU_15.0.4 usb无线网卡驱动安装方法

前言:为了摆脱网线的束缚,我买了个无线网卡; widnows 上好用,易安装。linux 上,按照自带教程上去做,没有成功。后来在搜索了多篇 解决问题的文章。 再加上自己的方法,终于完成了。貌似信号还可以…

LeetCode Golang 9.回文数

9. 回文数 第一种办法 :itoa 转换为字符串进行处理: package mainimport ("strconv""fmt" )//判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。…

关于使用JQ scrollTop方法进行滚动定位

没图我说个锤子,先来个自拍镇楼。 又到了每周周五总结时间。我广州刘德华又来讲故事了。这一周没啥任务,就一个任务,产品口头交代了两句,也没有psd没有设计图没有样式。自由发挥,你自己敲代码做个作品出来。 what&…

ssh密钥登录

方法一:使用下例中ssky-keygen和ssh-copy-id,仅需通过3个步骤的简单设置而无需输入密码就能登录远程Linux主机。 ssh-keygen 创建公钥和密钥。 ssh-copy-id 把本地主机的公钥复制到远程主机的authorized_keys文件上。ssh-copy-id 也会给远程主机的用户主目录&#x…

Spring REST:异常处理卷。 2

这是有关使用Spring进行REST异常处理的系列的第二篇文章。 在我以前的文章中,我描述了如何在REST服务中组织最简单的异常处理。 这次,我将更进一步,我将向您展示何时最好在ControllerAdvice级别上使用异常处理 。 介绍 在开始本文的技术部分…

python 装饰器有哪些_python装饰器有什么用

简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。 一般而言,我们要想拓展原来函数代码&…

jQuery数据转换与提交

json2.js序列化,即JSON对象转换成String字符串: JSON.stringify({ id: 1, name: jsons });反序列化,即String转JSON对象: JSON.parse("{ id: 1, name: jsons }");jquery.json2xml.jsJSON对象转换为XML字符串: $.json2xml({ id: 1, …

linux中查看相关日志记录,linux重启查看日志及历史记录 查询原因

linux系统文件通常在/var/log中下面是对下面常出现的文件进行解释/var/log/message ---------------------------------------系统启动后的信息和错误日志/var/log/secure ------------------------------------------与安全相关的日志信息/var/log/maillog ------------------…

04,认证、权限、频率

认证组件 Django原生的authentic组件为我们的用户注册与登录提供了认证功能,十分的简介与强大。同样DRF也为我们提供了认证组件,一起来看看DRF里面的认证组件是怎么为我们工作的!models.py# 定义一个用户表和一个保存用户Token的表 class Use…

sun.misc.Unsafe和堆外内存

sun.misc.Unsafe类允许您执行许多Java中不应该做的事情,但是在非常特殊的情况下仍然有用。 必须在99%的时间避免这种情况,但是在极少数情况下,这是唯一有意义的解决方案。 这篇文章考虑了它在OpenHFT中的使用方式以及我希望在Jav…

jq获取input选取的文件名_tushare获取交易数据并可视化分析

获取数据是金融量化分析的第一步,找不到可靠、准确的数据,量化分析就无从谈起。随着信息技术的不断发展,数据获取渠道也越来越多,尤其是Python网络爬虫,近几年愈来愈火。然而,很多人毕竟精力有限&#xff0…

linux电脑做笔记软件,知识管理工具, 自由格式数据库, 笔记软件以及个人信息管理...

myBase Desktop 7.3.5 for Linux/MacOSX/Windows 2020-2-20新增 [数学公式 MathJax for Markdown]、[自动锁屏保护]、[粘贴图片为附件]、[完整复制带图片内容],以及部分问题修订,详见:更新日志;数学公式插件:缺省安装后…

js模板引擎

模板引擎 function tmpl(str, o) {return str.replace(/\\?\{([^{}] )\}/g, function (match, name) {return (o[name] undefined) ? : o[name];});}调用示例 var html tmpl(html, { user_id: user_id, user_name: user_name });更多专业前端知识,请上 【猿204…

原来游戏技术行业最大的秘密竟然是...

欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云社区专栏 本篇文章主要是分享游戏业务面临的安全风险场景,以及基于这些场景的特点,我们应该如何做好对应的防护。 【一、背景:游戏行业DDoS攻击…

Leetcode 565. Array Nesting

题目 链接:https://leetcode.com/problems/array-nesting/ Level: Medium Discription: A zero-indexed array A of length N contains all integers from 0 to N-1. Find and return the longest length of set S, where S[i] {A[i], A[A[i]], A[A[A[i]]], ... }…

指定Gradle构建属性

属性是用于轻松自定义Gradle构建和Gradle环境的宝贵工具。 我将在本文中演示一些用于指定Gradle构建中使用的属性的方法。 Gradle支持项目属性和系统属性 。 这篇文章中有趣的是两者之间的主要区别是如何访问它们。 通过常规Java / Groovy系统属性访问方法访问系统属性时&…