转自:http://blog.csdn.net/jk110333/article/details/8642261

用户态与内核态交互通信的方法不止一种,sockopt是比较方便的一个,写法也简单.

缺点就是使用 copy_from_user()/copy_to_user()完成内核和用户的通信, 效率其实不高, 多用在传递控制 选项 信息,不适合做大量的数据传输

用户态函数:

发送:int setsockopt ( int sockfd, int proto, int cmd, void *data, int datelen);

接收:int getsockopt(int sockfd, int proto, int cmd, void *data, int datalen)

第一个参数是socket描述符;

第二个参数proto是sock协议,IP RAW的就用SOL_SOCKET/SOL_IP等,TCP/UDP socket的可用SOL_SOCKET/SOL_IP/SOL_TCP/SOL_UDP等,即高层的socket是都可以使用低层socket的命令字 的,IPPROTO_IP;

第三个参数cmd是操作命令字,由自己定义;

第四个参数是数据缓冲区起始位置指针,set操作时是将缓冲区数据写入内核,get的时候是将内核中的数 据读入该缓冲区;

第五个参数数据长度

内核态函数

注册:nf_register_sockopt(struct nf_sockopt_ops *sockops)

解除:nf_unregister_sockopt(struct nf_sockopt_ops *sockops)

setsockopt():在内核调用kernel_setsockopt函数

结构体 nf_sockopt_ops test_sockops

static struct nf_sockopt_ops nso = {

.pf  = PF_INET,       // 协议族

.set_optmin = 常数,    // 定义最小set命令字

.set_optmax = 常数+N,  // 定义最大set命令字

.set  = recv_msg,   // 定义set处理函数

.get_optmin = 常数,    // 定义最小get命令字

.get_optmax = 常数+N,  // 定义最大get命令字

.get  = send_msg,   // 定义set处理函数

};

其中命令字不能和内核已有的重复,宜大不宜小。命令字很重要,是用来做标识符的。而且用户态和内核态要定义的相同,

#define SOCKET_OPS_BASE          128

#define SOCKET_OPS_SET       (SOCKET_OPS_BASE)

#define SOCKET_OPS_GET      (SOCKET_OPS_BASE)

#define SOCKET_OPS_MAX       (SOCKET_OPS_BASE + 1)

set/get处理函数是直接由用户空间的 set/getsockopt函数调用的。 setsockopt函数向内核写数据,用getsockopt向内核读数据。

另外set和get的处理函数的参数应该是这样的

int recv_msg(struct sock *sk, int cmd, void __user *user, unsigned int len)

int send_msg(struct sock *sk, int cmd, void __user *user, unsigned int *len)

附:

int kernel_setsockopt(struct socket *sock, int level, int optname,

char *optval, unsigned int optlen)

{

mm_segment_t oldfs = get_fs();

char __user *uoptval;

int err;

uoptval = (char __user __force *) optval;

set_fs(KERNEL_DS);

if (level == SOL_SOCKET)

err = sock_setsockopt(sock, level, optname, uoptval, optlen);

else

err = sock->ops->setsockopt(sock, level, optname, uoptval,

optlen);

set_fs(oldfs);

return err;

}

如果用户态level == SOL_SOCKET时,那么直接调用socket层统一的接口:sock_setsockopt,在socket层处理了,就像我之前说的那样,无论哪种协议,都在一个函数里面处理。

如果level不是SOL_SOCKET(也就是level是SOL_TCP/SOL_UDP,IPPROTO_IP),那么调用各自协议栈初始化时指向的setsockopt函数,11行的:sock->ops->setsockopt,

Linux 内核态与用户态通信 netlink

参考资料: https://blog.csdn.net/zqixiao_09/article/details/77131283 https://www.cnblogs.com/lopnor/p/615 ...

在linux系统中实现各项监控的关键技术(2)--内核态与用户态进程之间的通信netlink

Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 ...

linux内核态和用户态的信号量

在Linux的内核态和用户态都有信号量,使用也不同,简单记录一下. 1> 内核信号量,由内核控制路径使用.内核信号量是struct semaphore类型的对象,它在中定义struct sema ...

Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3

一.现代操作系统的权限分离: 现代操作系统一般都至少分为内核态和用户态.一般应用程序通常运行于用户态,而当应用程序调用系统调用时候会执行内核代码,此时会处于内核态.一般的,应用程序是不能随便进入内核态 ...

操作系统基本概念(内核态与用户态、操作系统结构)-by sixleaves

内核态与用户态(为什么存在这种机制.程序应处于哪个状态.如何判断当前所处状态.哪些功能需要内核态.如何实现这种机制) 1.首先我们应该思考清楚为什么会有内核态和用户态?(为什么存在这种机制) 因为计算 ...

