[英]In linux, how to do system calls through GNU ARM assembly
Till now, I only know how to exit a program by gnu arm assembly. 到现在为止,我只知道如何通过gnu arm汇编程序退出程序。
#exit(0)
mov r0, #0 # return code
mov r7, #1 # supervisor service number
svc # call supervisor service
But there are still many other syscalls like read, write, fork... I suppose that each of them will require different service number, different numbers of registers as arguments and different rules on how to use registers. 但是仍然有许多其他的系统调用,例如读,写,分叉...我想它们每个都将需要不同的服务号,不同数量的寄存器作为参数以及关于如何使用寄存器的不同规则。 My question is where I can get information on writing assembly for each of them. 我的问题是,在哪里可以获得有关每个组件编写汇编的信息。 I searched google but the information is less on this topic. 我搜索了google,但有关该主题的信息较少。
You can take an approach like Android's Bionic and generate sys call stubs via some metadata and a script or use Bionic's directly . 您可以采用类似于Android的Bionic的方法,并通过一些元数据和脚本生成sys调用存根,也 可以直接使用Bionic的 。
Below is from Bionic's libc/SYSCALLS.TXT 下面是仿生的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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.