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 ...
随机推荐
- BZOJ_4530_[Bjoi2014]大融合_LCT
BZOJ_4530_[Bjoi2014]大融合_LCT Description 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个 ...
- BZOJ_1801_[Ahoi2009]chess 中国象棋_DP
BZOJ_1801_[Ahoi2009]chess 中国象棋_DP Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像 ...
- SSRS报表服务随笔(rdl报表服务)-报表数据:使用第三方控件生成条形码
因为工作需要,需要将订单号显示成条形码,比如数据库存储的20190106A,我需要把这个转换为Code128来显示出来 在国内我没有找到这方面的教程,最后还是一个人自己摸索出来的 在这里我是使用的是B ...
- java代码之美(11)---java代码的优化
java代码的优化 随着自己做开发时间的增长,越来越理解雷布斯说的: 敲代码要像写诗一样美.也能理解有一次面试官问我你对代码有洁癖吗? 一段好的代码会让人看就像诗一样,也像一个干净房间会让人看去很舒服 ...
- JS实现页面复制文字时自动加版权
经亲自实践,尝试了各种方法,目前可行的方法主要有如下两种: 可以在任何运行使用js代码的网站中使用,比如本人在自己的博客园博客中实现了一下,读者您可亲自在本人博客上测试. 方法1: <scrip ...
- 使用NSSM把.Net Core部署至 Windows 服务
为什么部署至Windows Services 在很多情况下,很少会把.Net Core项目部署至Windows服务中,特别是Asp.net Core就更少了.一般情况下,Asp.net Core会部署 ...
- Java工程师必备书单
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- Android之应用市场排行榜、上架、首发
文章大纲 一.应用市场排行榜介绍二.应用市场上架介绍三.应用市场首发介绍四.参考文档 一.应用市场排行榜介绍 iiMedia Research(艾媒咨询)权威发布<2017-2018中国 ...
- 解决WIN7启动DHCP服务报1075错误办法
昨天电脑装了Microsoft .NET Framework后,今天一开电脑连不上网了,找了半天问题发现电脑的DHCP服务没有开启,然后在服务中开发DHCP提示下面的内容 原文地址:代码汇个人博客 h ...
- Ambari 常用的 REST API 介绍
源码文档路径:ambari\ambari-server\docs\api\v1 swagger风格api文档:https://www.cnblogs.com/felixzh/p/10694724.ht ...