在norflash驅動載入的最後有幾行語句: if (ezkit561_mtd) { ezkit561_mtd->owner = THIS_MODULE; return add_mtd_partitions(ezkit561_mtd, ezkit561_parts, EZKIT561_PART_COUNT); }通過add_mtd_partitions(drivers/mtd/mtdpart.c)函數可以在系統的分區表中添加相應的分區,這樣在需要對分區進行讀寫的時候自然就可以找到相應的mtd並調用其函數來完成相應的操作。/* * This function, given a master MTD object and a partition table, creates * and registers slave MTD objects which are bound to the master according to * the partition definitions. * (Q: should we register the master MTD object as well?) */ int add_mtd_partitions(struct mtd_info *master, const struct mtd_partition *parts, int nbparts){ struct mtd_part *slave; u_int32_t cur_offset = 0; int i; printk (KERN_NOTICE "Creating %d MTD partitions on /"%s/":/n", nbparts, master->name); for (i = 0; i < nbparts; i++) { /* allocate the partition structure */ slave = kmalloc (sizeof(*slave), GFP_KERNEL); if (!slave) { printk ("memory allocation error while creating partitions for /"%s/"/n", master->name); del_mtd_partitions(master); return -ENOMEM; } memset(slave, 0, sizeof(*slave));/* 添加到分區列表中,但在這裡mtd_partitions這個鏈表的作用僅僅是在slave分配失敗時可以刪除已經分配的結構體,對於系統的其它部分沒有任何影響! */ list_add(&slave->list, &mtd_partitions); /* set up the MTD object for this partition */ slave->mtd.type = master->type;… if(parts[i].mtdp) { /* store the object pointer (caller may or may not register it */ *parts[i].mtdp = &slave->mtd; slave->registered = 0; } else { /* register our partition */ add_mtd_device(&slave->mtd); slave->registered = 1; } } return 0;}在函數的最後,通過add_mtd_device,可以將一個mtd結構體添加到mtd_table的指標數組中,這樣在系統中就可以看到/dev/mtdblock0,/dev/mtdblock1,…這樣的裝置了。因為是一個數組,所以在系統中定義了最大的數組元素#define MAX_MTD_DEVICES 16所以最多隻有mtdblock15。