本实验使用Linux kernel版本为3.18.6,编译出的内核为32位,UDP程序分为服务端和客户端两部分。
一、给出一个UDP C/S通信的总调用过程
使用GDB对内核进行调试,先加断点b SYSC_socketcall
,查看整个通信过程中socket系统调用情况。
Server的调用过程为:
从图中可以看到call的变化为 :1–>2–>12。
同理,我们可以得到Client的socket调用过程中call值变化为:1–>11–>12。
然后,从内核代码中我们可以寻找到call值对应的socket操作,这些宏的定义在include/uapi/linux/net.h
文件中:
#define SYS_SOCKET 1 /* sys_socket(2) */
#define SYS_BIND 2 /* sys_bind(2) */
#define SYS_CONNECT 3 /* sys_connect(2) */
#define SYS_LISTEN 4 /* sys_listen(2) */
#define SYS_ACCEPT 5 /* sys_accept(2) */
#