分析Linux内核启动流程时可以知道,在调用setup_arch函数之前就已经调用过printk函数了,但是这个时候的printk函数只是将打印信息放在缓存区中,并没有打印到控制台上,因为这个时候控制台还没有被初始化。

只有在start_kernel函数中的console_init函数被调用后,控制台才会被注册、初始化,printk函数打印的内容才会被真正地输出到屏幕上。如果想在console_init函数之前打印信息,需要调用early_printk函数。

1. 内核配置

(1)Kernel hacking  ---> Kernel low-level debugging functions -->   Early printk

(2)boot option中需要添加 earlyprintk项。

类似于:earlyprintk=ttyS0,115200 loglevel=9 initcall_debug=1 console=ttyS0,115200 ramfs

2. 使用

在需要打印调试信息的地方调用此函数

early_printk("------------xxx------------\n");

3. A33开发板

如在./arch/arm/mach-sunxi/sun8i.c 中有如下语句:

early_printk("[%s]: From boot, get meminfo:\n", __func__);

启动开发板时串口控制台信息如下:

在没有启用early_printk之前,串口控制台信息如下:

4. 对early printk的驱动实现的分析

arch/arm/kernel/early_printk.c文件,上代码:

  1. extern void printch(int);
  2. static void early_write(const char *s, unsigned n)
  3. {
  4. while (n-- > 0) {
  5. if (*s == '\n')
  6. printch('\r');
  7. printch(*s);
  8. s++;
  9. }
  10. }
  11. static void early_console_write(struct console *con, const char *s, unsigned n)
  12. {
  13. early_write(s, n);
  14. }
  15. static struct console early_console = {
  16. .name =                "earlycon",
  17. .write =        early_console_write,
  18. .flags =        CON_PRINTBUFFER | CON_BOOT,
  19. .index =        -1,
  20. };
  21. asmlinkage void early_printk(const char *fmt, ...)
  22. {
  23. char buf[512];
  24. int n;
  25. va_list ap;
  26. va_start(ap, fmt);
  27. n = vscnprintf(buf, sizeof(buf), fmt, ap);
  28. early_write(buf, n);
  29. va_end(ap);
  30. }
  31. static int __init setup_early_printk(char *buf)
  32. {
  33. register_console(&early_console);
  34. return 0;
  35. }
  36. early_param("earlyprintk", setup_early_printk);

其实这段code最终的实现都是靠:extern void printch(int);这个函数。这个函数实现是在:arch/arm/kernel/debug.S中:

  1. ENTRY(printch)
  2. addruart_current r3, r1, r2
  3. mov        r1, r0
  4. mov        r0, #0
  5. b        1b
  6. ENDPROC(printch)
  7. .macro        addruart_current, rx, tmp1, tmp2
  8. addruart        \tmp1, \tmp2
  9. mrc                p15, 0, \rx, c1, c0
  10. tst                \rx, #1
  11. moveq                \rx, \tmp1
  12. movne                \rx, \tmp2
  13. .endm

printch会调用到 addruart_current函数,而addruart_current函数用调用到:addruart函数,该函数实现是在:arch\arm\mach-s3c64xx\include\mach中的debug-macro.S汇编文件中:

  1. .macro addruart, rp, rv
  2. ldr        \rp, = S3C_PA_UART
  3. ldr        \rv, = (S3C_VA_UART + S3C_PA_UART & 0xfffff)
  4. #if CONFIG_DEBUG_S3C_UART != 0
  5. add        \rp, \rp, #(0x400 * CONFIG_DEBUG_S3C_UART)
  6. add        \rv, \rv, #(0x400 * CONFIG_DEBUG_S3C_UART)
  7. #endif
  8. .endm

我们从上面的代码可以看到S3C_PA_UART, S3C_PA_UART都是实际的6410的串口寄存器物理和虚拟地址,从而进行真正的硬件底层操作。

