MTD块设备的驱动程序在mtdblock.c文件中实现。MTD块设备使用mtd_blktrans_dev描述。该结构将MTD原始设备(mtd_info)与存储分区(gendisk)联系在一起。
下面介绍MTD块设备注册过程。首先注册MTD块传输。
register_mtd_blktrans函数中调用了register_blkdev函数注册块设备:
从上面可见,注册mtdblock_tr时调用了mtdblock_tr结构的add_mtd成员函数,也就是mtdblock_add_mtd函数。
MTD层有一个mtd_notifier结构,用于描述MTD通知链。
register_mtd_blktrans函数中添加了一个名为blktrans_notifier的mtd_notifier。
跟踪blktrans_notify_add发现,该函数调用了mtd_blktrans_ops的add_mtd成员,实际上就是mtdblock_add_mtd。
另外MTD原始设备添加函数add_mtd_device(见上文)会调用内核中所有mtd_notifier结构的add接口,所以也会调用mtdblock_add_mtd:(www.xing528.com)
也就是说,添加MTD原始设备时必定会调用mtdblock_tr的add_mtd成员(mtdblock_add_mtd)。mtdblock_add_mtd函数代码如下:
mtdblock_add_mtd函数调用add_mtd_blktrans_dev为MTD原始设备添加了一个分区(gendisk),这就是MTD块设备的由来。
MTD块设备节点一般类似于/dev/mtdblockn。加载MTD设备就是对MTD块设备进行操作。MTD分区的定义类似下面代码:
分区信息包含了起始地址、分区大小、分区读写标志等。MTDPART_OFS_APPEND表示从上一分区结束处开始。mtd_add_device_partitions函数为MTD设备添加分区:
static int mtd_add_device_partitions(struct mtd_info*mtd,struct mtd_partitions*parts);
进一步分析mtd_add_device_partitions函数,可发现存在如下调用关系:mtd_add_device_ partitions->add_mtd_partitions->add_mtd_device。add_mtd_device函数在MTD设备驱动中扮演重要角色,负责创建MTD字符设备与MTD块设备。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。