系统调用的返回的实现原理是什么?
uclinux 2.4 源码, swi 调用后, 转到vector_swivector_swi:
...
adrsvc al, lr, ret_fast_syscall
...
ldrcc pc,
ldrcc pc 根据系统调用号scno, 将sys_call_table里的第scno项的地址装入pc, 实现跳转.
我想问的是, 为什么相应的函数执行后 ( 比如sys_execve()), 会转到ret_fast_syscall?
或者说, lr在怎么起作用的?
因为在这个过程中, 只有B指令, 没有BL指令. (** 除非是 return 起的作用 **) 或许自己也能回答了:
用arm-elf-objdump 反汇编.o文件,C函数的开始的现场保存和最后返回是由
stmdb sp!, {fp, ip, lr, pc}
ldmdb fp, {fp, sp, pc}
这两个指令实现的, 如果lr在进入C函数以前就设置为ret_fast_syscall, 应该返回后就跳到 ret_fast_syscall.
不知道是不是这个原因。 是这样的,因为在调用子程序或产生中断时,LR保存的都是对应应该返回的地址。
页:
[1]