全志A33-linux内核early_printk分析及使用相关推荐

  1. 【转载】全志的 Linux 内核后门分析

    最近全志开发人员在其kernel中留下后门一事闹得沸沸扬扬.还不知道的同学请参看 据外媒 arstechnica 报道,一家中国的芯片级系统厂商全志(allwinner) 在其开发的产品中携带的内核里 ...

  2. 全志linux关机键,全志平台linux启动流程分析

    转载:全志平台linux启动流程分析 一.BROM阶段 机器上电之后会执行固化在BROM里面的一段引导程序,这个程序会依次遍历所有支持的启动介质,直到找到第一个支持的.目前支持的启动介质是sd/mmc ...

  3. linux内核源代码分析----内核基础设施之klist

    概述 klist是list的线程安全版本,他提供了整个链表的自旋锁,查找链表节点,对链表节点的插入和删除操作都要获得这个自旋锁.klist的节点数据结构是klist_node,klist_node引入 ...

  4. Linux内核源代码分析-目录

    第一部分 Linux 内核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 ...

  5. Linux内核源代码分析——可执行文件header处理(二进制文件读写范例,写DUL工具入门指引)...

    在把Linux内核源代码生成Image之前,需要把执行文件头结构信息剔除出来.这个过程对理解Linux内核具有很大的帮助.同时,由于是对可执行文件进行直接读写操作,想写DUL工具的童鞋可以在这里学习到 ...

  6. Linux内核协议栈分析之——tcp/ip通信并不神秘

    Jack:计算机如何进行通信? 我:我可以告诉你带Linux操作系统的计算机如何进行通信. Jack:带Linux操作系统的计算机?这和不带操作系统的计算机有区别吗? 我:有的. Jack:哦.那你说 ...

  7. Linux内核部件分析 设备驱动模型之driver ---mark 详细

    Linux内核部件分析 设备驱动模型之driver 转载:https://www.linuxidc.com/Linux/2011-10/44627p7.htm 上节我们分析设备驱动模型中的device ...

  8. 《Linux内核情景分析》阅读笔记

    <Linux内核情景分析>这本书读过了一遍,不想继续读第二遍了. <Linux Kernel Development>这本书前后读了3遍,写得实在是好,正所谓"布衣暖 ...

  9. linux 内核抢占分析

    linux 内核抢占分析 在 Linux 2.6 以后版本的 Linux 内核中,一个内核任务可以被抢占,从而提高系统的实时性.这样做最主要的优势在于,可以极大地增强系统的用户交互性,用户将会觉得鼠标 ...

  10. Linux内核问题分析方法

    定位内核问题难点 死机没有现场或信息不全,有信息无法进一步分析: 调试困难,gdb只能作为辅助: 内核庞杂,系统代码量大,无从下手: 问题的表现和问题的原因不一定直接关联.linux内核堆栈大多是我们 ...

最新文章

  1. C# asp.net mvc 配置多个route 参数
  2. Shorten command line 解决方案
  3. ubuntu c 判断程序是否启动_刚刚接触编程的我,怎么判断自己是否适合做一个程序员?...
  4. ubuntu14.04 通过PPA 安装ffmpeg
  5. java xml amp_Javaamp;Xml教程(十一)JAXB实现XML与Java对象转换
  6. poj1236 Tarjan算法模板 详解
  7. P50发布!网友:滚筒洗衣机也能打电话了
  8. Get value from agent failed:ZBX_TCP_READ() timed out(亲测)
  9. python怎么读取excel-python 读取 Excel
  10. phpmyadmin安装出错,缺少 mysqli 扩展。请检查 PHP 配置
  11. 节俭,是一种了不起的能力
  12. ios GCD多线程
  13. VS安装包注册com组件
  14. Vue+ele 列表不同页列表序号累加
  15. IFD-x 微型红外成像仪探测距离说明
  16. 是非人生 — 一个菜鸟程序员的5年职场路 第6节
  17. 华为云搭建javaweb服务器
  18. 韩国商业网站界面设计分析------推荐2005-5-24 出处:vipcn.com
  19. 讯飞语音——文字转换语音
  20. Remove Duplicates

热门文章

  1. 开源NAS系统使用总结
  2. UVA 11210 中国麻将
  3. 一条看似平常的报警邮件所做的分析
  4. psql客户端乱码问题
  5. Console-算法[for,if]-一堆桃子和一只猴子
  6. RHCE实验室NTP时间服务器配置最终版
  7. cache_purge php
  8. 计算机知识产权结合,计算机知识产权.doc
  9. 焦作一中高考成绩查询2021,2021年焦作高中学校排名及录取分数线排名
  10. reactor多线程模型_网络编程模型的演进之路