内核与用户态通信_第1页
内核与用户态通信_第2页
内核与用户态通信_第3页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include #include #include #include #include #include #include#define SOCKET_OPS_BASE#define SOCKET_OPS_SET #define SOCKET_OPS_GET#define SOCKET_OPS_MAX128( SOCKET_OPS_BASE )( SOCKET_OPS_BASE )( SOCKET_OPS_BASE + 1)#define KMSG"a message from kernel"For personal use only in study and resea

2、rch; not for commercial use netfilter 提供了 nf_register_sockopt() 和 nf_unregister_sockopt() 来动态登记或取消 sockopt 命令 字;打开一个网络 socket 后可以使用 set/getsockopt(2) 可实现用户空间与内核的通信,本质 和 ioctl 差不多, 区别在于 set/getsockopt 不用新建设备, 直接利用系统已有的 socket 类型就 可以进行,可用 setsockopt 函数向内核写数据,用 getsockopt 向内核读数据。module.c:<linux/modu

3、le.h><linux/kernel.h><linux/types.h><linux/string.h><linux/netfilter_ipv4.h><linux/init.h> <asm/uaccess.h>#define KMSG_LENsizeof ( "a message from kernel"MODULE_LICENSE ( "GPL" );staticintrecv_msg ( structsock * sk , int cmd, void_user* user

4、gnedintlen )intret= 0;printk ( KERN_INFO "sockopt: recv_msg()n" );unsiif ( cmd = SOCKET_OPS_SET )char umsg 64;int len = sizeof ( char )* 64;memset ( umsg , 0, len );umsg , ret );ret = copy_from_user ( umsg , user , len ); printk ( "recv_msg: umsg = %s. ret = %dn"return 0;static i

5、nt send_msg ( struct sock * sk , int cmd, void _user * user , int* len )int ret = 0;printk ( KERN_INFO "sockopt: send_msg()n" );if ( cmd = SOCKET_OPS_GET )ret = copy_to_user ( user , KMSG, KMSG_LEN);printk ( "send_msg: umsg = %s. ret = %d. successn", KMSG, ret )return 0;static st

6、ruct nf_sockopt_ops test_sockops . pf = PF_INET ,. set_optmin=SOCKET_OPS_SET ,. set_optmax=SOCKET_OPS_MAX ,. set = recv_msg ,. get_optmin=SOCKET_OPS_GET ,. get_optmax=SOCKET_OPS_MAX ,. get = send_msg ,. owner = THIS_MODULE ,;static int _initinit_sockopt ( void )printk ( KERN_INFO "sockopt: init

7、_sockopt()n" ); return nf_register_sockopt (& test_sockops );static void _exitfini_sockopt ( void );printk ( KERN_INFO "sockopt: fini_sockopt()n"nf_unregister_sockopt(& test_sockops );module_init( init_sockopt);module_exit( fini_sockopt);user.c:#include <unistd.h>#includ

8、e <stdio.h>#include <sys/socket.h>#include <linux/in.h>#include <string.h>#include <errno.h>#define SOCKET_OPS_BASE#define SOCKET_OPS_SET #define SOCKET_OPS_GET#define SOCKET_OPS_MAX128( SOCKET_OPS_BASE )( SOCKET_OPS_BASE )( SOCKET_OPS_BASE + 1)#define UMSG#define"

9、a message from userspace"UMSG_LEN sizeof ( "a message from userspace" char kmsg 64;int main ( void ) int sockfd int len ;int ret ;sockfd = socket ( AF_INET , SOCK_RAW, IPPROTO_RAW ); if ( sockfd < 0)printf ( "can not create a socketn" ); return - 1;/*call function recv_ms

10、g()*/ret = setsockopt ( sockfd , IPPROTO_IP , SOCKET_OPS_SET , UMSG, UMSG_L EN);printf( "setsockopt: ret = %d. msg = %sn", ret , UMSG);len = sizeof ( char )* 64 ;/*call function send_msg()*/ret = getsockopt ( sockfd , IPPROTO_IP , SOCKET_OPS_GET , kmsg , &len ); printf( "getsockop

11、t: ret = %d. msg = %sn", ret , kmsg );ifstrerror( ret !=0)printf( errno( "getsockopt error: errno = %d, errstr = %sn" );, errnoclose ( sockfd ); return 0;Makefile:TARGET = testOBJS = test.oMDIR = drivers/miscEXTRA_CFLAGS = -DEXPORT_SYMTABCURRENT = $(shell uname -r)KDIR = /lib/modules/

12、$(CURRENT) /buildPWD = $(shell pwd)DEST = /lib/modules/$(CURRENT) /kernel/$(MDIR)obj-m := $(TARGET) .o $(TARGET)-objs := module.o default :make -C $(KDIR) SUBDIRS= gcc -o user user.c$(TARGET) .o : $(OBJS)$(LD) $(LD_RFLAG) -r -o $ ifneq (, $(findstring 2.4.,$(CURRENT) install :su -c "cp -v $(TAR

13、GET) .o elseinstall :su -c "cp -v $(TARGET) .ko endif$(PWD) modules$(OBJS)$(DEST) && /sbin/depmod -a"$(DEST) && /sbin/depmod -a"clean-rm -rf *.o *.ko . $(TARGET) .ko.cmd .*.flags *.mod.c modules.order Module.symvers .tmp_versions-rm -rf protocol/*.o protocol/.*.o.cmd-rm -rf user-include$(KDIR) /Rules.make仅供个人用于学习、研究;不得用于商业用途。For personal use only in study and research; not for commercial use.Nur f u r den pers?nlichen fu r Studien, Forschung, zu kommerziellen Zwecken verwendet werden.Pour l ' e tude et la recherche uniquementa des fins personne

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论