Linux最小系统移植之早期打印CONFIG_EARLY_PRINTK
请先参考先前博文: Linux最小系统移植之早期打印CONFIG_DEBUG_LL , 因为eraly_printk其实就是对printch()封装的
一、 必要选项(在上面链接选中的前提下再新增CONFIG_EARLY_PRINTK):
/* linux-3.10.65/arch/arm/kernel/Makefile */
obj-$(CONFIG_DEBUG_LL) += debug.o
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
二、源码分析
先贴出early_printk.c源码:
/*
* linux/arch/arm/kernel/early_printk.c
*
* Copyright (C) 2009 Sascha Hauer <s.hauer@pengutronix.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/ #include <linux/kernel.h>
#include <linux/console.h>
#include <linux/init.h> extern void printch(int); static void early_write(const char *s, unsigned n)
{
while (n-- > ) {
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_dev = {
.name = "earlycon",
.write = early_console_write,
.flags = CON_PRINTBUFFER | CON_BOOT,
.index = -,
}; static int __init setup_early_printk(char *buf)
{
early_console = &early_console_dev;
register_console(&early_console_dev);
return ;
} early_param("earlyprintk", setup_early_printk);
以及调用的地方:
/* linux-3.10.65/kernel/printk.c */
void early_vprintk(const char *fmt, va_list ap)
{
if (early_console) {
char buf[];
int n = vscnprintf(buf, sizeof(buf), fmt, ap); early_console->write(early_console, buf, n);
}
} asmlinkage void early_printk(const char *fmt, ...)
{
va_list ap; va_start(ap, fmt);
early_vprintk(fmt, ap);
va_end(ap);
}
#endif
1. 调用者使用early_printk()可变参数打印函数
2. 函数的参数是存放在栈中的,由于是可变参数, 请问怎么知道栈存放多少参数? --> 使用va_start()解析
其原理根据第一个参数fmt的地址,以及最后一个参数ap地址知道这块栈区域都是形参, 记得变量ap要放在函数
第一行表示形参结束。同时,为确保所有参数都是放置栈(GCC编译器默认把前四个形参放置R0/1/2/3,后面才放入栈中)
定义了asmlinkage, 告知编译器全部形参放置栈中
3. vscnprintf()作用就是解析%d,%x, int a等格式, 最终全部转为字符放置buf中, 再调用early_console->write()输出
4. CON_PRINTBUFFER 打印缓冲所有数据, 如果后续串口驱动也设置这个标志, printk会重复打印eraly_printk 打的,CON_BOOT表示在启动期间有效
5. early_param("earlyprintk", setup_early_printk); 说明uboot或者DTB传给kernle 的 cmdline要有这个字段才能生效
6. 由于early_param是在start_kernel() -> parse_args() 的unknown_bootoption()处理的, 所以必须放置这个函数之后才能使用, 否则early_printk()就是空函数
7. 与printascii() printch()最大不同在于eraly_printk()可以打印格式参数%d, %p等, 方便调试
三、测试验证
测试发现确实只有2打印出来, 1没有
Linux最小系统移植之早期打印CONFIG_EARLY_PRINTK的更多相关文章
- Linux最小系统移植之早期打印CONFIG_DEBUG_LL
一.几个关键宏定义 CONFIG_DEBUG_LL. CONFIG_DEBUG_LL_INCLUDE 容我慢慢道来, 首先要使能早期打印, menuconfig必须选中CONFIG_DEBUG_LL, ...
- [嵌入式开发入门]4412开发板从零建立Linux最小系统
本文转自iTOP-4412开发板实战教程书籍 http://www.topeetboard.com iTOP-4412开发板不仅可以运行Android,还可以运行简单的Linux最小文件系统. 最小L ...
- Linux 最小系统制作
Linux 最小系统制作 一.制作工具Busybox 在制作文件系统的时候,我们需要使用“Busybox 工具”,即为附件压缩包“busybox-1.21.1.tar.bz2”.“BusyBox 工具 ...
- ZYNQ学习之路1. Linux最小系统构建
https://blog.csdn.net/u010580016/article/details/80430138?utm_source=blogxgwz1 开发环境:window10, vivado ...
- 在Linux最小系统上编译运行第一个helloworld程序
一.安装和使用SSH软件 1.安装SSH 软件 1)SSH 软件压缩包可以在网盘下载,下载后解压,进入解压出来的文件夹,如下图. 2)单击上图中的“SSHSecureShellClient-3.2.9 ...
- Linux 最小系统挂载U盘(SD、TF卡)并执行程序
一.在Ubuntu下编译C文件 使用指令"arm-none-linux-gnueabi-gcc-4.4.1 -o HelloWorld HelloWorld.c -static"编 ...
- 虚机Linux最小系统下安装图形界面,与yum配置
出于未知原因,想装一下. 因为有光盘,所以就从光盘安装就可以了. 首先是配置yum下的下载地址: 找到yum的地址,然后打开文件. 然后建立该文件的/media/cdrom路径.将光盘挂载到该路径下. ...
- 用BusyBox制作Linux最小系统
1.下载busybox-1.30.1 地址:https://busybox.net/downloads/busybox-1.30.1.tar.bz2 2.解压:tar xvf busybox-1.30 ...
- 浅谈Android系统移植、Linux设备驱动
一.Android系统架构 第一层:Linux内核 包括驱动程序,管理内存.进程.电源等资源的程序 第二层:C/C++代码库 包括Linux的.so文件以及嵌入到APK程序中的NDK代码 第三层:An ...
随机推荐
- Spring IOC(三)依赖注入
本系列目录: Spring IOC(一)概览 Spring IOC(二)容器初始化 Spring IOC(三)依赖注入 Spring IOC(四)总结 目录 1.AbstractBeanFactory ...
- YAML基础教程
一.YAML介绍YAML参考了其他多种语言,包括:XML.C语言.Python.Perl以及电子邮件格式RFC2822.Clark Evans在2001年5月在首次发表了这种语言,另外Ingy döt ...
- #利用openCV裁脸
#利用openCV裁脸import cv2 def draw_rects(img, rects): for x, y, w, h in rects: cv2.rectangle(img, (x, y) ...
- 死链接检查工具:Xenu 使用教程
一.软件作用 Xenu 全称Xenu’s Link Sleuth,是一款英文软件,界面单一,功能简单,使用方法很容易掌握.虽然看起来简单,但Xenu却拥有强大的功能.Xenu可以对网站的内链进行详细的 ...
- ie兼容问题记录
工作中遇到的ie网站兼容性问题 头疼.......... 以下为从网上搜索学习的整理兼容性方法 用于自己记录 #兼容问题 ##css hack: https://blog.csdn.net/fres ...
- 【转】干货,Kubernetes中的Source Ip机制。
准备工作 你必须拥有一个正常工作的 Kubernetes 1.5 集群,用来运行本文中的示例.该示例使用一个简单的 nginx webserver 回送它接收到的请求的 HTTP 头中的源 IP 地址 ...
- asp.net core系列 60 Ocelot 构建服务认证示例
一.概述 在Ocelot中,为了保护下游api资源,用户访问时需要进行认证鉴权,这需要在Ocelot 网关中添加认证服务.添加认证后,ReRoutes路由会进行身份验证,并使用Ocelot的基于声明的 ...
- 深入理解es6-Promise对象
前言 在之前翻博客时,看到promise,又重读了一边,突然发现理解很浅,记的笔记也不是很好理解,又重新学习promise,加深理解,学以致用 在promise出来之前,js常用解决异 ...
- 面试前必须要知道的Redis面试题
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面: 从零单排学Redis[青铜] 从零单排学 ...
- Android:JNI与NDK(一)
友情提示:欢迎关注本人公众号,那里有更好的阅读体验以及第一时间获取最新文章 本篇目录 以下举例代码均来自:NDK示例代码 一.前言 安卓开发中很多场景需要用到NDK来开发,比如,音视频的渲染,图像的底 ...