Unhandled kernel unaligned access问题记录

2023-11-15

调试新驱动出现如下打印(内核未对齐访问):
[ 765.810527] Unhandled kernel unaligned access[#1]:
[ 765.815483] CPU: 0 PID: 120 Comm: insmod Tainted: G O 3.10.14__isvp_swan_1.0__ #1
[ 765.824120] task: 826daf40 ti: 820ec000 task.ti: 820ec000
[ 765.829700] $ 0 : 00000000 10001c00 804925b0 80200000
[ 765.835113] $ 4 : 00000001 00000000 00000032 00000135
[ 765.840520] $ 8 : 00000135 ffffffe0 804e0000 00000000
[ 765.845932] $12 : 00000000 804e0000 00000000 6d676172
[ 765.851339] $16 : 82505000 80382c30 c0110000 00000003
[ 765.856748] $20 : c010a164 c0110000 c010a578 c010a4a0
[ 765.862159] $24 : 00000001 00000048
[ 765.867569] $28 : 820ec000 820edc90 c01083f4 c00fe760
[ 765.872977] Hi : 00000000
[ 765.875950] Lo : 000002ba
[ 765.878933] epc : 801fcbc0 platform_driver_register+0x8/0x50
[ 765.884960] Tainted: G O
[ 765.888855] ra : c00fe760 audio_dsp_probe+0x2e4/0x3d0 [audio]
[ 765.895063] Status: 10001c03 KERNEL EXL IE
[ 765.899391] Cause : 00800014
[ 765.902364] BadVA : 00000019
[ 765.905337] PrId : 00d00100 (Ingenic Xburst)
[ 765.909835] Modules linked in: audio(O+) [last unloaded: audio]
[ 765.915968] Process insmod (pid: 120, threadinfo=820ec000, task=826daf40, tls=77076460)
[ 765.924243] Stack : 8183ba80 00000002 00000001 00000000 02625a00 00000000 02625a00 00000000
80200000 801fade0 c010a4b0 c010a4e4 c010a114 804f0000 c010a114 80480000
00000001 8277c124 00000028 801fb41c 8277c080 8205c188 8277c080 8038626c
c010a4b0 c010a4e4 c010a114 8277c080 80480000 801fb634 80480000 801f95d4
8042d518 8277c080 00000000 c010a114 801fb5bc 801f9684 8203525c 80381338

[ 765.961044] Call Trace:
[ 765.963570] [<801fcbc0>] platform_driver_register+0x8/0x50
[ 765.969260] [] audio_dsp_probe+0x2e4/0x3d0 [audio]
[ 765.975129] [<801fb41c>] driver_probe_device+0xbc/0x1f8
[ 765.980532] [<801fb634>] __driver_attach+0x78/0xb0
[ 765.985485] [<801f9684>] bus_for_each_dev+0x94/0xa4
[ 765.990526] [<801faa4c>] bus_add_driver+0x114/0x274
[ 765.995569] [<801fbab4>] driver_register+0xb8/0x15c
[ 766.000632] [] audio_dsp_init+0x5c/0x90 [audio]
[ 766.006234] [<80010508>] do_one_initcall+0xf0/0x1b8
[ 766.011278] [<80081f94>] load_module+0x1784/0x1d38
[ 766.016230] [<80082624>] SyS_init_module+0xdc/0xf8
[ 766.021184] [<80023b1c>] stack_done+0x20/0x44
[ 766.025684]
[ 766.027217]
Code: 27bd0018 3c028049 244225b0 8c820000 10400003 3c028020 2442c644 ac820030
[ 766.038964] —[ end trace d4cbe934ee2beefb ]—
Segmentation fault

经过追加打印发现:
struct platform_driver *audio_drivers[] = {
&audio_aic_driver,
&audio_codec_driver,
NULL,
};

此处数组自动识别元素个数,为3个,但是后续代码处理的时候会自动添加新的元素,并且新元素后面的一个也会设置为NULL。这里出现了问题。
实际情况是驱动参数fragment_time默认设置为2,但是程序运行过程中莫名出现了fragment_time变成0的情况,经过查找,没有发现在其他地方有赋值。于是乎只能加打印看是在哪个地方下数值被更改的:
while (audio_drivers[i++] != NULL);
printk("–probe 1.1-- fragment_time=%d\n", fragment_time);
audio_drivers[i] = NULL;
printk("–probe 1.2-- fragment_time=%d\n", fragment_time);
audio_drivers[–i] = &audio_dmic_driver; //此处执行过之后, fragment_time就变成了0,很是奇怪,追查数组可以看到,数组长度只有3,但是这里会把数组第四个元素设置为NULL,也就是0 ,将数组元素个数设置为4即可解决
printk("–probe 1.3-- fragment_time=%d\n", fragment_time);
i = 0;

上述过程有一个问题,夸大数组个数可以解决问题,但是为什么这里的赋值会影响到参数fragment_time的数值(默认为2,上述代码运行之后变成0)?

于是乎,反汇编查看查看:

	mips-linux-gnu-objdump -D audio.o > audio.txt

vim打开audio.txt找到fragment_time所在处(注意,要找到数据段(.data段下面)的fragment_time,因为代码其他地方也有用到这个变量,所以会出现很多次),如下:

	14467 00000054 <audio_drivers>:                                                                                 
	14468     ...
	14469 
	14470 00000060 <fragment_time>:
	14471   60:   00000002    srl zero,zero,0x0

audio_drivers数组有三个元素,指针,所以地址长度=3*4=12,地址0x54为数组首地址,便宜12就是0x60地址(也就是fragment_time的地址),当我们 audio_drivers[i] = NULL;的时候,其实就是把fragment_time给设置成0了,bingo。怎么验证这种想法是正确的?那就把audio_drivers[i] = NULL;改成audio_drivers[i] = 1; 在编译驱动,运行程序发现,fragment_time变成1了。

思考:解决问题的时候,也要关注一下问题的本质,这样也可以顺便了解一下其他知识。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unhandled kernel unaligned access问题记录 的相关文章

  • Pthreads - 高内存使用率

    我正在用 C 编写一些东西 在 256Mb 系统上的 Linux 中创建大量 Pthread 我通常有 200Mb 的免费空间 当我使用少量线程运行该程序时 它可以工作 但是一旦我让它创建大约 100 个线程 它就会出现错误 因为系统内存不
  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • Qt 嵌入式触摸屏 QMouseEvents 在收到 MouseButtonRelease 之前未收到

    我在带有触摸屏的小型 ARM 嵌入式 Linux 设备上使用 Qt 4 8 3 我的触摸屏配置了 tslib 并对其进行了校准 因此 etc 中有一个 pointcal 文件 我的触摸事件的位置工作得很好 但无论如何我都会在鼠标按下或鼠标释
  • 对于任何真实数据集,数据压缩比的最小可能值是多少

    我在写信ZLIB类似于嵌入式硬件压缩器的 API 它使用 deflate 算法来压缩给定的输入流 在进一步讨论之前 我想解释一下数据压缩率 数据压缩率定义为未压缩大小与压缩大小之间的比率 压缩比通常大于一 这意味着压缩数据通常比未压缩数据小
  • 如何在C(Linux utf8终端)中打印“盒子抽屉”Unicode字符?

    我正在尝试显示 方框图范围 2500 257F 中的 Unicode 字符 它应该是标准 utf8 Unicode 标准 版本 6 2 我根本做不到 我首先尝试使用旧的 ASCII 字符 但 Linux 终端以 utf8 显示 并且没有显示
  • Vagrant 遇到问题 - “404 - 未找到”

    我正在尝试使用 Vagrant 制作一个 LAMP 盒子 有人告诉我它使用起来非常简单 我对网络和虚拟机完全陌生 对 Linux Ubuntu 的经验也很少 我目前已尝试按照官方文档页面上的教程进行操作 http docs vagrantu
  • 在ubuntu中打开spyder

    我想在ubuntu中打开spyder Python IDE 通常我会在 shell 中编写 spyder 它会打开spyder IDE 现在 当我在shell中编写spyder时 它只是换行 什么也没有发生 类似于按 enter 我如何找回
  • 为什么 OS X 和 Linux 之间的 UTF-8 文本排序顺序不同?

    我有一个包含 UTF 8 编码文本行的文本文件 mac os x cat unsorted txt foo foo 津 如果它有助于重现问题 这里是文件中确切字节的校验和和转储 以及如何自己生成文件 在 Linux 上 使用base64 d
  • Python glob,操作系统,相对路径,将文件名放入列表中[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个目录中所有文件的列表 其中文件名以 root 结尾 在阅读了论坛中的一些文章后 我尝试使用 glob 和 os listdir 的基本策略 但我都遇到了麻烦 首先 当我使用 import glo
  • BASH:输入期间按 Ctrl+C 会中断当前终端

    我的 Bash 版本是 GNU bash version 4 3 11 1 release x86 64 pc linux gnu 我有一段这样的代码 while true do echo n Set password read s pas
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令的输出?

    我试图将命令的输出分配给变量 而不让命令认为它正在通过管道传输 原因是 如果正在通过管道传输 则相关命令会给出未格式化的文本作为输出 但如果从终端运行 则会给出颜色格式化的文本 我需要获取这种颜色格式的文本 到目前为止我已经尝试了一些事情
  • 在汇编中使用 printf 会导致管道传输时输出为空,但可以在终端上使用

    无输出 https stackoverflow com questions 54507957 printf call from assembly do not print to stdout即使在终端上 当输出不包含换行符时也有相同的原因
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考

随机推荐

  • 谷歌浏览器配置微信浏览器_使用Chrome修改user agent模拟微信内置浏览器

    很多时候 我们需要模拟微信内置浏览器 今天教大家用chrome简单模拟 如图设置 F12或者右键审查元素进入开发者模式 点击Emulation 然后点击Network 把Spoof user agent改成Other 并把下面的带复制进去
  • PaddleSpeech调研、安装、使用

    PaddleSpeech概述 PaddleSpeech asr 模块目前只支持中英文的语音自动识别 建议在Linux环境下安装和使用 配置环境要求 gcc gt 4 8 5 paddlepaddle gt 2 4 1 python gt 3
  • 概率论与数理统计

    目录 一 概率论的基本概念 1 1 概率论的直观解释和数学定义 1 2 条件概率与乘法公式 1 3 全概率公式与贝叶斯公式 1 4 事件的独立性 二 随机变量与分布函数 2 1 随机变量与分布函数 2 2 离散型随机变量和常用分布 2 3
  • 定时任务——Cron表达式详解

    Cron表达式是一个字符串 字符串以5或6个空格隔开 分为6或7个域 每一个域代表一个含义 Cron有如下两种语法格式 Seconds Minutes Hours DayofMonth Month DayofWeek Year或 Secon
  • C++ : 在一个string字符串中查找给定的字符串并提取

    C 在一个string字符串中查找给定的字符串并提取 1 string find last of 返回类型 size t 2 string find first of 返回类型 size t 3 string substr size t a
  • 力扣刷题-面试题 17.13. 恢复空格、字典树、前缀树的应用

    基本概念 Trie 树 又称单词查找树 前缀树 是一种树形结构 典型应用是用于统计 排序和保存大量的字符串 但不仅限于字符串 它的优点是 利用字符串的公共前缀来减少查询时间 最大限度地减少无谓的字符串比较 比哈希表更快 基本性质 根节点不包
  • 正负样本分配策略(OTA, SimOTA,TAS)

    文章目录 OTA SimOTA TAL ATSS OTA 论文 OTA Optimal Transport Assignment for Object Detection 代码 Megvii BaseDetection OTA 标签分配算法
  • c++静态代码扫描工具clang-tidy详细介绍

    clang tidy 文章目录 clang tidy 1 什么是clang tidy 2 clang tidy可以解决什么问题 3 工作原理 4 如何使用clang tidy 4 总结 5 举例说明 1 什么是clang tidy Clan
  • 十五年学不会英语的原因

    学习前预热 轻松学英语第一步 建立英语思维 为什么大家学英语学得这么累 最后依然对英语糊糊涂涂 原因只有一个 就是我们的学习能力太差了 我们的老师太笨了 这篇文章主要是给大家讲英语的基本结构 看了这篇文章 你们会突然就明白 英语怎么会如此简
  • 第19章:python自动化——ChromeOptions与WebUI实操

    目录 一 ChromeOptions设置项 二 WebUI实操 一 ChromeOptions设置项 浏览器在启动之初 如果需要对浏览器进行一些特定内容的定义 可以直接通过浏览器的options类来实现相对应的配置内容 不同的浏览器有不同的
  • Vue中如何配置自定义路径别名

    Vue中如何配置自定义路径别名 在我们日常开发中 常常会导入一些模块或者组件 如果采用相对路径的方式 import uEditor from components tools 会显得臃肿 多余 如果引用稍有差错就会出现 404的报错 不优雅
  • A Survey on Large Language Model based Autonomous Agents

    本文是LLM系列的文章 针对 A Survey on Large Language Model based Autonomous Agents 的翻译 基于大模型的自动agents综述 摘要 1 引言 2 基于LLM的自动代理构建 3 基于
  • 学网络安全都是一群什么人?

    大家好呀 我是知了姐 又是一期学员故事栏目 3月下旬知了堂信安方向开新班 知了姐跟着去采访 了解到新学员们的求学故事 嘿你别说 虽然大家出身专业不同 经历背景不同 如今却在同一个地点相遇 加入到知了堂这个大家庭 不同专业 年龄的他们 为什么
  • 格式工厂5.10.0版本安装

    目前格式工厂有很多 大多都可以进行视频转换 之前遇到一个用ffmpeg拉流保存的MP4在vlc和迅雷都无法正常播放的问题 发现视频长度不对 声音也不对 最后换到了格式工厂的格式播放器是可以正常播放的 格式工厂下载之家的地址 https ww
  • OSG for Android新手教程系列(二)——项目配置

    在上一篇教程中 主要介绍了如何把OSG源代码编译成为能够在Android项目下使用的函数库 在这一篇教程中 我将针对如何在自己的Android项目中配置OSG函数库进行详细讲解 现阶段网上关于OSGfor Android的配置方式教程有很多
  • 用户登录的详细流程(二)JWT生成token登录

    JWT生成token登录 1 jwt的构成 1 header 2 payload 3 signature 2 token的登陆原理 3 在实际中如何应用token 1 设置token的生成代码 2 如何从token中获取有用的信息 3 验证
  • 汇编程序设计与计算机体系结构软件工程师教程笔记:总结

    汇编程序设计与计算机体系结构 软件工程师教程 这本书是由Brain R Hall和Kevin J Slonka著 由爱飞翔译 中文版是2019年出版的 个人感觉这本书真不错 书中介绍了三种汇编器GAS NASM MASM异同 全部示例代码都
  • EC11旋转编码器、stm32f103驱动程序

    1 EC11手册的要点 注意 旋转的速度 RC滤波 手册中推荐的电路 已含有RC滤波 输出波形特点 2 硬件电路 加上RC滤波电路 做法是两个端点都采用10pF电容接地 10K 电阻接VCC 实测100pF电容也行 用示波器看看波形有无噪声
  • 无向图的遍历-BFS与DFS

    一 理论部分 无向图的遍历可用深度搜索 DFS 与广度搜索 BFS 深度搜索的基本方式是由图的一个节点1出发然后随机选一个与其相邻的节点2 接着在选择一个与其相邻的节点3 当一条路遍历完后再选择最近一个遍历过的 且相邻节点有未遍历过的节点
  • Unhandled kernel unaligned access问题记录

    调试新驱动出现如下打印 内核未对齐访问 765 810527 Unhandled kernel unaligned access 1 765 815483 CPU 0 PID 120 Comm insmod Tainted G O 3 10