zoukankan      html  css  js  c++  java
  • linux kernel 卡在提示信息Waiting for root device /dev/mmcblk0p1...处

    一.背景

    1.1 移植linux-4.14内核的过程中,此时使用的是ext4文件系统,并且将根文件系统存储在sd卡的第一个分区上

    1.2 内核打印完Waiting for root device /dev/mmcblk0p1...这一句信息之后并没有panic,而且串口还可以回应

    二.分析

    既然处在一直等待根文件系统挂载,那么可以去扒一下内核代码,请看

    /*
     * Prepare the namespace - decide what/where to mount, load ramdisks, etc.
    */
    void __init prepare_namespace(void)

    {

    ...

    /* wait for any asynchronous scanning to complete */
       if ((ROOT_DEV == 0) && root_wait) {
         printk(KERN_INFO "Waiting for root device %s... ",
        saved_root_name);   这里是打印信息的地方
        while (driver_probe_done() != 0 ||
         (ROOT_DEV = name_to_dev_t(saved_root_name)) == 0)  从此处可以看出程序会判断driver_probe_done(),这个与驱动的probe有关,还有ROOT_DEV = name_to_dev_t(saved_root_name)) == 0这个判断,saved_root_name当前等于/dev/mmcblk0p1,那么name_to_dev_t就去获取这个真实物理设备的设备号,然后将设备号复制给变量ROOT_DEV,再使用ROOT_DEV与0进行比较,如果驱动没有probe ok,driver_probe_done()执行的结果就为非0,当然使用name_to_dev_t获取到的内容也就为0,那么程序就会一直处在这个while循环中,每5毫秒判断一次,直到驱动probe OK
         msleep(5);
        async_synchronize_full();
      }

    ...

    }

    三.解决

    从以上的分析可以总结如下:

    /dev/mmcblk0p1这个物理设备对应的驱动没有被加载,因此驱动一直无法probe,因此加上CONFIG_MMC_SDHCI等与mmc有关的编译选项,然后重新编译内核即可

  • 相关阅读:
    【数据库】-数据库显示不允许保存更改
    C#编程:从控制台读取数字的两种方式
    【终结版】C#常用函数和方法集汇总
    运行supervisord -c /etc/supervisor/supervisord.conf 出错,解决办法
    supervisord监控服务必备命令
    【持续更新中···】Linux下的小技巧
    运行supervisorctl reload报错解决方法
    ASP.NET Core 发布 centos7 配置守护进程
    【C++】std::是什么?
    DNS查询相关
  • 原文地址:https://www.cnblogs.com/dakewei/p/9908485.html
Copyright © 2011-2022 走看看