linux kernel 卡在提示信息Waiting for root device /dev/mmcblk0p1...處
阿新 • • 發佈:2018-11-05
syn printk while disk 過程 sdh 等於 hat \n
(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();
}
一.背景
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...處