寻找一份关于Linux系统调用的详细文档。

4
我想为学习目的编写自己的x86 Linux libc库。为此,我需要在汇编语言级别调用Linux系统调用。我知道如何在Linux上使用汇编语言进行系统调用。但是,我需要完整的Linux系统调用信息。
我正在寻找关于Linux系统调用的详细文档,例如每个系统调用的输入和输出。请问是否有人可以提供Linux系统调用的URL/PDF文档。
例如,对于'sys_socketcall'调用,寄存器AX = 102,BX应包含方法的调用号,如创建/绑定,CX应包含指向'unsigned long'的指针。在这里,我需要更多关于第三个参数(CX)的信息。

1
8086上的libc?你吓到我了!不管怎样,你可以从这里开始 - https://dev59.com/f2kx5IYBdhLWcg3wAvmn - Pavan Manjunath
https://dev59.com/G3A65IYBdhLWcg3wzyP8 - Ciro Santilli OurBigBook.com
3个回答

1
socketcall系统调用是一个特殊情况,因此不要依赖它来学习一般格式。此外,它仅存在于x86-32上,其他平台为每个套接字操作的函数/过程使用单独的系统调用(在这些平台上,没有socketcall,而是socketbind等)。
对于特殊情况socketcall:它期望在eax中有__NR_socketcall,在ebx中有子函数(例如SYS_SOCKETSYS_BIND等)编号,在ecx中有其他参数的地址。您将需要存储一个数组,例如3个字,用于套接字操作(创建套接字),将家族存储在my_array [0]中,类型存储在my_array [1]中,并将协议(通常为0)存储在my_array [2]中,然后将my_array的地址传递给ecx(您不以任何明确的方式传递my_array中元素的数量,它由您调用的套接字子功能隐含)。

您可能会喜欢这些文档:

现在,对于不是socketcall的其他系统调用,您只需要获取相应POSIX函数的参考(请参见reference),或从man(2)中获取该函数的相应描述(man(2)是手册页的一个部分,专门用于系统调用),您可以在此处找到一个示例:man-pages section 2。然后,您需要注意参数的顺序。您将在eax中传递系统调用号,然后按照man(2)或POSIX描述的顺序将所有其他参数依次传递给ebxecxedxesiediebp(最多六个参数)。状态/结果将在eax中返回。
请注意上述内容仅适用于英特尔架构的Linux(您可以猜测其他处理器有其他寄存器),并且还请注意x86-32和x86-64之间的系统调用号码不同。

1

谢谢,我仍然不确定“long sys_socket(int, int, int);” API中每个输入的含义。通过Linux代码分析,我可以理解这里每个输入的含义。然而,这需要时间,并且我可能会误解一些东西。因此,我正在寻找有关Linux系统调用的详细信息。 - Dew Kumar
简言之,调用可能具有不同数量的参数,这取决于call参数值。如果您真的想为了学习重新实现libc,最好选择一些像ARM这样的现代平台,找到在8086上运行的内核版本本身就是一个问题。 - vissi2
看一下第2349行,它包含一个参数计数的数组,取决于您存储在BX寄存器中的“call”值。 - vissi2
是的,参数计数取决于调用值。正在寻找每个参数的文档。 - Dew Kumar
我猜应该有一个标准库实现者或系统程序员专用的文档,详细描述每个系统调用。 - Dew Kumar
正如您所看到的,其他人提供的链接过于笼统,没有直接回答您的问题。而且我不知道有比源代码更好的文档(您不愿意阅读源代码)。这个函数是一种映射器,它根据 call 参数值调用其他函数。例如,在它等于 SYS_SOCKET 的情况下,它将使用 3 个参数调用 sys_socket:http://lxr.free-electrons.com/source/net/socket.c#L2390。因此,您应该查找 sys_socket 的定义以了解它们的含义,依此类推。 - vissi2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接