Linux 内核如何创建 /dev/mtdx 节点?

How does Linux kernel create /dev/mtdx nodes?

mtd 分区 table 的示例在 arch/arm/mach-omap2/board-omap3beagle.c 中用于 beagleboard http://lxr.free-electrons.com/source/arch/arm/mach-omap2/board-omap3beagle.c

static struct mtd_partition omap3beagle_nand_partitions[] = {
/* All the partition sizes are listed in terms of NAND block size */
{
    .name       = "X-Loader",
    .offset     = 0,
    .size       = 4 * NAND_BLOCK_SIZE,
    .mask_flags = MTD_WRITEABLE,    /* force read-only */
},
{
    .name       = "U-Boot",
    .offset     = MTDPART_OFS_APPEND,   /* Offset = 0x80000 */
    .size       = 15 * NAND_BLOCK_SIZE,
    .mask_flags = MTD_WRITEABLE,    /* force read-only */
},
{
    .name       = "U-Boot Env",
    .offset     = MTDPART_OFS_APPEND,   /* Offset = 0x260000 */
    .size       = 1 * NAND_BLOCK_SIZE,
},
{
    .name       = "Kernel",
    .offset     = MTDPART_OFS_APPEND,   /* Offset = 0x280000 */
    .size       = 32 * NAND_BLOCK_SIZE,
},
{
    .name       = "File System",
    .offset     = MTDPART_OFS_APPEND,   /* Offset = 0x680000 */
    .size       = MTDPART_SIZ_FULL,
},
};

另一个 link 指出: http://landley.net/kdocs/Documentation/DocBook/xhtml-nochunks/mtdnand.html 在这个 link Nand flash 驱动 board_init 函数中传递 mtd_partition structure 传递给 add_mtd_partitions(board_mtd, partition_info, NUM_PARTITIONS); 文件 mtdcore.c 文件中的函数。

如果我是对的,那么 mtdcores.c 文件会创建 mtd 分区吗?

现在我有两个问题:

1> 如果我是对的,那么文件 /board-omap3beagle.c 中的 omap3_beagle_init 函数将调用 omap_nand_flash_init 函数,这将初始化 NAND 并创建 /dev/mdtx 节点。

如果我不对,那么是什么创建了 /dev/mtd0 节点?内核创建它还是 NAND 驱动程序?

2> 还有,omap3_beagle_init函数是内核调用的第一个函数吗?它是从linux内核中的哪个文件调用的?

1/ 可以通过多种方式创建设备文件。通常,它们现在是使用 devtmpfs 创建的,它是内核的一部分。当驱动程序或子系统注册新设备时,将调用 devtmpfs_create_node 这会唤醒一个线程,该线程会将设备节点添加到 devtmpfs 文件系统。

如果您的内核没有使用 devtmpfs,那么您必须使用 mknod 手动创建这些设备文件。另外mdev也是一个可以创建设备文件的工具。最后,udev 用于创建设备文件但现在依赖于 devtmpfs.

2/omap3_beagle_init绝对不是内核调用的第一个函数。自身解压后,入口点为init/main.c中的start_kernel。这是独立于体系结构的。 omap3_beagle_initcustomize_machine arch_initcall 中调用 arch/arm/kernel/setup.c