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有关的编译选项,然后重新编译内核即可

原文地址:https://www.cnblogs.com/dakewei/p/9908485.html

时间: 2024-10-07 22:44:53

linux kernel 卡在提示信息Waiting for root device /dev/mmcblk0p1...处的相关文章

Linux内核部件分析 设备驱动模型之device

来源:Linux社区 -- http://www.linuxidc.com/Linux/2011-10/44627p6.htm 作者 : qb_2008 linux的设备驱动模型,是建立在sysfs和kobject之上的,由总线.设备.驱动.类所组成的关系结构.从本节开始,我们将对linux这一设备驱动模型进行深入分析. 头文件是include/linux/device.h,实现在drivers/base目录中.本节要分析的,是其中的设备,主要在core.c中. struct device {

the Linux Kernel: Traffic Control, Shaping and QoS

−Table of Contents Journey to the Center of the Linux Kernel: Traffic Control, Shaping and QoS 1 Introduction 2 Motivation 3 The basics of Traffic Control 3.1 First contact 3.2 Netfilter MARK 3.3 Two classes in a tree 3.4 Connecting the marks to the

linux内核可以接受的参数 | Linux kernel启动参数 | 通过grub给内核传递参数

在Linux中,给kernel传递参数以控制其行为总共有三种方法: 1.build kernel之时的各个configuration选项. 2.当kernel启动之时,可以参数在kernel被GRUB或LILO等启动程序调用之时传递给kernel. 3.在kernel运行时,修改/proc或/sys目录下的文件. 这里我简单讲的就是第二种方式了,kernel在grub中配置的启动参数. 首先,kernel有哪些参数呢? 在linux的源代码中,有这样的一个文档Documentation/kern

Linux Kernel - Debug Guide (Linux内核调试指南 )

http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 建立调试环境 发行版的选择和安装 安装交叉编译工具 bin工具集的使用 qemu的使用 initrd.img的原理与制作 x86虚拟调试环境的建立 arm虚拟调试环境的建立 arm开发板调试环

linux kernel 字符设备详解

有关Linux kernel 字符设备分析: 参考:http://blog.jobbole.com/86531/ 一.linux kernel 将设备分为3大类,字符设备,块设备,网络设备. 字符设备是指只能一个字节一个字节读写的设备, 常见的外设基本上都是字符设备. 块设备:常见的存储设备,硬盘,SD卡都归为块设备,块设备是按一块一块读取的. 网络设备:linux 将对外通信的一个机制抽象成一个设备, 通过套接字对其进行相关的操作. 每一个字符设备或块设备都在/dev目录下对应一个设备文件.l

Linux Kernel 4.2.2 编译安装教程

安装linux的最新内核其实不难,搞linux就不要怕尝试. 我配置是AMD Athlon X2 64 4600+的处理器和DDR2 2GB的内存条,系统为Xubuntu 15.04. 现在我与大家分享一下经验,由于我写这个帖子的时候,4.2.2是最新的正式版内核,所以就以4.2.2为例了. 首先去官网下载4.2.2的内核包,官网地址:https://www.kernel.org/ linux-4.2.2.tar.gz官网下载地址:https://www.kernel.org/pub/linux

Linux Kernel Module(LKM) Init、Delete Code Principle Learning

目录 1. Linux模块(LKM)简介 2. 使用Linux模块 3. LKM模块加载原理 4. LKM模块卸载原理 1. Linux模块(LKM)简介 模块是一种向linux内核添加"设备驱动程序"."文件系统"."其他组件"的有效方法,而无须重新编译内核或重启系统,这消除了许多限制,同时带来了很多的优点 1. 通过使用模块,内核程序员能够预先编译大量驱动程序,而不会致使内核映像的尺寸发生膨胀.在自动检测硬件或用户提示后,安装例程会选择适当的

linux的启动模式的设置及root用户密码的修改

1.修改启动模式: 进入命令行终端使用这个命令 [[email protected] ~]# vi /etc/inittab id:5:initdefault: 5为图形界面模式 3为多用户开发者模式 敲击i进入编辑模式,将5修改为3 执行Esc->:wq->reboot 修改成功! 2.修改root密码: a.启动系统, b.在界面启动时让它停留一下,随便按一下键盘上的一个键,此时就会进入到操作系统配置引导界面, c.根据提示,敲击键盘e键,编辑启动信息 d.找到kernel选项,根据提示,

Linux: the schedule algorithm in Linux kernel

Linux kernel里面用到的一个叫 CFS (Completely-Fair-Scheduler)的调度算法.在网上找的描述都很不直观,很难读.但是找到了一篇很通俗易懂的(大道至简啊...): http://people.redhat.com/mingo/cfs-scheduler/sched-design-CFS.txt 为了防止链接失效,粘贴全文如下: This is the CFS scheduler. 80% of CFS's design can be summed up in