海思平台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。依次添加每个分区

浙公网安备 33010602011771号