系统调用分析碰到的问题

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
是在做什么呢?

作者: jyhhappyjyh   发布时间: 2011-01-25

回复 jyhhappyjyh


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

作者: amarant   发布时间: 2011-01-26

如果系统调用传入了非法的参数,被缺页中断程序检测到了,就会跳到异常表执行。

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

作者: amarant   发布时间: 2011-01-26