科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Linux用户和内核空间之间的通信实现 (3)

Linux用户和内核空间之间的通信实现 (3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

fget()函数,它是用来获取操作文件的指针,在这篇文档里,我是使用socket创建了一个文件描述符,fd = socket(AF_INET6, SOCK_DGRAM, 0);用户态的创建socket()到内核中传给函数sys_socket()处理

作者:赛迪网技术社区 来源:赛迪网技术社区 2007年10月26日

关键字: 内核 Linux

  • 评论
  • 分享微博
  • 分享邮件
 

其中调用到函数的说明:

★ fget()函数,它是用来获取操作文件的指针,在这篇文档里,我是使用socket创建了一个文件描述符,fd = socket(AF_INET6, SOCK_DGRAM, 0);用户态的创建socket()到内核中传给函数sys_socket()处理, sys_socket()函数先调用函数sock_create()创建socket,然后把socket操作和文件操作关联起来,具体调用函数sock_map_fd()来实现,成功后将文件描述和文件结构file都保存在sock->file中。

对于函数fget()函数,它首先调用fcheck函数,检查一下文件描述符fd是否对应一个打开的文件,如果是就获取该文件,调用函数get_file()将f_count加1。

具体看一下fcheck函数的执行,参考代码:

include/linux/file.h
static inline struct file * fcheck(unsigned int fd)
{
struct file * file = NULL;
struct files_struct *files = current->files;

if (fd < files->max_fds) /*max_fds是最多打开的文件数*/
file = files->fd[fd]; /*其中files_struct结构中定义的file是进程文件描述符表*/
return file;
}

★ filp->f_op->ioctl()函数,调用设备对应的ioctl函数,对于使用socket创建文件描述符,它应该调用sock_ioctl()函数,具体流程图如下:

每一个设备都可以定义自己的ioctl命令字,命令编号的范围是SIOCDEVPRIVATE到SIOCDEVPRIVATE + 15。针对ipv6隧道,它定一个四个命令字,分别是SIOCGETTUNNEL,SIOCADDTUNNEL,SIOCCHGTUNNEL,SIOCDELTUNNEL。用户空间通过ioctl系统调用,最终调用到内核中定义的函数ip6ip6_tnl_ioctl。

sock_ioctl()函数调用中有关的内核函数:
sock_ioctl
inet6_ioctl
dev_ioctl
dev_ifsioc

■ sock_ioctl()

功能::直接调用一个协议特定的函数,如:当socket family是PF_INET6,调用函数inet6_ioctl。

■ inet6_ioctl()

功能:v6对应socket的ioctl内核函数,根据不同的case情况,作相应的处理。

case SIOCADDRT:
case SIOCDELRT: 
return(ipv6_route_ioctl(cmd,(void *)arg));/*对路由表的ioctl操作,
调用内核函ipv6_route_ioctl进行增加或是删除*/

当ioctl命令字不满足上述各种case情况时:

default:
if ((cmd >= SIOCDEVPRIVATE) &&
(cmd <= (SIOCDEVPRIVATE + 15)))
return(dev_ioctl(cmd,(void *) arg));
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章