kernel启动过程中的调试打印

内核启动过程中涉及到多个地方,启动过程的代码由汇编代码和C代码组成。其中的打印函数也有多个。
1. 汇编阶段
打印函数包括如下几种:
printascii
printch
printhex8
printhex4
printhex2

这些函数定义在kernel/arch/arm/kernel/debug.S中,需要在make menuconfig中使能Kernel low-level debugging functions 才会这些内容编译进内核。

2. C语言阶段启动初期
在linux系统启动的初级阶段,”真正的”console驱动还没有加载进kernel,但是此时需要打印信息来调试内核,那么就需要使用early printk来调试,它的实现包括两部分,一个是early_printk的api,另一个对应的bootconsole驱动。
(1)early_printk函数是在kernel/kernel/printk.c文件中实现的
(2)bootconsole驱动一般属于平台相关,是在kernel/arch/arm/kernel/early_printk.c文件中实现

想要使用early_printk模块,还需要在make menuconfig中使能Early printk才会编译进内核。实际上在early_printk.c中对于bootconsole驱动的实现,也是调用到了前面汇编阶段所实现的代码printch的,也就是说最终打印所调用的底层函数都是汇编中的实现。那么就有一种依赖关系,具体的Makefile和Kconfig如下所示:

kernel/arch/arm/kernel/Makefile
obj-$(CONFIG_DEBUG_LL)  += debug.o
obj-$(CONFIG_EARLY_PRINTK)  += early_printk.o



Kernel/arch/arm/Kconfig.debug

config DEBUG_LL
      bool "Kernel low-level debugging functions "
      depends on DEBUG_KERNEL

config EARLY_PRINTK
     bool "Early printk"
     depends on DEBUG_LL

可以看出EARLY_PRINTK是依赖于DEBUG_LL的,也就是说要使能early_printk,必须也要使能DEBUG_LL才行。
在early_printk.c中:

static int __init setup_early_printk(char *buf)
{
    printk("%s enter\n", __func__);
    register_console(&early_console);
    return 0;
}
early_param("earlyprintk", setup_early_printk);

虽然内核配置了,但是要让内核调用setup_early_printk还必须在u-boot给内核传参的时候给bootargs在加上一个参数”earlyprintk”,比如:

set bootargs ‘console=ttyS5,115200,115200n8 androidboot.console=ttySAC0 uhost0=n ctp=2 skipcali=y vmalloc=384m lcd=S70 **earlyprintk**’

3. C语言启动后期
这是在真正的consolo驱动加载以后,此时就不再使用debug.S中的打印实现了,而是另外实现了一个linux标准tty驱动来作为printk的输出,这个也就是我们常用的pirntk了。

所以说当kernel启动不了,但又没有什么提示消息时,可以打开early printk查看。

因为在内核刚启动时,有些打印语句可能在串口还没有注册之前就调用了,那就不能显示了,early printk就是实现这个功能。
选上以下内核配置就可以了:
Kernel hacking —> Kernel low-level debugging functions –> Early printk
比如内核打印如下:
Starting kernel …

Uncompressing Linux… done, booting the kernel.
接着就什么都没了,这时候把early printk选上,果然看到kernel刚启动的信息了。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux HOWTO(文版)<br>BootPrompt-HOWTO (28KB) 启动提示说明 <br>CDROM-HOWTO (27KB) 如何安装, 设定及使用光驱,同时列出支援的硬体. <br>Chinese-HOWTO (39KB) 如何在 Linux 的系统上使用文?/TD> <br>Config-HOWTO (16KB) 如何更加快速简便地调试刚安装好的Linux系统。 <br>DNS-HOWTO (22KB) 如何成为一个称职的小型 DNS 管理者. <br>Firewall-HOWTO (20KB) 防火墙和代理伺服器. <br>GCC-HOWTO (33KB) 如何安装GNUC编译器和程式库的方法 <br>Glibc2-HOWTO (13KB) 如何在Linux系统上安装与使用第二版 GNU C Library <br>Hardware-HOWTO (42KB) 详列了大部份被 Linux 所支援的硬件和驱动程序 <br>HAM-HOWTO (26KB) Linux系统上的各种业余无线电软件。 <br>HOWTO-INDEX (17KB) 包含了 Linux HOWTOs 与 mini-HOWTOs 的索引. <br>INFO-SHEET (16KB) Linux 作业系统的基本资讯 <br>Intranet-Server-HOWTO (17KB) 从Unix、Netware、NT 以及 Windows 连接在一起。 <br>ISP-Hookup-HOWTO (16KB) 拨接 modem 连接到 ISP 网路服务接供业者的网路上。 <br>Java-CGI-HOWTO (8KB) 以及如何用 Java 来写 CGI 程式 <br>Kernel-HOWTO (26KB) 如何配置、编译、升级核心以及排难解纷的详细指引?/TD> <br>LinuxDoc+Emacs+Ispell (11KB) 一些有关使用Emacs 与 Ispell 工具的提示. <br>META-FAQ (7KB) 一份有用资讯来源的列表 <br>Networking-HOWTO (20KB) 针对 Linux 作业系统的网路能力提出一个概观的说明 <br>News-HOWTO (20KB) 如何设定、维护在 Linux 系统下的 USENET News 伺服器 <br>Oracle-HOWTO (12KB) 如何安装及设定 Oracle 资料库伺服器之指南?/TD> <br>PCMCIA-HOWTO (39KB) 安装及使用 PCMCIA 卡服务程式 <br>Plug-and-Play-HOWTO (12KB) 帮助你理解和使用 PnP 设备. <br>PPP-HOWTO (53KB) 如何把你的 Linux PC 连接到一台 PPP 伺服器上. <br>RPM-HOWTO (15KB) 如何使用 Red Hat 包装管理程式 <br>Printing-HOWTO (23KB) 如何产生, 预览,打印及传真任何文件 <br>Serial-HOWTO (28KB) 如何在 Linux 机器上设定串列通讯设备 <br>SGML-Guide (11KB) 一种以 SGML 为基础,让你产生不同输出格式的工具. <br>SMB-HOWTO (12KB) Session Message Block (SMB) protocol <br>Sound-HOWTO (29KB) 在Linux下的关於音效的支援. <br>Sound-Playing-HOWTO (14KB) Linux上播放各式声音格式的应用程式. <br>UPS-HOWTO (12KB) 如何将 Linux 系统连接到不断电系统 <br>VAR-HOWTO (14KB) 将现有产品改进并加入新价值的服务公司名单 <br>XFree86-HOWTO (12Kb) Linux 上的 X Window System (X11R6), XFree86 3.3 版. <br><br>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值