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...\n",
    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有關的編譯選項,然后重新編譯內核即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM