MTD系统结构

306 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第28天,点击查看活动详情

Linux内核MTD设备相关代码在drivers/mtd目录下,设计MTD的目的是让新的闪存设备使用更简单。MTD设备可以分为4层:

1.设备节点层 通过mknod命令可以在/dev目录下建立MTD字符设备节点(主设备号90)和MTD块节点(主设备号31),通过设备节点可以访问MTD字符设备和块设备。

2.MTD设备层 MTD设备层基于MTD原始设备,向上一层提供文件操作函数,如lseek()、open()、close()、read()、write()等。MTD块设备定义了一个描述MTD块设备的结构mtdblk_dev,并且声明了一个mtdblks数据用于存放系统所有注册的MTD块设备。MTD设备层代码存放在drivers/mtd/mtd_blkdevs.c和drivers/mtd/mtdchar.c文件内。

3.MTD原始设备层 MTD原始设备层由两部分组成,一部分包括MTD原始设备的通用代码,另一部分包括特定的Flash数据,如闪存分区等。MTD原始设备的mtd_info结构描述定义了有关MTD的大量数据和操作函数。 drivers/mtd/mtd_core.c文件定义了mtd_table全局变量作为MTD原始设备列表,drivers/mtd/mtd_part.c文件定义了mtd_part全局变量作为MTD原始设备分区结构,其中包含mtd_info结构。在内核中每个MTD分区都被当做一个MTD原始设备加入mtd_table中进行处理。 drivers/mtd/maps目录存放的是特定的闪存数据,该目录下每个文件都对应一种类型开发板上的闪存。通过调用内核提供的add_mtd_device()函数可以建立一个mtd_info结构并加入到mtd_table中,通过del_mtd_device()函数可以从mtd_table中删除一个闪存设备。

4.硬件驱动层 硬件驱动层负责在系统初始化的时候驱动闪存硬件。Linux内核MTD设备中,NOR Flash设备遵守CFI结构标准,驱动代码存放在drivers/mtd/chips目录下。NAND Flash设备驱动代码存放在drivers/mtd/nand目录下。 Linux内核MTD技术中,比较难理解的是设备层和原始设备层的关系

一个MTD原始设备可以通过mtd_part结构被分成多个MTD原始设备,然后注册到mtd_table中。mtd_table列表中,每个MTD原始设备都可以注册为一个MTD设备。其中,字符设备的主设备号是90,次设备号奇数是只读设备,偶数是可读写设备;块设备的主设备号是31,次设备号为连续的自然数。