寻找有关Linux系统调用的详细文档

时间:2012-03-30 09:33:23

标签: c linux assembly system-calls

我想为x86 Linux编写自己的libc库用于学习目的。为此,我需要用汇编级语言调用Linux System调用。我知道如何在Linux上进行程序集调用。但是,我需要有关于Linux系统调用的完整信息。

我正在寻找有关Linux系统调用的详细文档,例如每个系统调用的输入和输出。谁能为我提供Linux系统调用的URL / PDF。

例如,对于'sys_socketcall'调用,注册AX = 102,BX应该包含create / bind之类的方法的调用号,而CX应该包含指向'unsigned long'的指针。在这里,我需要有关第三个参数(CX)的更多信息。

3 个答案:

答案 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 eaxSYS_SOCKET等)编号在SYS_BIND中以及ebx中其他参数的地址。您必须存储一个数组作为示例,3个字用于套接字操作(创建套接字),将系列存储在ecx中,类型存储在my_array[0]中,协议(通常为0)在my_array[1]中,将my_array的地址传递给my_array[2](您没有以任何明确的方式传递ecx中的元素数,这是您调用的套接字子函数所暗示的)。

您可能会喜欢这些文件:

现在,对于不是my_array异常的其他系统调用,您只需要获取对应的POSIX函数(参见reference)或函数的相应描述的引用。来自socketcallman(2)是手册页的一部分,专门用于系统调用),您可以在此处找到:man-pages section 2。然后,您必须记下参数的顺序。您将在man(2)中传递系统调用号码,然后按照eax或POSIX所述的相同顺序传递所有其他参数,按顺序传递man(2)ebxecxedxesiedi(最多六个参数)。状态/结果将在ebp中返回。

请注意,上述内容仅适用于英特尔架构上的Linux(您猜其他处理器还有其他寄存器),并且还注意到x86-32和x86-64之间的系统调用号不同。

答案 2 :(得分:0)