ZYNQ printk 缓冲区读取

news/2024/7/8 0:53:05

之前调试kenel ,如果kenenl崩溃会,通过内核system.map定位log_buf变量地址,给cpu复位,在u-boot中读取对应的物理地址,即可知道最终内核崩溃最后打出的消息。

我在使用 5.4.154这个内核版本,中没有log_buf这个变量,经过分析 kernel/printk.c文件,我尝试打出这个日志文件,printk.c中部分源码如下:

 其中在372行定义

DECLARE_STATIC_PRINTKRB(printk_rb, CONFIG_LOG_BUF_SHIFT, &printk_cpulock);

我查了这个宏定义在 include/linux/printk_ringbuffer.h这个头文件中,这个宏定义如下

#define DECLARE_STATIC_PRINTKRB(name, szbits, cpulockptr)		\
static char _##name##_buffer[1 << (szbits)]				\
	__aligned(__alignof__(long));					\
static DECLARE_WAIT_QUEUE_HEAD(_##name##_wait);				\
static void _##name##_wake_work_func(struct irq_work *irq_work)		\
{									\
	wake_up_interruptible_all(&_##name##_wait);			\
}									\
static struct irq_work _##name##_wake_work = {				\
	.func = _##name##_wake_work_func,				\
	.flags = IRQ_WORK_LAZY,						\
};									\
static struct printk_ringbuffer name = {				\
	.buffer = &_##name##_buffer[0],					\
	.size_bits = szbits,						\
	.seq = 0,							\
	.lost = ATOMIC_LONG_INIT(0),					\
	.tail = ATOMIC_LONG_INIT(-111 * sizeof(long)),			\
	.head = ATOMIC_LONG_INIT(-111 * sizeof(long)),			\
	.reserve = ATOMIC_LONG_INIT(-111 * sizeof(long)),		\
	.cpulock = cpulockptr,						\
	.ctx = ATOMIC_INIT(0),						\
	.wq = &_##name##_wait,						\
	.wq_counter = ATOMIC_LONG_INIT(0),				\
	.wq_work = &_##name##_wake_work,				\
}

把这行代码进行宏展开

DECLARE_STATIC_PRINTKRB(printk_rb, CONFIG_LOG_BUF_SHIFT, &printk_cpulock);

等价与

#define DECLARE_STATIC_PRINTKRB( szbits, cpulockptr)
//只替换name

static char _printk_rb_buffer[1 << (szbits)] __aligned(__alignof__(long));
static DECLARE_WAIT_QUEUE_HEAD(_printk_rb_wait);

static void _printk_rb_wake_work_func(struct irq_work *irq_work)
{
	wake_up_interruptible_all(&_printk_rb_wait);
}

static struct irq_work _printk_rb_wake_work = {
	.func = _printk_rb_wake_work_func,
	.flags = IRQ_WORK_LAZY,	
};	

static struct printk_ringbuffer printk_rb = {
	.buffer = &_printk_rb_buffer[0],
	.size_bits = szbits,				
	.seq = 0,					
	.lost = ATOMIC_LONG_INIT(0),		
	.tail = ATOMIC_LONG_INIT(-111 * sizeof(long)),
	.head = ATOMIC_LONG_INIT(-111 * sizeof(long)),
	.reserve = ATOMIC_LONG_INIT(-111 * sizeof(long)),
	.cpulock = cpulockptr,				
	.ctx = ATOMIC_INIT(0),					
	.wq = &_printk_rb_wait,					
	.wq_counter = ATOMIC_LONG_INIT(0),		
	.wq_work = &_printk_rb_wake_work,		
}

可以看到上面宏定义 _printk_rb_buffer的数组,做缓冲区,我们只需要读取这个数据就可以,

在system.map中搜索_printk_rb_buffer中搜索如下图:

 由于ZYNQ的DDR是从0x0开始,根据system.map中的值0xc0c6fcd0,减去0xc0000000,在u-boot中通过md读取0x00c6fcd0就可以。

我使用的是ZYNQ平台,通过vivado的sdk工具,读取

 通过二进制工具打开,效果如下图

 

这个缓冲区数据有格式,没有仔细研究,将就能看。

本文章做个笔记,下次调试再翻看。


http://lihuaxi.xjx100.cn/news/559493.html

相关文章

4. 识别线程

识别线程线程表示类型为std::id可以通过两种方式进行检索第一种可以通过std::thread 的对象成员函数get_id()来直接获取 第二种是在当前线程中调用std::get_id()void func(){cout<<"print id in son process"<<std::this_thread::get_id()<<endl; …

tomcat组件-Server

目录 概述 tomcat 启动 大致流程 Server StandardServer 利用8005端口关闭tomcat 总结 概述 了解一个程序&#xff0c;一定要知道他是干什么的&#xff0c;以及内部架构如何支撑这么干的&#xff0c;以及牵扯的到的概念、模式等知识点的解析(这里只介绍组件)。 Tomcat是…

<C++>二叉树进阶

文章目录为什么要学这一节1. 二叉搜索树1.1 二叉搜索树概念1.2 二叉搜索树操作1.3 二叉搜索树的实现1.4 二叉搜索树的应用1.5 二叉搜索树的性能分析2. 经典题目2.1 最近公共祖先2.2 从前序与中序遍历序列构造二叉树2.3 二叉树的前序遍历&#xff08;非递归&#xff09;为什么要…

vue新春游戏-拼手速抢车票小游戏,学习玩乐两不误,春节小游戏,新年小游戏

ue新春游戏-拼手速抢车票&#xff0c;老规矩&#xff0c;体验地址&#xff1a;http://game.pkec.net/word-ticket/。 写这个主要是前几天群里运营老师说咋没人写抢车票的&#xff0c;再加上我上一篇文章上了掘金一周&#xff0c;听说多上几次有证书&#xff0c;我还没搞到过掘金…

JVM垃圾回收相关算法-垃圾清除阶段

文章目录学习资料垃圾回收相关算法垃圾清除阶段标记-清除&#xff08;Mark - Sweep&#xff09;算法复制算法标记-压缩&#xff08;或标记-整理、Mark - Compact&#xff09;算法分代收集算法增量收集算法分区算法学习资料 【尚硅谷宋红康JVM全套教程&#xff08;详解java虚拟…

FORM中的日历开发

Calendar是Template提供给我们的standard object.可以使我们方便的为日期型字段提供日期的选择列表. 为项指定值列表 KEY-LISTVAL触发器 calendar.show; calendar.show(SYSDATE);--显示当前时间 相关函数 calendar.show(first_date date default null) calendar.setup(new…

Airtest的UI自动化二、项目初始化

Airtest的UI自动化二、项目初始化 gitlab新建项目 公司的gitlab创建完项目之后还必须添加一个readme.md文档才会真正的创建master分支哦 然后下载到本地 添加虚拟环境 安装基础依赖 pip3 install airtest //airtest引入pip3 install allure-pytest //生成自己想要格式的…

XMLHttpRequest的基本使用

1、什么XMLHttpRequest XMLHttpRequest&#xff08;简称 xhr&#xff09;是浏览器提供的 Javascript 对象&#xff0c;通过它&#xff0c;可以请求服务器上的数据资源。之前所学的 jQuery 中的 Ajax 函数&#xff0c;就是基于 xhr 对象封装出来的。 2、使用xhr发起GET请求 步骤…