PF_PACKET 套接字的历史与常见的 (例如,PF_INET) 套接字从调用 socket() 系统调用时就开始不同。socket() 系统调用由 net/socket.c 中的 sys_socket() 函数处理,它使用 sock_create() 函数来确定与指定协议族相关的协议族操作。这些信息来自 net_families 数组,该数组是在内核启动时通过调用 sock_register() 放入的。 此时,内核能够调用特定于给定协议族的 create() 函数,该函数将生成一个合适的 sock 结构并完成创建阶段。
对于 PF_PACKET 套接字,create() 函数对应于 net/packet/af_packet.c 中的 packet_create() 函数。 除此之外,此函数负责将对协议特定操作的引用写入 sock 结构。 请注意,这与协议族特定操作不同:后者仅包含指向 create 函数的指针,而协议特定操作包含可以为给定套接字执行的整套函数(例如,accept、connect、bind、ioctl、listen、sendmsg 等——请查看 include/linux/net.h 以获取完整列表)。