linux 内核配置sd卡,linux – 内核在哪里定义SD卡命名索引?

我正在运行一个从SDCard启动的嵌入式主板. rootfs的位置通过内核参数传递给内核:

Kernel command line: console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10

我注意到更改为不同的内核版本会将索引更改为mmcblk1,从而导致设备无法启动.

内核是在没有initramfs的情况下构建的.

两个版本的udevadm输出:

mmcblk1

$udevadm info --name=/dev/mmcblk1 --attribute-walk

looking at device '/devices/platform/soc/1c0f000.mmc/mmc_host/mmc1/mmc1:0001/block/mmcblk1':

KERNEL=="mmcblk1"

SUBSYSTEM=="block"

DRIVER==""

ATTR{alignment_offset}=="0"

ATTR{capability}=="50"

ATTR{discard_alignment}=="0"

ATTR{ext_range}=="256"

ATTR{force_ro}=="0"

ATTR{inflight}==" 0 0"

ATTR{range}=="8"

ATTR{removable}=="0"

ATTR{ro}=="0"

ATTR{size}=="7716864"

ATTR{stat}==" 2203 1698 122077 22625 654 554 26088 8770 0 12855 31530"

looking at parent device '/devices/platform/soc/1c0f000.mmc/mmc_host/mmc1/mmc1:0001':

KERNELS=="mmc1:0001"

SUBSYSTEMS=="mmc"

DRIVERS=="mmcblk"

ATTRS{cid}=="9f544930303030300000000201011a3b"

ATTRS{csd}=="400e00325b5900001d6f7f800a4000a1"

ATTRS{date}=="10/2017"

ATTRS{dsr}=="0x404"

ATTRS{erase_size}=="512"

ATTRS{fwrev}=="0x0"

ATTRS{hwrev}=="0x0"

ATTRS{manfid}=="0x00009f"

ATTRS{name}=="00000"

ATTRS{ocr}=="00200000"

ATTRS{oemid}=="0x5449"

ATTRS{preferred_erase_size}=="4194304"

ATTRS{scr}=="02b5800000000000"

ATTRS{serial}=="0x00000201"

ATTRS{ssr}=="000000000200000004049000080a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"

ATTRS{type}=="SD"

looking at parent device '/devices/platform/soc/1c0f000.mmc/mmc_host/mmc1':

KERNELS=="mmc1"

SUBSYSTEMS=="mmc_host"

DRIVERS==""

mmcblk0

~# udevadm info --name=/dev/mmcblk0 --attribute-walk

looking at device '/devices/platform/soc/1c0f000.mmc/mmc_host/mmc0/mmc0:0001/block/mmcblk0':

KERNEL=="mmcblk0"

SUBSYSTEM=="block"

DRIVER==""

ATTR{alignment_offset}=="0"

ATTR{capability}=="50"

ATTR{discard_alignment}=="0"

ATTR{ext_range}=="256"

ATTR{force_ro}=="0"

ATTR{inflight}==" 0 0"

ATTR{range}=="8"

ATTR{removable}=="0"

ATTR{ro}=="0"

ATTR{size}=="7716864"

ATTR{stat}==" 2156 1248 105313 35020 85 263 952 1530 0 8180 36530"

looking at parent device '/devices/platform/soc/1c0f000.mmc/mmc_host/mmc0/mmc0:0001':

KERNELS=="mmc0:0001"

SUBSYSTEMS=="mmc"

DRIVERS=="mmcblk"

ATTRS{cid}=="9f5449303030303000000003ba011a5d"

ATTRS{csd}=="400e00325b5900001d6f7f800a4000a1"

ATTRS{date}=="10/2017"

ATTRS{dsr}=="0x404"

ATTRS{erase_size}=="512"

ATTRS{fwrev}=="0x0"

ATTRS{hwrev}=="0x0"

ATTRS{manfid}=="0x00009f"

ATTRS{name}=="00000"

ATTRS{ocr}=="00200000"

ATTRS{oemid}=="0x5449"

ATTRS{preferred_erase_size}=="4194304"

ATTRS{scr}=="02b5800000000000"

ATTRS{serial}=="0x000003ba"

ATTRS{ssr}=="000000000200000004049000080a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"

ATTRS{type}=="SD"

looking at parent device '/devices/platform/soc/1c0f000.mmc/mmc_host/mmc0':

KERNELS=="mmc0"

SUBSYSTEMS=="mmc_host"

DRIVERS==""

~# udevadm info --query=property --name=/dev/mmcblk0

DEVLINKS=/dev/disk/by-id/mmc-00000_0x000003ba /dev/disk/by-path/platform-1c0f000.mmc

DEVNAME=/dev/mmcblk0

DEVPATH=/devices/platform/soc/1c0f000.mmc/mmc_host/mmc0/mmc0:0001/block/mmcblk0

DEVTYPE=disk

ID_NAME=00000

ID_PART_TABLE_TYPE=dos

ID_PART_TABLE_UUID=27e953fe

ID_PATH=platform-1c0f000.mmc

ID_PATH_TAG=platform-1c0f000_mmc

ID_SERIAL=0x000003ba

MAJOR=179

MINOR=0

SUBSYSTEM=block

TAGS=:systemd:

USEC_INITIALIZED=4723799

看看/ etc / udev我发现没有明确的规则来解决mmcblk的命名问题.

# tree /etc/udev

/etc/udev

├── hwdb.bin

├── hwdb.d

├── rules.d

└── udev.conf

命名似乎与设备树有关.使用相同的zImage更改不同的设备树会产生不同的索引.

什么负责设置索引,是否有配置将其设置为不同的起始索引?

解决方法:

This似乎是负责理解root = / dev / mmcblk0p2的内核代码.

鉴于不存在initramfs,没有运行udev守护程序来命名设备,并且/ dev / mmcblk1在任何地方都不存在.

然后内核以某种方式将该名称转换为负责的驱动程序,函数dev_t name_to_dev_t(const char * name):

...

if (strncmp(name, "/dev/", 5) != 0) {

unsigned maj, min, offset;

char dummy;

if ((sscanf(name, "%u:%u%c", &maj, &min, &dummy) == 2) ||

(sscanf(name, "%u:%u:%u:%c", &maj, &min, &offset, &dummy) == 3)) {

res = MKDEV(maj, min);

if (maj != MAJOR(res) || min != MINOR(res))

goto fail;

} else {

res = new_decode_dev(simple_strtoul(name, &p, 16));

if (*p)

goto fail;

}

goto done;

}

来自lkml discussion的引用指出,命名的变化可能是由设备树中的排序引起的:

Changes in device ordering can be provoked by the order in which

entries in the DT file appear, and hence the order in which the host

SD interfaces are probed by the kernel.

标签:linux,systemd,udev,root-filesystem

来源: https://codeday.me/bug/20190814/1654571.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值