liaozhicai 2024-06-13 17:17 采纳率: 20%
浏览 1

mips32 linux4.14的do_ri在哪调用的?

mips32架构
在__libc_csu_init函数中抛出异常SIGILL,调用栈如下:
[18:26:086]sno:4 Fault address:0 s-code:128 eno:0
[18:26:303]/lib/libc.so.6(+0x34b1a160) [0x77442160]
[18:26:304]linux-vdso.so.1(+0x920) [0x7ff97920]
[18:26:304]/usr/bin/MecMgr(__libc_csu_init+0xa2) [0x556bd002]

跟踪代码发现是在do_ri函数中抛出的,但搜遍整个代码,都找不到哪里调用它了,这是为什么?
do_ri这个函数是哪里调用的?cpu检测到指令异常后,产生中断,那这个函数do_ri也没看到放到中断表里去?

中断向量表是在哪设置的?trap_init?

内核4.14

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-13 17:17
    关注

    引自免费微信小程序:皆我百晓生

    在MIPS32架构下的Linux 4.14内核中,do_ri函数主要处理非法指令异常。当CPU遇到无法识别的指令时,它会触发一个异常,然后跳转到预先设定的异常处理程序,即do_ri函数。这个函数通常不在普通用户态代码中直接调用,而是作为内核的一部分,被硬件异常机制间接调用。

    在MIPS体系结构中,中断向量表(Interrupt Vector Table)存储了各种异常和中断的处理程序入口地址。这些入口地址在系统启动早期由内核初始化,通常是通过trap_init函数完成的。trap_init会在初始化过程中设置中断向量表,将各种异常处理程序的地址写入相应的表项中,包括非法指令异常处理程序do_ri的地址。

    为了更深入地理解这个问题,让我们看看do_ri是如何被调用的:

    1. 硬件异常触发:当CPU执行一条无效指令时,它会自动触发一个异常,并跳转到预设的异常处理地址。

    2. 异常处理入口:这个预设的地址指向的是内核中的一段异常处理代码,这段代码会读取异常状态寄存器(Exception Status Register, ESR),确定异常类型。

    3. 跳转到特定处理程序:根据ESR中的信息,异常处理代码会跳转到对应的异常处理函数。对于非法指令异常,这通常就是do_ri函数。

    4. 执行异常处理do_ri函数负责处理非法指令异常,可能包括记录错误、终止进程等操作。

    由于do_ri的调用是由硬件异常机制触发的,因此在用户态代码或普通函数调用链中不会直接看到它的调用。它作为内核的一部分,其调用流程与用户级代码不同,依赖于硬件和操作系统内核的底层机制。

    为了定位具体问题,可以检查以下几点:

    • 确认编译器和链接器是否正确配置,避免生成了不支持的指令。
    • 检查是否有动态加载的模块或库使用了不兼容的指令集。
    • 审查应用程序的汇编代码,确保没有误用MIPS32架构不支持的指令。

    如果需要进一步调试,可以考虑使用内核的kgdb调试功能,或在相关代码路径中添加日志输出,以便追踪异常发生的具体位置和上下文。

    希望上述信息能帮助你解决遇到的问题。如果还有其他疑问或需要更详细的解释,请随时提问。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月13日