LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3198|回复: 22

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

[复制链接]
发表于 2006-3-19 14:14:10 | 显示全部楼层 |阅读模式
rt,想注册一个内核模块,功能是自定义一种udp包,然后发往一个服务器,然后等待服务器的处理结果。。。。
发表于 2006-3-19 16:57:07 | 显示全部楼层
这个功能为什么不用应用程序实现,如果可以用应用程序实现最好。如果一定要使用内核模块,你可以在内核模块中也可以在内核模块中使用socket、sendto类似的系统调用。Linux内核支持内核态系统调用,这样就可以象写应用程序那样写内核模块了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-19 18:29:02 | 显示全部楼层
我确实需要在内核态去实现。。。这是必须的

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

万分感谢大哥。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-19 18:29:04 | 显示全部楼层
我确实需要在内核态去实现。。。这是必须的

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

万分感谢大哥。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-19 18:29:22 | 显示全部楼层
我确实需要在内核态去实现。。。这是必须的

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

万分感谢大哥。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-19 19:42:51 | 显示全部楼层
#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;
}
这是一个简单的打开和关闭文件的内核实现,,,可是编译不过去,,,,,,网络的系统调用我还搞不清楚在哪里呢......
各位大哥帮帮小弟.........
回复 支持 反对

使用道具 举报

发表于 2006-3-19 22:24:55 | 显示全部楼层
在系统目录上可以找到unistd.h(linux/unistd.h和asm/unistd.h),你可以看到所谓的系统调用不过是一个宏而以,_syscall0到_syscall6。写可文件定义系统调用(比如_syscall0(int, open, char*, name, int , flag))就可以了。系统调用对整个操作系统来说仅仅是一次异步上下文切换,所以无论在内核态还是用户态都没有关系。而且在内核态调用系统调用是必须实现的,因为内核代码中就有这样的力例子。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-20 08:16:32 | 显示全部楼层
to:amelguo
我知道你说的这些道理,,
那如果要打开文件,用_syscall6(int, open, char*, name, int , flag)还是用open(我自己觉的应该用open,因为这个宏已经展开了,调用一下就行)
但是,两种方法都试了,怎么都编译不过去,,
另外,网络相关的我没太接触过,,,请你帮忙指点一下大概那几个是,,,是不是还要自己添加一些_syscall
回复 支持 反对

使用道具 举报

发表于 2006-3-20 11:48:30 | 显示全部楼层
哭了,socket、bind、listen、recvfrom、sendto等等,使用这些系统调用就可以了。
回复 支持 反对

使用道具 举报

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表