+ -
当前位置:首页 → 问答吧 → 如何注册一个内核模块,能够进行网络通信

如何注册一个内核模块,能够进行网络通信

时间:2006-03-19

来源:互联网

rt,想注册一个内核模块,功能是自定义一种udp包,然后发往一个服务器,然后等待服务器的处理结果。。。。

作者: macping   发布时间: 2006-03-19

这个功能为什么不用应用程序实现,如果可以用应用程序实现最好。如果一定要使用内核模块,你可以在内核模块中也可以在内核模块中使用socket、sendto类似的系统调用。Linux内核支持内核态系统调用,这样就可以象写应用程序那样写内核模块了。

作者: camelguo   发布时间: 2006-03-19

我确实需要在内核态去实现。。。这是必须的

大哥,我有些不明白,内核太调用系统调用怎么调用,举个最简单的例子,比如说向网络广播一个udp数据包(hello world)。。。
怎么编写这个内核模块。。。。(内核不和函数库相连,所以内核模块不能包含通常的头文件是把)

万分感谢大哥。。。

作者: macping   发布时间: 2006-03-19

我确实需要在内核态去实现。。。这是必须的

大哥,我有些不明白,内核太调用系统调用怎么调用,举个最简单的例子,比如说向网络广播一个udp数据包(hello world)。。。
怎么编写这个内核模块。。。。(内核不和函数库相连,所以内核模块不能包含通常的头文件是把)

万分感谢大哥。。。

作者: macping   发布时间: 2006-03-19

我确实需要在内核态去实现。。。这是必须的

大哥,我有些不明白,内核太调用系统调用怎么调用,举个最简单的例子,比如说向网络广播一个udp数据包(hello world)。。。
怎么编写这个内核模块。。。。(内核不和函数库相连,所以内核模块不能包含通常的头文件是把)

万分感谢大哥。。。

作者: macping   发布时间: 2006-03-19

#define __KERNEL_SYSCALLS__
#include <linux/fs.h>


static int __init vman_init(void)
{
printk("<1>Hello,world\n");
int fd;

fd=open("/root/result.tr",O_CREAT|O_RDWR,S_IRWXU);

close(fd);


return 0;
}
这是一个简单的打开和关闭文件的内核实现,,,可是编译不过去,,,,,,网络的系统调用我还搞不清楚在哪里呢......
各位大哥帮帮小弟.........

作者: macping   发布时间: 2006-03-20

在系统目录上可以找到unistd.h(linux/unistd.h和asm/unistd.h),你可以看到所谓的系统调用不过是一个宏而以,_syscall0到_syscall6。写可文件定义系统调用(比如_syscall0(int, open, char*, name, int , flag))就可以了。系统调用对整个操作系统来说仅仅是一次异步上下文切换,所以无论在内核态还是用户态都没有关系。而且在内核态调用系统调用是必须实现的,因为内核代码中就有这样的力例子。

作者: camelguo   发布时间: 2006-03-20

to:amelguo
我知道你说的这些道理,,
那如果要打开文件,用_syscall6(int, open, char*, name, int , flag)还是用open(我自己觉的应该用open,因为这个宏已经展开了,调用一下就行)
但是,两种方法都试了,怎么都编译不过去,,
另外,网络相关的我没太接触过,,,请你帮忙指点一下大概那几个是,,,是不是还要自己添加一些_syscall

作者: macping   发布时间: 2006-03-20

哭了,socket、bind、listen、recvfrom、sendto等等,使用这些系统调用就可以了。

作者: camelguo   发布时间: 2006-03-20

to:amelguo
感谢你的回帖,小弟愚笨,接触linux不久,所以。。。
不好意思,,,求你给小弟讲一下,到底怎么用,直接调用么。。。。。但是我怎么open不了呢
?????
我知道你说的这些道理,,
那如果要打开文件,用_syscall6(int, open, char*, name, int , flag)还是用open(我自己觉的应该用open,因为这个宏已经展开了,调用一下就行)
但是,两种方法都试了,怎么都编译不过去,,
另外,网络相关的我没太接触过,,,请你帮忙指点一下大概那几个是,,,是不是还要自己添加一些_syscall

作者: macping   发布时间: 2006-03-20

#ifndef __KERNEL__

#define __KERNEL__

#endif

#ifndef MODULE

#define MODULE

#endif

#include <linux/module.h>
#include <linux/init.h>

#include <linux/config.h>
#include <asm/uaccess.h>


#define __KERNEL_SYSCALLS__
#include <linux/fs.h>


static int __init vman_init(void)
{
printk("<1>Hello,world\n");
int fd;
fd=open("/root/result1.tr",O_CREAT|O_RDWR,S_IRWXU);
return 0;
}

static void __exit vman_exit(void)
{
printk("<1>Goodbye cruel world\n");
}


MODULE_DESCRIPTION("MAC-filter by Yuelei VMANE project, Northeastern University");

MODULE_AUTHOR("Yuelei");

#ifdef MODULE_LICENSE

MODULE_LICENSE("GPL");

#endif
module_init(vman_init);

module_exit(vman_exit);

作者: macping   发布时间: 2006-03-20

[root@macxiaowei test1]# make
gcc -Wall -O -D__KERNEL__ -DMODULE -DMODVERSIONS -include /usr/src/linux-2.4/include/linux/modversions.h -nostdinc -I /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include -I/usr/src/linux-2.4/include -c test.c -o test.o
test.c: In function `vman_init':
test.c:23: warning: implicit declaration of function `open'
为什么会是这样

作者: macping   发布时间: 2006-03-20

#ifndef __KERNEL__

#define __KERNEL__

#endif

