到目前为止,我只知道如何通过gnu arm assembly退出一个程序。
#exit(0) mov r0, #0 # return code mov r7, #1 # supervisor service number svc # call supervisor service
但是还有很多其他的系统调用,例如read,write,fork ……我想他们每个人都需要不同的服务号码,不同数量的寄存器作为参数,以及如何使用寄存器的不同规则。 我的问题是我可以从哪里获得关于为每个人编写程序集的信息。 我search谷歌,但信息是在这个话题较less。
你可以采取类似Android的Bionic的方法, 通过一些元数据和脚本生成sys调用存根,或直接使用Bionic的方法 。
下面是来自Bionic的libc / SYSCALLS.TXT
# this file is used to list all the syscalls that will be supported by # the Bionic C library. It is used to automatically generate the syscall # stubs, the list of syscall constants (__NR_xxxx) and the content of <linux/_unistd.h> # # each non comment line has the following format: # # return_type func_name[:syscall_name[:call_id]]([parameter_list]) (syscall_number|"stub") # # note that: # - syscall_name correspond to the name of the syscall, which may differ from # the exported function name (example: the exit syscall is implemented by the _exit() # function, which is not the same as the standard C exit() function which calls it) # The call_id parameter, given that func_name and syscall_name have # been provided, allows the user to specify dispatch style syscalls. # For example, socket() syscall on i386 actually becomes: # socketcall(__NR_socket, 1, *(rest of args on stack)). # # - each parameter type is assumed to be stored on 32 bits, there is no plan to support # 64-bit architectures at the moment # # - it there is "stub" instead of a syscall number, the tool will not generate any # assembler template for the syscall; it's up to the bionic implementation to provide # a relevant C stub # # - additionally, if the syscall number is different amoung ARM, and x86, MIPS use: # return_type funcname[:syscall_name](parameters) arm_number,x86_number,mips_number # # the file is processed by a python script named gensyscalls.py # # process management void _exit:exit_group (int) 248,252,246 void _exit_thread:exit (int) 1 pid_t __fork:fork (void) 2 <skipped rest of the file>