我想为x86 Linux编写自己的libc库用于学习目的。为此,我需要用汇编级语言调用Linux System调用。我知道如何在Linux上进行程序集调用。但是,我需要有关于Linux系统调用的完整信息。
我正在寻找有关Linux系统调用的详细文档,例如每个系统调用的输入和输出。谁能为我提供Linux系统调用的URL / PDF。
例如,对于'sys_socketcall'调用,注册AX = 102,BX应该包含create / bind之类的方法的调用号,而CX应该包含指向'unsigned long'的指针。在这里,我需要有关第三个参数(CX)的更多信息。
答案 0 :(得分:1)
令人惊讶的是,关于linux内核的最佳信息来源是它的来源:https://github.com/torvalds/linux/blob/master/include/linux/syscalls.h应该包含所需的调用定义。
来电来源:http://lxr.free-electrons.com/source/net/socket.c#L2366,您可以在此处查看参数的处理方式。
要在网上快速grep linux源代码,您可以使用LXR:http://lxr.free-electrons.com/ident?i=sys_socketcall。
答案 1 :(得分:1)
socketcall
系统调用是一种特殊情况,因此不要依赖此系统来学习一般格式。此外,它只存在于x86-32上,而其他平台对套接字操作的每个函数/过程使用单独的系统调用(使用这些平台,没有socketcall
,但是socket
,{{1等等)。
对于bind
的特殊情况:它需要socketcall
中的__NR_socketcall
,子函数(ex eax
,SYS_SOCKET
等)编号在SYS_BIND
中以及ebx
中其他参数的地址。您必须存储一个数组作为示例,3个字用于套接字操作(创建套接字),将系列存储在ecx
中,类型存储在my_array[0]
中,协议(通常为0)在my_array[1]
中,将my_array的地址传递给my_array[2]
(您没有以任何明确的方式传递ecx
中的元素数,这是您调用的套接字子函数所暗示的)。
您可能会喜欢这些文件:
现在,对于不是my_array
异常的其他系统调用,您只需要获取对应的POSIX函数(参见reference)或函数的相应描述的引用。来自socketcall
(man(2)
是手册页的一部分,专门用于系统调用),您可以在此处找到:man-pages section 2。然后,您必须记下参数的顺序。您将在man(2)
中传递系统调用号码,然后按照eax
或POSIX所述的相同顺序传递所有其他参数,按顺序传递man(2)
,ebx
,ecx
,edx
,esi
,edi
(最多六个参数)。状态/结果将在ebp
中返回。
请注意,上述内容仅适用于英特尔架构上的Linux(您猜其他处理器还有其他寄存器),并且还注意到x86-32和x86-64之间的系统调用号不同。
答案 2 :(得分:0)