全志A33-linux内核early_printk分析及使用
分析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文件,上代码:
- extern void printch(int);
- static void early_write(const char *s, unsigned n)
- {
- while (n-- > 0) {
- if (*s == '\n')
- printch('\r');
- printch(*s);
- s++;
- }
- }
- static void early_console_write(struct console *con, const char *s, unsigned n)
- {
- early_write(s, n);
- }
- static struct console early_console = {
- .name = "earlycon",
- .write = early_console_write,
- .flags = CON_PRINTBUFFER | CON_BOOT,
- .index = -1,
- };
- asmlinkage void early_printk(const char *fmt, ...)
- {
- char buf[512];
- int n;
- va_list ap;
- va_start(ap, fmt);
- n = vscnprintf(buf, sizeof(buf), fmt, ap);
- early_write(buf, n);
- va_end(ap);
- }
- static int __init setup_early_printk(char *buf)
- {
- register_console(&early_console);
- return 0;
- }
- early_param("earlyprintk", setup_early_printk);
其实这段code最终的实现都是靠:extern void printch(int);这个函数。这个函数实现是在:arch/arm/kernel/debug.S中:
- ENTRY(printch)
- addruart_current r3, r1, r2
- mov r1, r0
- mov r0, #0
- b 1b
- ENDPROC(printch)
- .macro addruart_current, rx, tmp1, tmp2
- addruart \tmp1, \tmp2
- mrc p15, 0, \rx, c1, c0
- tst \rx, #1
- moveq \rx, \tmp1
- movne \rx, \tmp2
- .endm
printch会调用到 addruart_current函数,而addruart_current函数用调用到:addruart函数,该函数实现是在:arch\arm\mach-s3c64xx\include\mach中的debug-macro.S汇编文件中:
- .macro addruart, rp, rv
- ldr \rp, = S3C_PA_UART
- ldr \rv, = (S3C_VA_UART + S3C_PA_UART & 0xfffff)
- #if CONFIG_DEBUG_S3C_UART != 0
- add \rp, \rp, #(0x400 * CONFIG_DEBUG_S3C_UART)
- add \rv, \rv, #(0x400 * CONFIG_DEBUG_S3C_UART)
- #endif
- .endm
我们从上面的代码可以看到S3C_PA_UART, S3C_PA_UART都是实际的6410的串口寄存器物理和虚拟地址,从而进行真正的硬件底层操作。
全志A33-linux内核early_printk分析及使用相关推荐
- 【转载】全志的 Linux 内核后门分析
最近全志开发人员在其kernel中留下后门一事闹得沸沸扬扬.还不知道的同学请参看 据外媒 arstechnica 报道,一家中国的芯片级系统厂商全志(allwinner) 在其开发的产品中携带的内核里 ...
- 全志linux关机键,全志平台linux启动流程分析
转载:全志平台linux启动流程分析 一.BROM阶段 机器上电之后会执行固化在BROM里面的一段引导程序,这个程序会依次遍历所有支持的启动介质,直到找到第一个支持的.目前支持的启动介质是sd/mmc ...
- linux内核源代码分析----内核基础设施之klist
概述 klist是list的线程安全版本,他提供了整个链表的自旋锁,查找链表节点,对链表节点的插入和删除操作都要获得这个自旋锁.klist的节点数据结构是klist_node,klist_node引入 ...
- Linux内核源代码分析-目录
第一部分 Linux 内核源代码 arch/i386/kernel/entry.S 2 arch/i386/kernel/init_task.c 8 arch/i386/kernel/irq.c 8 ...
- Linux内核源代码分析——可执行文件header处理(二进制文件读写范例,写DUL工具入门指引)...
在把Linux内核源代码生成Image之前,需要把执行文件头结构信息剔除出来.这个过程对理解Linux内核具有很大的帮助.同时,由于是对可执行文件进行直接读写操作,想写DUL工具的童鞋可以在这里学习到 ...
- Linux内核协议栈分析之——tcp/ip通信并不神秘
Jack:计算机如何进行通信? 我:我可以告诉你带Linux操作系统的计算机如何进行通信. Jack:带Linux操作系统的计算机?这和不带操作系统的计算机有区别吗? 我:有的. Jack:哦.那你说 ...
- Linux内核部件分析 设备驱动模型之driver ---mark 详细
Linux内核部件分析 设备驱动模型之driver 转载:https://www.linuxidc.com/Linux/2011-10/44627p7.htm 上节我们分析设备驱动模型中的device ...
- 《Linux内核情景分析》阅读笔记
<Linux内核情景分析>这本书读过了一遍,不想继续读第二遍了. <Linux Kernel Development>这本书前后读了3遍,写得实在是好,正所谓"布衣暖 ...
- linux 内核抢占分析
linux 内核抢占分析 在 Linux 2.6 以后版本的 Linux 内核中,一个内核任务可以被抢占,从而提高系统的实时性.这样做最主要的优势在于,可以极大地增强系统的用户交互性,用户将会觉得鼠标 ...
- Linux内核问题分析方法
定位内核问题难点 死机没有现场或信息不全,有信息无法进一步分析: 调试困难,gdb只能作为辅助: 内核庞杂,系统代码量大,无从下手: 问题的表现和问题的原因不一定直接关联.linux内核堆栈大多是我们 ...
最新文章
- C# asp.net mvc 配置多个route 参数
- Shorten command line 解决方案
- ubuntu c 判断程序是否启动_刚刚接触编程的我,怎么判断自己是否适合做一个程序员?...
- ubuntu14.04 通过PPA 安装ffmpeg
- java xml amp_Javaamp;Xml教程(十一)JAXB实现XML与Java对象转换
- poj1236 Tarjan算法模板 详解
- P50发布!网友:滚筒洗衣机也能打电话了
- Get value from agent failed:ZBX_TCP_READ() timed out(亲测)
- python怎么读取excel-python 读取 Excel
- phpmyadmin安装出错,缺少 mysqli 扩展。请检查 PHP 配置
- 节俭,是一种了不起的能力
- ios GCD多线程
- VS安装包注册com组件
- Vue+ele 列表不同页列表序号累加
- IFD-x 微型红外成像仪探测距离说明
- 是非人生 — 一个菜鸟程序员的5年职场路 第6节
- 华为云搭建javaweb服务器
- 韩国商业网站界面设计分析------推荐2005-5-24 出处:vipcn.com
- 讯飞语音——文字转换语音
- Remove Duplicates