Q:用户空间调用ioctl操作网卡设备行为时,调用链是什么样的?不同的socket类型是否也不一样?
先来看一下系统调用ioctl的调用链是什么样的,请看下表
函数名称
|
文件名
|
做了什么 |
---|---|---|
SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) | fs/ioctl.c | ioctl函数入口 |
do_vfs_ioctl | fs/ioctl.c | 真正入口,这个函数里边会区分哪些是针对真正的文件进行操作的,哪些是针对虚拟文件进行操作的,显然socket这类的ioctl就属于虚拟文件 |
vfs_ioctl | fs/ioctl.c | 这个函数会根据文件描述符的指针找到文件操作指针f_op对应的指针接口函数unlocked_ioctl,那么这个unlocked_ioctl的函数指针在哪里注册的呢?net/socket.c里边调用系统调用socket创建sock文件描述符的时候通过sock_map_fd函数再调用函数sock_alloc_file,这个函数里边会将socket_file_ops注入到socket文件描述符里边,有的人 |