go语言学习--内核态和用户态(协程)

go中的一个特点就是引入了相比于线程更加轻量级的协程(用户态的线程),那么什么是用户态和内核态呢? 一.什么是用户态和内核态 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核 ...

Linux内核态和用户态

两张图说明Linux内核态和用户态之间的关系

[OS] 内核态和用户态的区别

http://blog.csdn.net/fatsandwich/article/details/2131707# http://jakielong.iteye.com/blog/771663 当一个 ...

cpu与寄存器,内核态与用户态及如何切换

cpu:相当于计算机的大脑负责运算和发送命令: 寄存器:寄存器是cpu当中的一个有限存储部件,cpu从内存调用数据时,寄存器会将从内存调用的数据进行更新在寄存器中以一个字或变量进行存储. 寄存器总共分 ...

【转】linux内核态和用户态的区别

原文网址:http://www.mike.org.cn/articles/linux-kernel-mode-and-user-mode-distinction/ 内核态与用户态是操作系统的两种运行级 ...

随机推荐

Angular2正式版发布,Wijmo抢先支持

Angular2正式版发布 9月15日,Angular 2 的最终版正式发布了.作为 Angular 1 的全平台继任者 -- Angular 2 的最终版,意味着什么? 意味着稳定性已经得到了大范围 ...

POJ 3352-Road Construction (图论-双边联通分支算法)

题目大意:一个图,要求你加入最少的边,使得最后得到的图为一个边双连通分支.所谓的边双连通分支,即不存在桥的连通分支(题目保证数据中任意两点都联通). 解题思路:先用tarjan算法进行缩点建立DAG图 ...

Swift可空(Optional)类型基础

可空类型,对于熟悉C#的同学一定不会陌生.在C#里面值类型都是不能为空的,比如int类型默认为0,bool默认为false.但是我们给int加上?后,就是一个可空类型了. 那么Swift里面呢.Swi ...

iOS开发之iOS程序偏好设置(Settings Bundle)的使用

目录[-] 1.添加设置项 2.设置的控件 3.编辑设置项的文件 4.在程序中获取Settings 和写入Settings 添加UI 5.实现读取设置和保存代码 在Android手机上, 在某个程序里 ...

hdu 4635 Strongly connected 强连通

题目链接 给一个有向图, 问你最多可以加多少条边, 使得加完边后的图不是一个强连通图. 只做过加多少条边变成强连通的, 一下子就懵逼了 我们可以反过来想. 最后的图不是强连通, 那么我们一定可以将它分 ...

NET工厂模式架构

