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