目录
5.2、sym/rd + struct 命令解析xxx.ko中的全局变量
环境:arm64,Linux version 5.10.66
1、实验目的
使用crash解析全局变量 KdumpStack_st stKdumpStack
实验程序如下,当程序编译成ko并使用insmod加载到设备后,串口输入 echo kdump-3 > /proc/dbug/dump 命令之后执行我们的测试程序,kdump产生vmcore文件后使用crash命令来解析全局变量 KdumpStack_st stKdumpStack 的内容。
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/device.h>
#include <linux/proc_fs.h>
#include <linux/version.h>
#include <linux/mman.h>
#include <linux/mm.h>
#include <linux/printk.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/kasan.h>
#include <linux/kernel.h>
#include <linux/spinlock.h>
#include <linux/kthread.h>
/*
写成功要返回写入的字节数,否则 linux 还会尝试写入
*/
#define PROC_DIR_NAME "dbug" //文件夹名
#define PROC_FILE_NAME "kdump" //文件名称
#define KBUFSIZE 40
#define NAMELEN 20
typedef struct kdump_stack {
char cName[NAMELEN];
int iNumbers;
struct list_head list;
void (*printk)(void);
} KdumpStack_st;
typedef struct kdump_node {
char cName[NAMELEN];
int iNumber;
struct list_head list;
} KdumpNode_st;
typedef struct kdump_localval {
char cName[NAMELEN];
int iNumber;
} KdumpLkval_st;
static KdumpLkval_st *gpstKdLkval = NULL;
static KdumpStack_st stKdumpStack = {0};
void kdump_printk(void)
{
printk("%s %s %d", __FILE__, __func__, __LINE__);
/* 自定义触发kdump的办法 */
panic("kdump test,Parse stack data");
}
int kdump_stack_test(int num, KdumpStack_st *pstKdStack, KdumpLkval_st *pstKdLkval)
{
int iCycle = 0;
char cNodeName[NAMELEN] = {0};
KdumpNode_st *pstKdNode = NULL;
/* 链表查看 */
for(iCycle = 0; iCycle < num; iCycle++) {
pstKdNode = kzalloc(sizeof(KdumpNode_st), GFP_KERNEL);
snprintf(cNodeName, NAMELEN, "node_%d", iCycle);
strncpy(pstKdNode->cName, cNodeName, NAMELEN);
pstKdNode->iNumber = iCycle;
list_add_tail(&pstKdNode->list, &pstKdStack->list);
}
/* 栈中结构体变量 */
pstKdLkval->iNumber = 101;
/* 堆中结构体变量 */
gpstKdLkval->iNumber = 201;
/* 全局结构体变量 */
pstKdStack->printk();
return 0;
}
int kdump_proc_write(int num)
{
KdumpLkval_st stKdLkval = {0};
/* 链表 */
INIT_LIST_HEAD(&stKdumpStack.list);
/* 全局结构体变量 */
strncpy(stKdumpStack.cName, "StTest", NAMELEN);
stKdumpStack.iNumbers = num;
stKdumpStack.printk = kdump_printk;
/* 栈中结构体变量 */
strncpy(stKdLkval.cName, "local val", NAMELEN);
stKdLkval.iNumber = 100;
/* 堆中结构体变量 */
gpstKdLkval = kzalloc(sizeof(KdumpLkval_st), GFP_KERNEL);
strncpy(gpstKdLkval->cName, "heap val", NAMELEN);
gpstKdLkval->iNumber = 200;
kdump_stack_test(num, &stKdumpStack, &stKdLkval);
return 0;
}
/

文章描述了一个实验,通过crash工具解析Linuxkernel中模块化驱动的全局变量和堆变量,涉及p命令、rd命令的使用以及堆内存的获取过程。
最低0.47元/天 解锁文章
1380

被折叠的 条评论
为什么被折叠?



