Linux伊甸园论坛's Archiver

xinling101 发表于 2008-4-16 21:30

linux中sendto()的源代码怎么找?

[b][size=5]这几天看pppoe的源代码,看到send_disc()这个函数最后调用socket中的sendto()来发送数据包(通过PF_PACKET这个特殊的协议族直接访问驱动)。想看看sendto()的源代码,竟然在linux源码中找不到,我猜最终是调用的
sys_sendto()这个函数,但我不知道sendto()是如何跳到sys_sendto()去的,从源代码中搜寻不到任何信息。能有人给我解释一下吗?非常感谢![/[/size]b]

[[i] 本帖最后由 xinling101 于 2008-4-16 21:33 编辑 [/i]]

zltjiangshi 发表于 2008-4-16 22:39

这个比较复杂,难以说清楚,可以百度一下“系统调用的进入"
主要步骤:
1,glibc里面的封装函数,一般是_syscalln(),执行一下int 0x80;
2,发生上下文切换,进到内核里面
3,根据预定义的系统调用号查找系统调用表,找到处理函数的地址
4,跳转到该地址执行(如sys_sendto())

xinling101 发表于 2008-4-17 07:33

[quote]原帖由 [i]zltjiangshi[/i] 于 2008-4-16 22:39 发表 [url=http://www.linuxeden.com/forum/redirect.php?goto=findpost&pid=607714&ptid=163003][img]http://www.linuxeden.com/forum/images/common/back.gif[/img][/url]
这个比较复杂,难以说清楚,可以百度一下“系统调用的进入"
主要步骤:
1,glibc里面的封装函数,一般是_syscalln(),执行一下int 0x80;
2,发生上下文切换,进到内核里面
3,根据预定义的系统调用号查找系 ... [/quote]

明白了,多谢版主!

xinling101 发表于 2008-4-17 10:16

[size=4][b]基本的原理明白了,另外再请教一下版主具体的问题:这个"sendto"我在linux源代码里找了一下,没有找到它具体是如何对应到一个系统调用的,我猜是通过一些宏吧!但没有找到。请版主指点。

另外,我之前只做过windows和vxworks的开发,从没看过linux这样大规模的源程序,现在有一点读代码的疑问,就是在linxu代码中,经常有:

#include <sys/stdio.h>

这样的语句,本来很简单,但我却经常找不到这个头文件到底在哪里,有时搜索整个源文件目录都找不到,另外sys的目录也找不到,请问这个sys是否是在makefile里面定义的?

问题或许简单了一点,但我确实不明白,能否请版主再指点一下,多谢![/b][/size]

zltjiangshi 发表于 2008-4-17 17:52

sendto是glibc的函数,内核里没有,内核里只有sys_sendto
头文件都在/usr/include下面,sys是它的子目录。

xinling101 发表于 2008-4-18 14:33

回复 #5 zltjiangshi 的帖子

我明白了,多谢斑竹!

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.