socket套接字和驱动绑定分析
1. socket()系统调用
socket系统调用是哪个:socket()有3个参数,因此搜索SYSCALL_DEFINE3,然后在检索socket即可。
SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
sock_create(family, type, protocol, &sock);
__sock_create
sock_alloc
struct inode *inode;
inode->i_op = &sockfs_inode_ops;
struct net_proto_family *pf = rcu_dereference(net_families[family]); //获取之前注册的协议的pf
pf->create(net, sock, protocol, kern); //创建指定协议的套接字
sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK)); // net/socket.c 把套接字映射成fd
newfile=sock_alloc_file(sock, flags, NULL); //返回一个struct file *newfile;
file = alloc_file(&path, FMODE_READ | FMODE_WRITE, &socket_file_ops); //此file的file_operations是全局socket_file_ops
sock->file = file;
file->private_data = sock;
fd_install(fd, newfile); // net/socket.c 若成功就向用户空间返回这个fd
__fd_install(current->files, fd, file); // fs/files.c 放到当前进程的打开文件中
struct fdtable *fdt;
fdt = rcu_dereference_sched(files->fdt); //fs/files.c 放到当前进程的fd符号表中。
2. PF_BLUETOOTH协议族的注册过程
/* ①定义net_proto_family */
static const struct net_proto_family bt_sock_family_ops = { // net/bluetooth/af_bluetooth.c
.owner = THIS_MODULE,
.family = PF_BLUETOOTH,
.create = bt_sock_create,
}; bt_sock_create
err = bt_proto[proto]->create(net, sock, proto, kern); // 调用全局数组bt_proto[proto]->create() /* ②调用sock_register注册此协议族 */
sock_register(&bt_sock_family_ops); sock_register(const struct net_proto_family *ops) // net/socket.c
rcu_assign_pointer(net_families[ops->family], ops); // 将注册的协议族放到net_proto_family类型的全局数组net_families中
3.PF_BLUETOOTH协议族中的协议的注册过程
static const struct proto_ops hidp_sock_ops = {
.family = PF_BLUETOOTH,
.owner = THIS_MODULE,
.release = hidp_sock_release,
.ioctl = hidp_sock_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = hidp_sock_compat_ioctl,
#endif
.bind = sock_no_bind,
.getname = sock_no_getname,
.sendmsg = sock_no_sendmsg,
.recvmsg = sock_no_recvmsg,
.poll = sock_no_poll,
.listen = sock_no_listen,
.shutdown = sock_no_shutdown,
.setsockopt = sock_no_setsockopt,
.getsockopt = sock_no_getsockopt,
.connect = sock_no_connect,
.socketpair = sock_no_socketpair,
.accept = sock_no_accept,
.mmap = sock_no_mmap
}; static struct proto hidp_proto = {
.name = "HIDP",
.owner = THIS_MODULE,
.obj_size = sizeof(struct bt_sock)
}; /* ①定义net_proto_family */
static const struct net_proto_family hidp_sock_family_ops = {
.family = PF_BLUETOOTH,
.owner = THIS_MODULE,
.create = hidp_sock_create
}; hidp_sock_create
sk_alloc(net, PF_BLUETOOTH, GFP_ATOMIC, &hidp_proto, kern);
sock->ops = &hidp_sock_ops; /* ②注册函数不同 */
bt_sock_register(BTPROTO_HIDP, &hidp_sock_family_ops); bt_sock_register
proto_register(&hidp_proto, ); //将hidp_proto.node挂接在全局链表proto_list中
bt_sock_register(BTPROTO_HIDP, &hidp_sock_family_ops);
bt_proto[proto] = &hidp_sock_family_ops; //只是将hidp_sock_family_ops放到全局数组bt_proto中
由上可知,当应用程序调用:sock_fd = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HIDP);时,驱动先调用bt_sock_create(),它再调用hidp_sock_create(),从而此sock_fd会绑定到函数集合hidp_sock_ops。对比于设备文件的操作,这里只是换汤不换药而已。
socket套接字和驱动绑定分析的更多相关文章
- 19、网络编程 (Socket套接字编程)
网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用层.传输层.网络层和链路层,每层分别负责不同的通信功能,接下来针对这四层进行详细地讲解. 链路层:链路层是用于定义物理传输通道,通常是对某些 ...
- 31_网络编程(Socket套接字编程)_讲义
今日内容介绍 1.网络三要素及传输协议 2.实现UDP协议的发送端和接收端 3.实现TCP协议的客户端和服务器 4.TCP上传文件案例 01网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用 ...
- socket套接字TCP API
socket套接字TCP API socket概念 socket又称"套接字",是计算机网络中进程间通信数据通道的一个端点.或称之为句柄.IP地址+port号就能够唯一确定一个so ...
- 网络编程初识和socket套接字
网络的产生 不同机器上的程序要通信,才产生了网络:凡是涉及到倆个程序之间通讯的都需要用到网络 软件开发架构 软件开发架构的类型:应用类.web类 应用类:qq.微信.网盘.优酷这一类是属于需要安装的桌 ...
- 一、网络编程-UDP传输协议及socket套接字使用
知识点基本介绍:1.网络通信协议一般就是UDP和TCP俩种传输协议,这一章先说UDP,UDP是一种比较简单的传输协议,如qq使用的就是UDP 2.ip:ip就是标记网络中中的一台电脑 ...
- Python之异常处理和socket套接字连接7
一.异常处理 1)异常处理的使用意义 什么是异常处理 异常是程序发生错误的信号,即程序一旦出错就会立刻产生一个异常,如果该异常没有被处理 那么异常就抛出来,程序的运行也随之终止 异常分为三部分: 异常 ...
- Python Web学习笔记之socket套接字
套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并进行连接,如发送和接受数据.为了建立通信通道,网络通信 ...
- 19 网络编程--Socket 套接字方法
1.Socket(也称套接字)介绍 socket这个东东干的事情,就是帮你把tcp/ip协议层的各种数据封装啦.数据发送.接收等通过代码已经给你封装好了 ,你只需要调用几行代码,就可以给别的机器发消息 ...
- Socket(套接字) IP TCP UDP HTTP
Socket(套接字) 阮老师的微博 (转)什么是套接字(Socket)? 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进 ...
随机推荐
- WPF:改变ListBoxItem和ListViewItem的颜色
目录 1. 改变ListBoxItem颜色 2. ListViewItem的颜色设置 注意: 本文仅讨论默认ListBoxItem和ListViewItem的鼠标指向和被选择后的前景和背景颜色设置.如 ...
- (转)代号为Purley的新一代服务器平台
英特尔(Intel)正式发布了代号为Purley的新一代服务器平台,包括代号为Skylake的新一代至强(Xeon)CPU,命名为英特尔至强可扩展处理器(Intel Xeon Scalable Pro ...
- Windows 环境下安装 Oracle JDK
本页面中描述了如何在 Window 环境下安装 Oracle JDK. 我们使用的版本是 Window 10,我们需要安装的版本是 Oracle JDK 8u191. 检查当前版本 在进行新的 JDK ...
- kmp练习
kmp板子如下, 失配数组不优化的话, $f_i$就表示子串[0...i]前后缀最大匹配长度 int main() { scanf("%s%s", t, p); int n = s ...
- Ubuntu中vi命令的编辑模式异常
今天更改Ubuntu软件源的时候,进入源文件的编辑模式时,发现删除键和编辑都不能正常使用,百度之后,知道是由于Ubuntu预装的是vim-tiny,而我们需要使用vim-full.在此记录下该问题以便 ...
- python-day12--函数进阶
1.命名空间: 分三种:全局命名空间,局部命名空间,内置命名空间. 加载顺序:内置命名空间→全局命名空间→局部命名空间 取值顺序:局部命名空间→全局命名空间→内置命名空间 2.作用域: 作用域就是作用 ...
- Linux 强制安装rpm 包
Linux 强制安装rpm 包 2014年12月12日 10:21 [root@ilearndb1 Server]# rpm -ivh unixODBC-devel-2.* --nodeps -- ...
- java 判断字符串IP合法性以及获取IP的数值形式
/** * 计算传入的IP地址的数字IP*/ public static long getIpNum(String ip) { long ipNum = 0; if (StringUtils.isNo ...
- linux下批量kill进程的方法
--kill某个用户下的所有进程(用户为test)--pkill # pkill -u test--killall # killall -u test--ps # ps -ef | grep t ...
- Python_Cxfreeze打包exe
Cxfreeze打包exe 1● 下载cxfreeze 1◆ python -m pip install cx_Freeze --upgrade https://sourceforge ...