NET工厂模式架构 最近项目的架构需要做调整优化,根据业务需要写了一个简单的工厂模式架构 项目介绍:整个系统分为三大平台(这里用A,B,C来标示),每个平台又细分为多个APP客户端(每个APP都有ap ...

BGP基础【第三部】

静态路由的优点:安全稳定.缺点:配置繁琐不灵活.动态路由的优缺点则反之. BGP边界网关路由协议 路径向量(rip是距离矢量) 到达目的网段所要经过的所有as BGP选路不看度量值而参考13种路径属性 ...

编程岗位电话面试问答Top 50[转]

原文链接:http://blog.jobbole.com/84618/ 1. 从哈希表,二叉树和链表中取元素的时间复杂度?如果你有数百万记录呢? 哈希表的时间复杂度为O(1),二叉树为O(logN) ...

Ejb远程调用-jboss服务器调用服务器-Bean调用Bean

英文参考地址 https://docs.jboss.org/author/display/AS71/Remote+EJB+invocations+via+JNDI+-+EJB+client+API+o ...

Ajax的工作原理以及优点、缺点 (汇总)

最近空闲时间,有朋友问我关于Ajax的工作原理,在这里我结合自己的工作经验和网上大佬的经验做一个总结,如有不足,请各位业内大佬指正 在我们了解Ajax之前,我们先来了解一下Javascript的执行原 ...

linux用户态内核态通信,内核态与用户态通信 之 sockopt相关推荐

  1. Linux内核态之间进程通信,内核态和用户态通信(二)--实现

    本文主要使用netlink套接字实现中断环境与用户态进程通信. 系统环境:基于linux 2.6.32.27 和 linux 3.16.36 Linux内核态和用户态进程通信方法的提出和实现 用户上下 ...

  2. Linux 2.6 下通过 ptrace 和 plt 实现用户态 API Hook

    (转载兼整理)Linux 2.6 下通过 ptrace 和 plt 实现用户态 API Hook 这厮此文写的相当实用,不知道为啥不好好整理一下,得,我代劳了吧.作者:l04m33@gmail.com ...

  3. Linux中Netlink实现热插拔监控——内核与用户空间通信

    1.什么是NetLink? 它 是一种特殊的 socket,它是 Linux 所特有的,由于传送的消息是暂存在socket接收缓存中,并不被接收者立即处理,所以netlink是一种异步通信机制. 系统 ...

  4. 【Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )

    文章目录 一.内核线程概念 二.内核线程.普通进程.用户线程 三.内核线程.普通进程区别 四.内核线程主要用途 五.内核线程创建函数 kernel_thread 源码 一.内核线程概念 直接 由 Li ...

  5. linux 内核维护,Linux 4.18内核系列生命周期结束:用户需尽快更新内核

    IT之家11月28日消息 著名的Linux内核维护者Greg Kroah-Hartman宣布Linux 4.18内核系列的生命周期结束,敦促用户尽快将他们的发行版升级到更新的内核. Linux 4.1 ...

  6. Linux内核源码分析—从用户空间复制数据到内核空间

    Linux内核源码分析-从用户空间复制数据到内核空间 本文主要参考<深入理解Linux内核>,结合2.6.11.1版的内核代码,分析从用户空间复制数据到内核空间函数. 1.不描述内核同步. ...

  7. Linux内核机制总结内存管理之用户页错误文件描述符(二十八)

    文章目录 1 用户页错误文件描述符 1.1 使用方法 1.2 技术原理 重要:本系列文章内容摘自<Linux内核深度解析>基于ARM64架构的Linux4.x内核一书,作者余华兵.系列文章 ...

  8. Linux 内核 vs Windows 内核

    Windows 和 Linux 可以说是我们比较常见的两款操作系统的. Windows 基本占领了电脑时代的市场,商业上取得了很大成功,但是它并不开源,所以要想接触源码得加入 Windows 的开发团 ...

  9. 宏内核与微内核、Linux内核与Unix内核的区别

    宏内核:简单来说,就是把很多东西都集成进内核,例如linux内核,除了最基本的进程.线程管理.内存管理外,文件系统,驱动,网络协议等等都在内核里面.优点是效率高.缺点是稳定性差,开发过程中的bug经常 ...

  10. linux下的系统调用函数到内核函数的追踪

    Original from: http://blog.chinaunix.net/uid-28458801-id-3468966.html 使用的 glibc : glibc-2.17 使用的 lin ...

最新文章

  1. LRU(Least Recently Used)算法的理解
  2. android中暂停服务,Android暂停服务,线程,Asynctask?使用postdelayed的处理程序呢?...
  3. 游戏基础体验研究:玩家想要什么样的美术品质?
  4. 今日最佳:你爸爸给你取名的时候。。。
  5. 3月15日云栖精选夜读:双管齐下,MaxCompute数据上云与生态
  6. python csv合并单元格_python中合并表格的两种方法
  7. Android merge 标签学习笔记
  8. OpenCV-高斯滤波cv::GaussianBlur
  9. Python Error: “ImportError: No module named six”,用自动安装解决依赖问题
  10. EPOLLONESHOT及其引发的EPOLL在ET能被多次触发吗?
  11. 霍常亮淘宝客教你开发app第10节:搭建uni-app开发环境Hbuilder
  12. 局域网传文件_安卓用户福音!让文件传输摆脱数据线的束缚,自由穿梭
  13. 盘点PS使用小技巧。
  14. Contiki开发日记·1——Instant-contiki环境搭建
  15. when I want to have a rest
  16. 用vue2写一个新闻列表页,和新闻详情页,该怎么做?
  17. 基于Qt的智能车载系统嵌入式项目(正点原子IMX6ULL开发板)
  18. 用了TCP协议,就一定不会丢包嘛?
  19. php面向对象第一篇
  20. matlab 28m35,使用F28M35添加自己写的头文件时,出现了“XXX”has already been declared in the current scope的问题...

热门文章

  1. 【SQL Server学习笔记】12:用SQL创建和扩大数据库空间
  2. OVER(PARTITION BY)使用方法
  3. php导出word样式控制,php导出word文档样式以及word文档分页
  4. AdobeFlashPlayer发生安全沙箱冲突
  5. Root file specified for compilation Vetur
  6. 【C++要笑着学】多态 | 重写(覆盖) | 协变构多态 | 父虚子非虚也构多态 | final与override关键字(C++11) | 抽象类 | 纯虚函数 | 抽象类指针
  7. LibOpenCM3(二) 项目模板 Makefile分析
  8. 不二越机器人编程手册_NACHI机器人说明书
  9. JAVA实现贪吃蛇游戏
  10. 总结过去,展望2019