驱动篇:设备驱动的调试(二)(摘录)
发布日期:2021-06-29 11:35:00 浏览次数:2 分类:技术文章

本文共 875 字,大约阅读时间需要 2 分钟。

驱动篇:设备驱动的调试(二)(摘录)

Oops

当内核出现 Segmentation Fault 时(例如内核访问一个并不存在的虚拟地址), Oops会被打印到控制台和写入系统 ring buffer

产生 Oops 设备驱动的读写函数

static ssize_t oopsexam_read(struct file *filp, char *buf, size_t len,loff_t *off) {
int *p=0; *p = 1; return len;//故意访问 0 地址 }static ssize_t oopsexam_write(struct file *filp, const char *buf,size_t len, loff_t *off) {
int *p=0; *p=1;//故意访问 0 地址 return len; }

假 设 这 个 字 符 设 备 对 应 的 设 备 节 点 是 /dev/oops_example , 通 过 “ echo 1 >/dev/oops_example”命令写设备文件,将得到如下 Oops 信息:

在这里插入图片描述上述 Oops 的第一行给出了“原因”,即访问了“NULL pointer”。Oops 中的“EIP is at oopsexam_write+0x4/0x11 [oops_example]”这一行也比较关键,给出了“事发现场”,即 oopsexam_write()函数偏移 4 字节的指令处。
通过反汇编可以知道偏移 4 字节的指令对应的 C 代码
在这里插入图片描述在这里插入图片描述第 3 行的“movl $0x1,0x0”对应“p = 1;”。这里仅仅给出了一个例子,实际的“事发现场”并不这么容易被找到,但方法都是类似的。同样地,我们通过“cat /dev/oops_example”命令去读设备文件,将得到如下 Oops信息
在这里插入图片描述在驱动中如果发现硬件或软件的运行情况与预期的不一致,完全可以通过下面的语句故意抛出一个 Oops,以便于提供 bug 的上下文信息:(
(int *)0 = 0);

转载地址:https://blog.csdn.net/zytgg123456/article/details/110233285 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:驱动篇:设备驱动的调试(三)(摘录)
下一篇:驱动篇:设备驱动的调试(一)(摘录)

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月19日 14时33分24秒