【问题标题】:How does Linux kernel create /dev/mtdx nodes?Linux 内核如何创建 /dev/mtdx 节点?
【发布时间】:2016-01-22 13:11:15
【问题描述】:

mtd 分区表的示例在 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,
},
};

另一个链接指出: http://landley.net/kdocs/Documentation/DocBook/xhtml-nochunks/mtdnand.html 在这个链接中 Nand flash driver 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 内核中的哪个文件调用的?

【问题讨论】:

  • 请任何可以在这篇文章中提出建议的人..!!

标签: linux linux-kernel embedded-linux


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回复...如果 mtd 分区是在 struct mtd_partition 中静态定义的,那么内核将如何创建 /dev/mtdx 节点...因为 udev 仍未运行 .. 内核的哪个部分将调用 devtmpfs_create_node 来创建 /dev/mtdx 节点 ..?
  • mtd 子系统可以。 add_mtd_partitions -> add_mtd_device -> device_register -> device_add -> devtmpfs_create_node
  • 我这边的最后一点 devtmpfs 创建了 tmpfs 文件系统,一旦挂载了 rootfs,它就可以挂载在 /dev 目录中……所以这意味着嵌入式系统不需要 udev 或 mdev 恶魔……对吗?
  • 您可能仍需要 udev 或 mdev 来处理热插拔事件,例如更改设备文件的权限。
猜你喜欢
  • 2018-12-13
  • 2014-06-18
  • 2016-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
相关资源
最近更新 更多