免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4553 | 回复: 13
打印 上一主题 下一主题

mips 内核代码反汇编问题(14楼问题) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-02 12:46 |只看该作者 |倒序浏览
本帖最后由 1ming0 于 2012-02-07 14:10 编辑

ffffffff80216afc <disarm_kprobe>:
ffffffff80216afc:        67bdffe0         daddiu        sp,sp,-32
ffffffff80216b00:        ffb00008         sd        s0,8(sp)
ffffffff80216b04:        3c10808c         lui        s0,0x808c
ffffffff80216b08:        ffb10010         sd        s1,16(sp)
ffffffff80216b0c:        0080882d         move        s1,a0
ffffffff80216b10:        ffbf0018         sd        ra,24(sp)
ffffffff80216b14:        0c084d30         jal        ffffffff802134c0 <mutex_lock>
ffffffff80216b18:        660455b0         daddiu        a0,s0,21936
ffffffff80216b1c:        0c0855d0         jal        ffffffff80215740 <arch_disarm_kprobe>
ffffffff80216b20:        0220202d         move        a0,s1
ffffffff80216b24:        660455b0         daddiu        a0,s0,21936
ffffffff80216b28:        dfbf0018         ld        ra,24(sp)
ffffffff80216b2c:        dfb10010         ld        s1,16(sp)
ffffffff80216b30:        dfb00008         ld        s0,8(sp)
ffffffff80216b34:        08084c96         j        ffffffff80213258 <mutex_unlock>
ffffffff80216b38:        67bd0020         daddiu        sp,sp,32

mips都是32位定长指令,但是ffffffff80216b1c:        0c0855d0         jal        ffffffff80215740 <arch_disarm_kprobe>指令多长??  仅立即数就要占64位

论坛徽章:
0
2 [报告]
发表于 2012-02-02 12:52 |只看该作者
0xffffffff80216b20 - 0xffffffff80216b1c = 4
占 4 字节,32bit

论坛徽章:
0
3 [报告]
发表于 2012-02-02 12:59 |只看该作者
回复 2# platinum

那还有个jal指令占位呢,也得占6位啊;
还有26位怎么表示4个字节的偏移啊??

   

论坛徽章:
0
4 [报告]
发表于 2012-02-02 13:47 |只看该作者
ffffffff80216b1c:        0c0855d0         jal        ffffffff80215740 <arch_disarm_kprobe>
跳转地址 ffffffff80215740 实际上是针对 ffffffff80216b1c 的偏移量
所以整个指令用 32bit 存下是很正常的事情

论坛徽章:
0
5 [报告]
发表于 2012-02-02 14:36 |只看该作者
回复 4# platinum

和这条指令也对不上啊0c0855d0

5740 - 6b1c !=0855d0

0c0855d0拆解完了 0000 1100     0000 1000      0101 0101     1101 0000
                              前六位表示jal(3表示)  后面的26位表示地址  但是好像得不到他们偏移地址。

论坛徽章:
0
6 [报告]
发表于 2012-02-02 14:41 |只看该作者
这个具体就不清楚了,可能要去查 mips 的手册,看它是怎么译码的

论坛徽章:
0
7 [报告]
发表于 2012-02-02 15:51 |只看该作者
本帖最后由 cuic139 于 2012-02-02 15:51 编辑

在我印象里mips每条指令都是32位的,所以加上指令没法表示一个完整的32位立即数,所以32位地址都是通过两步来完成的,先加载前16位ffff,再通过lui加载后四位,你的这个反汇编是64位mips吧,是什么环境下反汇编出来的,公司的设备吗

论坛徽章:
0
8 [报告]
发表于 2012-02-02 16:00 |只看该作者
龙芯64位机   linux64位
关键是怎么看都看不出 0c0855d0这条指令拆出来的偏移地址能对上。

论坛徽章:
0
9 [报告]
发表于 2012-02-02 16:55 |只看该作者
mips 的跳转指令的跳转地址是这样计算的,高于28位的地址和当前延迟槽中指令的地址相同,低28地址是由指令中的低26位左移两位得到。
所以例子所示跳转地址的低28位 = 84c96 << 2 = 213258, 再取当前指令的高位部分,最终的地址就是汇编中的80213258.
至于前面的ffffffff是64位地址扩展得到(把32位的最高比特位扩展)。

论坛徽章:
0
10 [报告]
发表于 2012-02-02 17:54 |只看该作者
回复 9# yuya2003


    谢谢大侠,我把移位看成了简单的加00了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP