一、MTD子系统概述

  MTD(Memory Technology Device, 内存技术设备)是用于访问memory 设备 (ROM、FLASH)的Linux子系统。

  主要目的是为了使新的memory设备的驱动更加简单,为此MTD在硬件和上层之间提供了一个抽象的接口。

  Linux系统中,MTD设备分为四层:设备节点、MTD设备层、MTD原始设备层、硬件驱动层

1.1 FLASH硬件设备层

  主要为FLASH芯片提供最底层的硬件驱动。此层提供了3个重要结构体:

  (1) struct map info

  用来描述具体芯片的基本信息,主要包括芯片名字、大小、位宽、芯片、在系统中的起始物理地址等,在具体的芯片驱动文件中定义。

  (2) struct mtd partition

  用来描述具体芯片的分区信息, 主要包括分区名字起始地址和分区的大小,在其体的芯片驱动文件中定义。

  (3) struct mtd chip driver.

  用于描述具体FLASH芯片的驱动数据结构,分别代表遵循具体标准的FLASH芯片驱动。

1.2 MTD原始设备层

  MTD原始设备层主要源码文件为mtd/mtdcore.c、 mtd/mtdpart.c

  MTD原始设备层主要提供此公共接口函数供其他MTD子系统模块调用,例如,add_mtd_device、 register_mtd_user等函数。

  描述MTD原始设备的数据结构体为struct mtd_info,mtd_table则表示所有的MTD原始设备列表。

1.3  MTD设备层

  为了使上层应用程序更方使地访问MTD原始设备,Linux 系统基于MTD原始设备定义了MTD的块设备(主设备号31)和字符设备(设备号90),

  这样上层应用程序就可以像访间字符设备或块设备样访问 MTD原始设备,也就是可以把Nor FLASH或Nor FLASH的一个分区当做字符设备或块设备来访问。

  MTD设备层的源码文件主要有mtd/mtdchar.c、mtd/mtd_blkdevs.c、 mtd/mtdblock.c

1.4  MTD字符设备

  MTD字符设备层的源码文件为md/mtdcha.c.

  该源码文件为MTD原始设备提供了一个字符设备访间接口,使得上层应用程序可以以字符设备的方式来访问MID原始设备。

  mtd/mdchar.c 和其他的字符设备驱动文件一样, 主要定义了一个字符设备访问文件操作函数和向内核注册了一个字符设备,MTD字符设备的主设备号为90,源码如下:

#define MTD_CHAR_MAJOR   90
#define MTD_BLOCK_MAJOR 31 static const struct file_operations mtd_fops = {
.owner = THIS_MODULE,
.llseek = mtd_lseek,
.read = mtd_read,
.write = mtd_write,
.ioctl = mtd_ioctl,
.open = mtd_open,
.release = mtd_close,
};

  以上代码定义了一个MTD字符设备的设备文件接口操作函数,接着在模块初始化函数中注册MTD字符设备:

static int __init init_mtdchar(void)
{
if (register_chrdev(MTD_CHAR_MAJOR, "mtd", &mtd_fops)) {
printk(KERN_NOTICE "Can't allocate major number %d for Memory Technology Devices.\n",
MTD_CHAR_MAJOR);
return -EAGAIN;
} register_mtd_user(&notifier);
return ;
}

 1.5 MTD 块设备

  Mtd/mtd_blkdevs.c 源码文件提供了MTD转换层与块设备之间的接口。

  该文件定义了块设备访问接口函数:

