系统调用分析碰到的问题
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
是在做什么呢?
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内核》第十章有讲,就是修正代码。
这个在《深入理解linux内核》第十章有讲,就是修正代码。
作者: amarant 发布时间: 2011-01-26
如果系统调用传入了非法的参数,被缺页中断程序检测到了,就会跳到异常表执行。
__ex_table 指定内核代码段__extable节
a属性指定必须把这一节与内核映像的剩余部分一块加载到内存中
.previous 伪指令强制汇编程序把紧接着的代码插入到遇到上一个.section伪指令时激活的节
__ex_table 指定内核代码段__extable节
a属性指定必须把这一节与内核映像的剩余部分一块加载到内存中
.previous 伪指令强制汇编程序把紧接着的代码插入到遇到上一个.section伪指令时激活的节
作者: amarant 发布时间: 2011-01-26