#ifndef MODULE

#define MODULE

#endif

#include <linux/module.h>
#include <linux/init.h>

#include <linux/config.h>
#include <asm/uaccess.h>

#include <asm/unistd.h>

_syscall2(int,open,const char*,name,int,flags)


#define __KERNEL_SYSCALLS__
#include <linux/fs.h>


static int __init vman_init(void)
{
printk("<1>Hello,world\n");
int fd;
fd=open("/root/result1.tr",O_CREAT|O_RDWR,S_IRWXU);
return 0;
}

static void __exit vman_exit(void)
{
printk("<1>Goodbye cruel world\n");
}


MODULE_DESCRIPTION("MAC-filter by Yuelei VMANE project, Northeastern University");

MODULE_AUTHOR("Yuelei");

#ifdef MODULE_LICENSE

MODULE_LICENSE("GPL");

#endif
module_init(vman_init);

module_exit(vman_exit);

作者: camelguo   发布时间: 2006-03-21

谢谢camelguo。。。。
我试试

作者: macping   发布时间: 2006-03-21

[root@macxiaowei test1]# make
gcc -Wall -O -D__KERNEL__ -DMODULE -DMODVERSIONS -include /usr/src/linux-2.4/include/linux/modversions.h -nostdinc -I /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include -I/usr/src/linux-2.4/include -c test.c -o test.o
test.c: In function `open':
test.c:21: `errno' undeclared (first use in this function)
test.c:21: (Each undeclared identifier is reported only once
test.c:21: for each function it appears in.)
make: *** [test.o] Error 1

还是过不去!!为什么,,,,,,郁闷死了
#ifndef __KERNEL__

#define __KERNEL__

#endif

#ifndef MODULE

#define MODULE

#endif

#include <linux/module.h>
#include <linux/init.h>

#include <linux/config.h>
#include <asm/uaccess.h>

#include <asm/unistd.h>

_syscall3(int,open,const char *,file,int,flag,int,mode)


#define __KERNEL_SYSCALLS__
#include <linux/fs.h>


static int __init vman_init(void)
{
printk("<1>Hello,world\n");
int fd;
fd=open("/root/result1.tr",O_CREAT|O_RDWR,S_IRWXU);
return 0;
}

static void __exit vman_exit(void)
{
printk("<1>Goodbye cruel world\n");
}


MODULE_DESCRIPTION("MAC-filter by Yuelei VMANE project, Northeastern University");

MODULE_AUTHOR("Yuelei");

#ifdef MODULE_LICENSE

MODULE_LICENSE("GPL");

#endif
module_init(vman_init);

module_exit(vman_exit);

作者: macping   发布时间: 2006-03-21

camelguo大哥,再给看看.....谢谢

作者: macping   发布时间: 2006-03-21

ifndef __KERNEL__

#define __KERNEL__

#endif

#ifndef MODULE

#define MODULE

#endif

#include <linux/module.h>
#include <linux/init.h>

#include <linux/config.h>
#include <asm/uaccess.h>

#include <asm/unistd.h>

_syscall3(int,open,const char *,file,int,flag,int,mode)

int errno;

#define __KERNEL_SYSCALLS__
#include <linux/fs.h>


static int __init vman_init(void)
{
printk("<1>Hello,world\n");
int fd;
fd=open("/root/result1.tr",O_CREAT|O_RDWR,S_IRWXU);
return 0;
}

static void __exit vman_exit(void)
{
printk("<1>Goodbye cruel world\n");
}


MODULE_DESCRIPTION("MAC-filter by Yuelei VMANE project, Northeastern University");

MODULE_AUTHOR("Yuelei");

#ifdef MODULE_LICENSE

MODULE_LICENSE("GPL");

#endif
module_init(vman_init);

module_exit(vman_exit);

作者: camelguo   发布时间: 2006-03-21

编译是通过了
但是加载过模块,还是没有建立相应的文件。。。。。。。。。。
肯请camelguo把qq或别的即时联系方式留下。。。。
小弟好即时联系请教

作者: macping   发布时间: 2006-03-22

作者: camelguo   发布时间: 2006-03-22

递交重复,见下贴

作者: yulc   发布时间: 2006-03-29

递交重复,见下贴

作者: yulc   发布时间: 2006-03-29

my test result:
fd=open("/root/result1.tr",O_CREAT|O_RDWR,S_IRWXU);
will return -1, and the errno is set 14 (Bad address),
ps, if open success, i think it must call close() that finished create.

引用:
作者: camelguo
ifndef __KERNEL__

#define __KERNEL__

#endif

#ifndef MODULE

#define MODULE

#endif

#include <linux/module.h>
#include <linux/init.h>

#include <linux/config.h>
#include <asm/uaccess.h>

#include <asm/unistd.h>

_syscall3(int,open,const char *,file,int,flag,int,mode)

int errno;

#define __KERNEL_SYSCALLS__
#include <linux/fs.h>


static int __init vman_init(void)
{
printk("<1>Hello,world\n");
int fd;
fd=open("/root/result1.tr",O_CREAT|O_RDWR,S_IRWXU);
return 0;
}

static void __exit vman_exit(void)
{
printk("<1>Goodbye cruel world\n");
}


MODULE_DESCRIPTION("MAC-filter by Yuelei VMANE project, Northeastern University");

MODULE_AUTHOR("Yuelei");

#ifdef MODULE_LICENSE

MODULE_LICENSE("GPL");

#endif
module_init(vman_init);

module_exit(vman_exit);

作者: yulc   发布时间: 2006-03-29

楼上的
你这个,好用么,如果write,close也好用么

作者: macping   发布时间: 2006-04-04

热门下载

更多