struct block_device_operations mtd_blktrans_ops = {
.owner = THIS_MODULE,
.open = blktrans_open,
.release = blktrans_release,
.ioctl = blktrans_ioctl,
.getgeo = blktrans_getgeo,
};

  Add_mtd_blktrans_dev函数用来将一个 MTD转换层设备注册到内核中,每一个MTD转换层设备都对应个通用磁盘设备,Add_mtd_blktrans_dev 函数针对一个MTD转换层设备分配了一个磁盘设备结构体,并调用函数add_disk 注册磁盘设备到内核中。

  块设备、磁盘设备、MTD转换层设备、MTD原始设备的关系如下图所示。

  从图中可以看出,MTD转换层设备包含了MTD原始设备,磁盘设备包含了转换层设备,块设备又包含了磁盘设备。它们之间是一种类似的继承关系。

  Mtd/mtdblock.c源码文件实现了MTD块设备层驱动,下面分析该源码文件的架构。

  mtdblock.c主要定义了一个转换层设备操作函数接口,代码如下:

 static struct mtd_blktrans_ops mtdblock_tr = {
.name = "mtdblock",
.major = ,
.part_bits = ,
.blksize = ,
.open = mtdblock_open,
.flush = mtdblock_flush,
.release = mtdblock_release,
.readsect = mtdblock_readsect,
.writesect = mtdblock_writesect,
.add_mtd = mtdblock_add_mtd,
.remove_dev = mtdblock_remove_dev,
.owner = THIS_MODULE,
};

  然后在入口函数中调用register_mtd_blktrans(&mtdblock_tr) 注册一个转换层设备。

static int __init init_mtdblock(void)
{
return register_mtd_blktrans(&mtdblock_tr);
}

  在register_mtd_blktrans函数中,对于每一个MTD原始设备,都会构造一个MTD转换层设备和对应的磁盘设备,然后把磁盘块设备注册到内核中(add_mtd_blktrans_devs)。

  当应用程序访问MTD块设备时,先访问磁盘设备,然后找到对应的转换层设备,最终执行转换层设备对应的操作函数。

1.6 MTD块设备函数调用关系:

 (1)应用程序通过open命令打开一个MTD块设备,如open(“mtdblock1”)。

  (2)系统通过 struct block_device_operations mtd_blktrans_ops 操作接口找到对应的 open 函数为 blktrans_open,如执行blktrans_open函数。

  (3)在blktrans_open 函数中,根据·块设备找到磁盘设备、MTD转换层设备,然后找到MTD转换层设备的操作函数 mtdblock_open。

 (4)执行MTD转换层设备操作函数mtdblock_open。

二、MTD 子系统主要数据结构

重要的数据结构:

  1. mtd_info  表示mtd原始设备, 所有mtd_info结构体被存放在mtd_info数组mtd_table中
  2. mtd_part  表示MTD分区,其中包含了 mtd_info,每一个分区都是被看成一个MTD 原始设备
  3. map_info 描述芯片的基本信息,主要包括芯片名字,大小、位宽、起始地址

  在mtd_table中,mtd_part.mtd_info中的大部分数据都从该分区的主分区mtd_part->master中获得 
  tip: master 不作为一个mtd原始设备加入 mtd_table

  各层之间的交互如下图

