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

linux kernel 卡在提示信息Waiting for root device /dev/mmcblk0p1...處

syn printk while disk 過程 sdh 等於 hat \n

一.背景

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

linux kernel 卡在提示信息Waiting for root device /dev/mmcblk0p1...處