海思平台uboot环境变量emmc的分区表blkdevparts机制

  使用海思平台应该知道通常会在uboot中设置blkdevparts=mmcblk0:512K(boot),512K(env),512K(bl31),13M(kernel),96M(rootfs) 类似参数表示emmc的分区,这个blkdevparts参数包含bootargs参数中。bootargs参数会通过设备树传递给内核,可以通过cat /sys/firmware/devicetree/base/chosen/bootargs 查看。内核会解析blkdevparts来划分emmc分区。下面看一下内核中是如何使用blkdevparts参数的。

  在linux mmc驱动架构中,emmc每个分区对应各个快设备,例如/dev/mmcblk0p1 、/dev/mmcblk0p2都是一个块设备。emmc对应的块设备驱动在kernel/mmc/core/block.c中

  

  

  kernel/mmc/core/bus.c中定义了一条mmc总线

  

  kernel/mmc/core/block.c有emmc的驱动

  

  mmc_blk_init函数会注册该驱动,并自动调用mmc_blk_probe函数,下面看一下这个函数中emmc块设备驱动的实现

  mmc_blk_probe  //kernel/mmc/core/block.c

    -->mmc_blk_alloc  //这里会申请mmc_blk_data,该结构体中包含struct gendisk,这个gendisk也会一起申请

    -->mmc_add_disk  

      -->device_add_disk  //kernel/block/genhd.c

        -->disk_init_partition

          -->disk_scan_partitions

            -->blkdev_get_by_dev  //kernel/fs/block_dev.c

              -->blkdev_get

                -->__blkdev_get

                   -->bdev_disk_changed

                    -->blk_add_partitions  //kernel/block/partions/core.c

                      -->check_partition  //这里会依次调用check_part数组中的函数

                        -->cmdline_partition  //kernel/block/partions/cmdline.c cmdline.c中用__setup("blkdevparts=", cmdline_parts_setup);后去uboot传递过来的blkdevparts参数

                          -->cmdline_parts_set  //这个函数将blkdevparts分区参数解析后放到struct parsed_partitions结构体中

                      -->blk_add_partition  //用一个for循环cmdline_partion解析出来多少个分区就调用多少次blk_add_partition。依次添加每个分区

posted @ 2025-04-09 17:52  YYFaGe  阅读(230)  评论(0)    收藏  举报