系统调用分析碰到的问题
时间:2011-01-25
来源:互联网
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28