没有合适的资源?快使用搜索试试~ 我知道了~
首页linux下用户程序同内核通信详解(netlink机制)
资源详情
资源评论
资源推荐

linux下用户程序同内核通信详解(下用户程序同内核通信详解(netlink机制)机制)
主要介绍了linux下用户程序同内核通信详解(netlink机制),涉及netlink,内核模块,用户程序的介绍等相关内
容,小编觉得还是挺不错的,这里分享给大家,需要的朋友可以参考下
简介简介
linux下用户程序同内核通信的方式一般有ioctl, proc文件系统,剩下一个就是Netlink套接字了。 这里先介绍下netlink。
Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink
提供的强大功能,内核态需要使用专门的内核 API 来使用 netlink。
Netlink 相对于系统调用,ioctl 以及 /proc 文件系统而言具有以下优点:
1,为了使用 netlink,用户仅需要在 include/linux/netlink.h 中增加一个新类型的 netlink 协议定义即可, 如 #define
NETLINK_MYTEST 17 然后,内核和用户态应用就可以立即通过 socket API 使用该 netlink 协议类型进行数据交换。但系统
调用需要增加新的系统调用,ioctl 则需要增加设备或文件, 那需要不少代码,proc 文件系统则需要在 /proc 下添加新的文件
或目录,那将使本来就混乱的 /proc 更加混乱。
2. netlink是一种异步通信机制,在内核与用户态应用之间传递的消息保存在socket缓存队列中,发送消息只是把消息保存在接
收者的socket的接 收队列,而不需要等待接收者收到消息,但系统调用与 ioctl 则是同步通信机制,如果传递的数据太长,将
影响调度粒度。
3.使用 netlink 的内核部分可以采用模块的方式实现,使用 netlink 的应用部分和内核部分没有编译时依赖,但系统调用就有
依赖,而且新的系统调用的实现必须静态地连接到内核中,它无法在模块中实现,使用新系统调用的应用在编译时需要依赖内
核。
4.netlink 支持多播,内核模块或应用可以把消息多播给一个netlink组,属于该neilink 组的任何内核模块或应用都能接收到该
消息,内核事件向用户态的通知机制就使用了这一特性,任何对内核事件感兴趣的应用都能收到该子系统发送的内核事件,在
后面的文章中将介绍这一机制的使用。
5.内核可以使用 netlink 首先发起会话,但系统调用和 ioctl 只能由用户应用发起调用。
6.netlink 使用标准的 socket API,因此很容易使用,但系统调用和 ioctl则需要专门的培训才能使用。
下面这两部分代码主要的目的是用netlink机制实现用户程序和内核的通信。 具体就是用户程序执行./netlink -S [我是参数]
或./netlink -G 时,内核会返回"S know you!" 和“I know you!” 这两种字符串, 然后输出。 内核和用户程序均加有打印。
内核模块内核模块
1. Makefile依赖的编译规则依赖的编译规则 ruler.dir
PWD := $(shell pwd)
all: modules romfs
modules:
$(MAKE) -C $(KDIR) M=$(PWD) modules
@echo $(OBJ)
modules_install:
$(MAKE) -C $(KDIR) M=$(PWD) modules_install
romfs:
cp -rf *.ko $(MODULES_BUILD_DIR)
clean:
rm *.o *.ko *.mod.* Module.* modules.*
rm -rf $(MODULES_BUILD_DIR)
obj-m := $(MOD_NAME).o
2.Makefile
KERNEL_MODULES := netlink
export MODULES_ROOT_DIR := $(shell pwd)
export MODULES_BUILD_DIR := $(MODULES_ROOT_DIR)/build
export KDIR := /lib/modules/$(shell uname -r)/build #这行是为了取出系统下内核的目录(ubuntu)
all: init modules romfs
init:











安全验证
文档复制为VIP权益,开通VIP直接复制

评论0