LINUX内核调试相关--oops信息的定位2 收藏
Ø
1 、掌握printk 的使用、设置及实现原理,理解分级别进行打印log 信息的实现方法
2 、掌握如何分析oops 的方法
3 、掌握strace 工具的移植和使用方法
Ø
1 、请回顾栈的工作原理,尤其是栈帧的作用
2 、请对照printk 的源代码来进行printk 相关实验,并在实验中进一步理解源代码
Ø
一. Printk 实验 。
1 、在内核中编写自己的printk 代码,可利用上次系统调用实验中已有的代码,也可利用之前驱动实验中的模块。
2 、在根文件系统中增加/proc 目录,用来挂载proc 文件系统
3 、重新烧录uImage (如果有所改动的话)和根文件系统,进入控制台之后,输入命令挂载proc 文件系统:mount – t proc none /proc 。
如果挂载成功, /proc 目录应该可以看到文件,比如下面的结果:
# ls proc
1
100
101
102
103
2
3
4
5
6
60
65
71
737
4 、检查并修改printk 的log 级别,比如下面的命令:
# cat /proc/sys/kernel/printk
7
# echo 1 >/proc/sys/kernel/printk
# cat /proc/sys/kernel/printk
1
修改之后,默认的printk 打印(级别为4 )不会显示到串口终端,但仍可以通过“ cat /proc/kmsg ”看到打印结果。
5 、通过代码和 /proc/sys/kernel/printk 分别修改log 级别,并对应printk 的源代码来分析结果。
二.C 语言可变参数实验
1 、在内核代码kernel/printk.c 中的printk 函数用到了C 语言中的可变参数的用法。请参考下面的代码来学习如何使用可变参数。以下代码可直接在x86 环境测试:
#include <stdio.h>
typedef char *va_list;
#define
#define
#define _bnd(X, bnd)
#define va_arg(ap, T)
#define va_end(ap)
#define va_start(ap, A)
int max ( int num, ... )
{