Linux MTD 子系统的更多相关文章

  1. Linux MTD子系统 _从模型分析到Flash驱动模板

    MTD(Memory Technology Device)即常说的Flash等使用存储芯片的存储设备,MTD子系统对应的是块设备驱动框架中的设备驱动层,可以说,MTD就是针对Flash设备设计的标准化 ...

  2. Linux MTD (Memory Technology Device) subsystem analysis -For Atheros char device

    Linux MTD (Memory Technology Device) subsystem analysis For Atheros char device 读了Linux MTD 源代码分析 对这 ...

  3. linux输入子系统(input subsystem)之evdev.c事件处理过程

    1.代码 input_subsys.drv.c 在linux输入子系统(input subsystem)之按键输入和LED控制的基础上有小改动,input_subsys_test.c不变. input ...

  4. Linux 网络子系统

    今天记录一下Linux网络子系统相关的东西. 因为感觉对这一块还是有一个很大的空白,这件事情太可怕了. 摘抄多份博客进行总结一下Linux网络子系统的相关东西. 一. Linux网络子系统体系结构 L ...

  5. Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现

    转自:http://blog.csdn.net/droidphone/article/details/8074892 上一篇文章,我介绍了传统的低分辨率定时器的实现原理.而随着内核的不断演进,大牛们已 ...

  6. Linux输入子系统(转)

    Linux输入子系统(Input Subsystem) 1.1.input子系统概述 输入设备(如按键,键盘,触摸屏,鼠标等)是典型的字符设备,其一般的工作机制是低层在按键,触摸等动作发生时产生一个中 ...

  7. Linux VM子系统参数调整

    Timesten数据库下的Linux page子系统参数调整  如果Timesten(TT)采用了Durablecommits或是share memory segment被lock的话,那么linux ...

  8. 【转】 linux iio子系统

    原文网址:http://blog.csdn.net/tsy20100200/article/details/47101661 最近由于工作的需要,接触了Linux iio子系统,对于这个目录其实以前是 ...

  9. Linux输入子系统(Input Subsystem)

    Linux输入子系统(Input Subsystem) http://blog.csdn.net/lbmygf/article/details/7360084 input子系统分析  http://b ...

随机推荐

  1. Debian9.5 WPS for Linux字体配置(字体缺失解决办法)

    启动WPS for Linux后,出现提示"系统缺失字体" . 出现提示的原因是因为WPS for Linux没有自带windows的字体,只要在Linux系统中加载字体即可. 具 ...

  2. 阿里云slb上传证书错误

    阿里云上传证书错误 今天在阿里云给slb上传新买的证书,传的过程中报错了,如下: 网上找了半天没找到,鼠标放在错误哪行行首,会报一个错 大意就是一行最多64个字符,我检查了下,报错这行是68个字符,于 ...

  3. 记intel杯比赛中各种bug与debug【其一】:安装intel caffe

    因为intel杯创新软件比赛过程中,并没有任何记录.现在用一点时间把全过程重演一次用作记录. 学习 pytorch 一段时间后,intel比赛突然不让用 pytoch 了,于是打算转战intel ca ...

  4. linux命令find命令详解

    find 查找文件 find 哪里 什么类型 什么名字 -maxdepth 最大的深度 查找目录的最大深度    find -maxdepth 1 -type d -type 找什么类型的 f fil ...

  5. 文件的默认权限:umask

    1. 文件的默认权限 linux下当我们新建一个文件和文件夹时,该文件和文件夹的默认权限是什么? 通过umask命令来查看: $ umask 0002 $ umask -S u=rwx,g=rwx,o ...

  6. C++学习笔记11-面向对象2

     1.  仅仅能初始化直接基类 一个类仅仅能初始化自己的直接基类.直接就是在派生列表中指定的类.假设类C 从类B 派生,类B 从类A 派生,则B 是C 的直接基类.尽管每一个C 类对象包括一个A 类部 ...

  7. 找出一堆数中最小的前K个数

    描写叙述: 给定一个整数数组.让你从该数组中找出最小的K个数 思路: 最简洁粗暴的方法就是将该数组进行排序,然后取最前面的K个数就可以. 可是,本题要求的仅仅是求出最小的k个数就可以,用排序能够但显然 ...

  8. modSecurity规则学习(四)——规则指令编写

    规则语言是使用9个指令实现: 语法:SecRule VARIABLES OPERATOR [TRANSFORMATION_FUNCTIONS, ACTIONS] Variables 以下几种: Reg ...

  9. poj--1637--Sightseeing tour(网络流,最大流判断混合图是否存在欧拉图)

    Sightseeing tour Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u Sub ...

  10. ToF相机学习笔记之基本知识

    ToF相机属于一种非接触式光学传感器,通过计算发射激光的飞行时间获取对应像素的深度信息.就非接触式距离测量方法而言,其分类可用下表表示如下: 1.1 ToF传感器基础 一个逐点式的ToF传感器采用了雷 ...