免费注册 查看新帖 |

Chinaunix

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

系统调用分析碰到的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-25 11:34 |只看该作者 |倒序浏览
LEAF(sys_syscall)
        lw        t0, PT_R29(sp)                # user sp

        sltu        v0, a0, __NR_Linux + __NR_Linux_syscalls + 1
        beqz        v0, enosys

        sll        v0, a0, 2
        la        v1, sys_syscall
        lw        t2, sys_call_table(v0)        # function pointer
        lbu        t4, sys_narg_table(a0)        # number of arguments

        li        v0, -EINVAL
        beq        t2, v1, out                # do not recurse

        beqz        t2, enosys                # null function pointer?

        andi        v0, t0, 0x3                # unaligned stack pointer?
        bnez        v0, sigsegv

        addu        v0, t0, 16                # v0 = usp + 16
        addu        t1, v0, 12                # 3 32-bit arguments
        lw        v1, THREAD_CURDS($2
        or        v0, v0, t1
        and        v1, v1, v0
        bltz        v1, efault

        move        a0, a1                        # shift argument registers
        move        a1, a2
        move        a2, a3

1:        lw        a3, 16(t0)
2:        lw        t3, 20(t0)
3:        lw        t4, 24(t0)

        .section        __ex_table, "a"
        .word        1b, efault
        .word        2b, efault
        .word        3b, efault
        .previous

        sw        t3, 16(sp)                # put into new stackframe
        sw        t4, 20(sp)

        bnez        t4, 1f                        # zero arguments?
        addu        a0, sp, 32                # then pass sp in a0
1:

        sw        t3, 16(sp)
        sw        v1, 20(sp)
        jr        t2
        /* Unreached */

enosys:        li        v0, -ENOSYS
        b        out

sigsegv:
        li        a0, _SIGSEGV
        move        a1, $28
        jal        force_sig
        /* Fall through */

efault:        li        v0, -EFAULT

out:        jr        ra
END(sys_syscall)


这里的汇编指令
           .section        __ex_table, "a"
        .word        1b, efault
        .word        2b, efault
        .word        3b, efault
        .previous
是在做什么呢?

论坛徽章:
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 [报告]
发表于 2011-01-26 08:15 |只看该作者
回复 1# jyhhappyjyh


    这个在《深入理解linux内核》第十章有讲,就是修正代码。

论坛徽章:
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
3 [报告]
发表于 2011-01-26 08:31 |只看该作者
如果系统调用传入了非法的参数,被缺页中断程序检测到了,就会跳到异常表执行。

__ex_table 指定内核代码段__extable节
a属性指定必须把这一节与内核映像的剩余部分一块加载到内存中
.previous 伪指令强制汇编程序把紧接着的代码插入到遇到上一个.section伪指令时激活的节

论坛徽章:
0
4 [报告]
发表于 2011-01-27 09:55 |只看该作者
回复 3# amarant


    Thank you!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP