1. 程式人生 > >linux kernel 卡在提示資訊Waiting for root device /dev/mmcblk0p1...處

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有關的編譯選項,然後重新編譯核心即可