rockcanon 发表于 2015-06-25 17:19

系统调用的返回的实现原理是什么?

uclinux 2.4 源码, swi 调用后, 转到vector_swi

vector_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 起的作用 **)

rockcanon 发表于 2015-06-26 14:41

或许自己也能回答了:

用arm-elf-objdump 反汇编.o文件,C函数的开始的现场保存和最后返回是由

stmdb   sp!, {fp, ip, lr, pc}

ldmdb   fp, {fp, sp, pc}

这两个指令实现的, 如果lr在进入C函数以前就设置为ret_fast_syscall, 应该返回后就跳到 ret_fast_syscall.

不知道是不是这个原因。

zengboxes 发表于 2015-07-02 18:03

是这样的,因为在调用子程序或产生中断时,LR保存的都是对应应该返回的地址。
页: [1]
查看完整版本: 系统调用的返回的实现原理是什么?