首页 文章

Arm Cortex A-9内核中的“零分割”在哪里

提问于
浏览
1

我正在研究零分割的内核源代码(2.6.35) .

我在用户空间程序中插入了零分割并且所有线程都停止了 .

所以我想知道Arm Cortex A-9内核的“零分割”在哪里?

我无法找到任何陷阱....

谢谢

1 回答

  • 8

    这取决于架构 . 给定 x86 system 上的以下用户空间代码:

    main() {                                                                                                                                                                             
       int x = 42 / 0;                                                                                                                                                                   
    }
    

    编译器将 idivl 命令插入到目标代码中 . 当该除数为0时执行该命令时,CPU会产生除零陷阱(类似于中断) . 这会调用内核中的 divide_error 陷阱处理程序,如果是x86,它位于 arch/x86/kernel/entry_32.S 中:

    ENTRY(divide_error)
            RING0_INT_FRAME
            pushl_cfi $0                    # no error code
            pushl_cfi $do_divide_error
            jmp error_code
            CFI_ENDPROC
    END(divide_error)
    

    然后 error_code 目标负责处理错误的所有必要操作,最后从陷阱返回 .


    ARM 上,情况有所不同:除了少数例外,ARM CPUs do not have a hardware division instruction(例如Arm Cortex A-9没有) . 部门需要作为图书馆职能来实施 . 对于内核,这是在 arch/arm/lib/lib1funcs.S 中实现的,您还可以通过零处理找到除法 . 对于用户空间应用程序,我认为这是作为libgcc库中的库函数实现的 .

相关问题