什么是Linux内核的运算UD2 code的目的是什么? [英] What's the purpose of the UD2 opcode in the Linux kernel?

查看:217
本文介绍了什么是Linux内核的运算UD2 code的目的是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我发现在Linux内核中的下列片段(不对应的C code虽然),在启动阶段的某个地方。你可以清楚地看到 0F 0B 部分,其中立为 UD2 运code(IDA拒绝拆解)。

有这里是这款运算code一些用法解释和的here 的。在这种情况下,然而,运算codeS该指令后,就没有真正意义。

  seg000:000C059E测试EDX,EDX
seg000:000C05A0 JNZ短loc_C05AA
seg000:000C05A0; --------------------------------------------------
seg000:000C05A2分贝的0Fh
seg000:000C05A3分贝值0Bh
seg000:000C05A4 DB 73H
seg000:000C05A5 0分贝
seg000:000C05A6 DB 86H;一个
seg000:000C05A7分贝4Ah可; Ĵ
seg000:000C05A8 DB 27H;
seg000:000C05A9分贝0C0H; +
seg000:000C05AA; --------------------------------------------------
seg000:000C05AA
seg000:000C05AA loc_C05AA:
seg000:000C05AA CMP EAX,[EDI + 4]
seg000:000C05AD JBE短loc_C05B7
seg000:000C05AD; --------------------------------------------------
seg000:000C05AF分贝的0Fh
seg000:000C05B0分贝值0Bh
seg000:000C05B1 DB 75H
seg000:000C05B2 0分贝
seg000:000C05B3 DB 86H
seg000:000C05B4分贝4Ah可; Ĵ
seg000:000C05B5 DB 27H;
seg000:000C05B6分贝0C0H; +
seg000:000C05B7; --------------------------------------------------
seg000:000C05B7
seg000:000C05B7 loc_C05B7:
seg000:000C05B7加ECX,0FFFh过
seg000:000C05BD SHR ESI,0CH
seg000:000C05C0 SHR ECX,0CH
seg000:000C05C3子ECX,ESI
seg000:000C05C5 CMP ECX,EBX
seg000:000C05C7 JNB短loc_C05E9
seg000:000C05C9 LEA ESI,[ESI + 0]
seg000:000C05D0
seg000:000C05D0 loc_C05D0:
seg000:000C05D0 MOV EDX,[EDI + 8]
seg000:000C05D3 BTR [EDX],ECX
seg000:000C05D6 SBB EAX,EAX
seg000:000C05D8 TEST EAX,EAX
seg000:000C05DA JNZ短loc_C05E4
seg000:000C05DA; ------------------------------------------------
seg000:000C05DC分贝的0Fh
seg000:000C05DD分贝值0Bh
seg000:000C05DE分贝为7Fh
seg000:000C05DF 0分贝
seg000:000C05E0 DB 86H;一个
seg000:000C05E1分贝4Ah可; Ĵ
seg000:000C05E2 DB 27H;
seg000:000C05E3分贝0C0H; +
seg000:000C05E4; -------------------------------------------------
seg000:000C05E4
seg000:000C05E4 loc_C05E4:
seg000:000C05E4 INC ECX


解决方案

这是BUG()宏从<一个href=\"http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/asm-i386/bug.h?v=2.6.11.8\">include/asm-i386/bug.h.

  / *
 *告诉用户有一些问题。
 *有问题的文件和线路都设有codeD之后的正式
 *未定义运code在陷阱处理程序解析。
 * /#IFDEF CONFIG_DEBUG_BUGVERBOSE
#定义BUG()\\
 __asm​​__ __volatile __(UD2 \\ N\\
                        \\ t.word%C0 \\ N\\
                        \\ t.long%C1 \\ N\\
                         :I(__LINE__),I(__FILE__))

例如,一个在0C05AF是在0xC0274A86名称为文件和行号117(0x75)。

I have found the following fragment in the Linux kernel (not the corresponding C code though), somewhere during the start up phase. You can clearly see the 0F 0B parts, which stand for the UD2 opcode (IDA refused to disassemble).

There are some possible usages for this opcode explained here and here. In this case, however, the opcodes after this instruction don't really make sense.

seg000:000C059E                 test    edx, edx
seg000:000C05A0                 jnz     short loc_C05AA
seg000:000C05A0 ; --------------------------------------------------
seg000:000C05A2                 db  0Fh
seg000:000C05A3                 db  0Bh
seg000:000C05A4                 db 73h
seg000:000C05A5                 db 0
seg000:000C05A6                 db  86h ; å
seg000:000C05A7                 db  4Ah ; J
seg000:000C05A8                 db  27h ; '
seg000:000C05A9                 db 0C0h ; +
seg000:000C05AA ; --------------------------------------------------
seg000:000C05AA
seg000:000C05AA loc_C05AA:                              
seg000:000C05AA                 cmp     eax, [edi+4]
seg000:000C05AD                 jbe     short loc_C05B7
seg000:000C05AD ; --------------------------------------------------
seg000:000C05AF                 db  0Fh
seg000:000C05B0                 db  0Bh
seg000:000C05B1                 db 75h
seg000:000C05B2                 db    0
seg000:000C05B3                 db 86h
seg000:000C05B4                 db  4Ah ; J
seg000:000C05B5                 db  27h ; '
seg000:000C05B6                 db 0C0h ; +
seg000:000C05B7 ; --------------------------------------------------
seg000:000C05B7
seg000:000C05B7 loc_C05B7:                              
seg000:000C05B7                 add     ecx, 0FFFh
seg000:000C05BD                 shr     esi, 0Ch
seg000:000C05C0                 shr     ecx, 0Ch
seg000:000C05C3                 sub     ecx, esi
seg000:000C05C5                 cmp     ecx, ebx
seg000:000C05C7                 jnb     short loc_C05E9
seg000:000C05C9                 lea     esi, [esi+0]
seg000:000C05D0
seg000:000C05D0 loc_C05D0:                              
seg000:000C05D0                 mov     edx, [edi+8]
seg000:000C05D3                 btr     [edx], ecx
seg000:000C05D6                 sbb     eax, eax
seg000:000C05D8                 test    eax, eax
seg000:000C05DA                 jnz     short loc_C05E4
seg000:000C05DA ; ------------------------------------------------
seg000:000C05DC                 db  0Fh
seg000:000C05DD                 db  0Bh
seg000:000C05DE                 db 7Fh
seg000:000C05DF                 db 0
seg000:000C05E0                 db  86h ; å
seg000:000C05E1                 db  4Ah ; J
seg000:000C05E2                 db  27h ; '
seg000:000C05E3                 db 0C0h ; +
seg000:000C05E4 ; -------------------------------------------------
seg000:000C05E4
seg000:000C05E4 loc_C05E4:                              
seg000:000C05E4                 inc     ecx

解决方案

It's the BUG() macro from include/asm-i386/bug.h.

/*
 * Tell the user there is some problem.
 * The offending file and line are encoded after the "officially
 * undefined" opcode for parsing in the trap handler.
 */

#ifdef CONFIG_DEBUG_BUGVERBOSE
#define BUG()                           \
 __asm__ __volatile__(  "ud2\n"         \
                        "\t.word %c0\n" \
                        "\t.long %c1\n" \
                         : : "i" (__LINE__), "i" (__FILE__))

For example, the one at 0C05AF is for file with name at 0xC0274A86 and line number 117 (0x75).

这篇关于什么是Linux内核的运算UD2 code的目的是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