免费注册 查看新帖 |

Chinaunix

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

[中断] 一段mips汇编,懂mips汇编的同学帮忙看看,多谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-10 18:55 |只看该作者 |倒序浏览
        这个是mips 处理ade异常里的一段汇编
          case lh_op:
                if (!access_ok(VERIFY_READ, addr, 2))
                        goto sigbus;

                __asm__ __volatile__ (".set\tnoat\n"
#ifdef __BIG_ENDIAN
                        "1:\tlb\t%0, 0(%2)\n"
                        "2:\tlbu\t$1, 1(%2)\n\t"
#endif
#ifdef __LITTLE_ENDIAN
                        "1:\tlb\t%0, 1(%2)\n"
                        "2:\tlbu\t$1, 0(%2)\n\t"
#endif
                        "sll\t%0, 0x8\n\t"
                        "or\t%0, $1\n\t"
                        "li\t%1, 0\n" ------------------------ 上面是将此地址开始的16个bit组起来
                        "3:\t.set\tat\n\t" -------------------------- 从这个开始觉得应该是判断是不是组起来就解决了异常,没解决就把返回值设成-EFAULT
                        ".section\t.fixup,\"ax\"\n\t" --------- 这个段定义是干啥?
                        "4:\tli\t%1, %3\n\t" --------- res = -EFAULT
                        "j\t3b\n\t"  ----------------------- 无条件跳到3的地方,怎么没有判断前面是不是成功就无条件的跳了
                        ".previous\n\t"  ---------------- 还有从这个往下是干什么呢?
                        ".section\t__ex_table,\"a\"\n\t"
                        STR(PTR)"\t1b, 4b\n\t"
                        STR(PTR)"\t2b, 4b\n\t"
                        ".previous"
                        : "=&r" (value), "=r" (res)
                        : "r" (addr), "i" (-EFAULT));
                if (res)
                        goto fault;
                compute_return_epc(regs);
                regs->regs[insn.i_format.rt] = value;
                break;

主要的问题是怎么判断的16bit组起来是否有问题,没问题是怎么走出去的,有问题设置了返回值那个跳转是干什么


多谢大家帮忙哈,O(∩_∩)O

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
2 [报告]
发表于 2012-06-10 19:35 |只看该作者
没仔细看,但是可以说下.section\t.fixup, 这句话是结合这链接脚本干活的。
.previous的意思就是把上面的代码放在这个section(__ex_table)的最后
相关知识在ULK的第十章最后几页有介绍

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
3 [报告]
发表于 2012-06-10 20:38 |只看该作者
通过软件模拟不对齐的内存访问。帖的这段代码应该是处理不对齐的load half,用两次load byte把结果拼起来就行了。

内联汇编里正常的流程走到li\t%1, 0\n就完了,也就是让res = 0,然后就回到C代码里。如果两次内存访问之一产生了异常,在内核判断处理内存异常的代码里,会在exception table中查找出错指令地址。

section\t__ex_table,\"a\"\n\t"
STR(PTR)"\t1b, 4b\n\t"
STR(PTR)"\t2b, 4b\n\t"

这几句话就往exception table里新加了两项,也就是说,如果发现是1b或者2b处的指令引起错误,则跳到4b去执行。4b给res设一个错误值然后回到3b,3b其实是这段内联汇编的结束,也就是说直接跳回C代码中了。

论坛徽章:
0
4 [报告]
发表于 2012-06-10 20:44 |只看该作者
本帖最后由 unbutun 于 2012-06-10 20:47 编辑

回复 3# tempname2



"li\t%1, 0\n" ------------------------ 到这就完了,是用什么做标记,为什么不往下走了?
"3:\t.set\tat\n\t"  ---------- 是这句话么?

   

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
5 [报告]
发表于 2012-06-10 20:48 |只看该作者
确切来说,是  ".section\t.fixup,\"ax\"\n\t"开始了一个新的section。".section\t__ex_table,\"a\"\n\t"也是同理。 所有文件的fixup section和__ex_table section最终应该会各自合成一个大section。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
6 [报告]
发表于 2012-06-10 20:50 |只看该作者
set at和set noat只是提示汇编器可不可以用at寄存器完成一些伪指令。

论坛徽章:
0
7 [报告]
发表于 2012-06-10 20:59 |只看该作者
回复 5# tempname2


                        ".section\t.fixup,\"ax\"\n\t" --------- 从这开始一个新段,上面的已经结束了
                        "4:\tli\t%1, %3\n\t"
                        "j\t3b\n\t"
                        ".previous\n\t"
                        ".section\t__ex_table,\"a\"\n\t"
                        STR(PTR)"\t1b, 4b\n\t"   ---------------- 这个是不是要代码走到了,才会将这个添加到__ex_table里去?
                        STR(PTR)"\t2b, 4b\n\t"
                        ".previous"
                        : "=&r" (value), "=r" (res)
                        : "r" (addr), "i" (-EFAULT));

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
8 [报告]
发表于 2012-06-10 21:10 |只看该作者
回复 7# unbutun

不是,链接完了就有了。exception table section里并不代码,而数据,可以认为是:

struct {
  unsigned long instruction_addr;
  unsigned long fixup_addr;
} exception_table[NR];

内核发现内核态出现page fault,流程之一是搜索这个数组,看看有没有跟出错指令地址相匹配的项。

论坛徽章:
0
9 [报告]
发表于 2012-06-10 21:33 |只看该作者
本帖最后由 unbutun 于 2012-06-10 21:34 编辑

回复 8# tempname2


    哦,受教了,原来是在1的时候发生就会由异常直接跳到4处,然后返回错误码

多谢了,^_^


BTW:
        汇编的结束,是不是以下一个section开始为标志的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP