- 论坛徽章:
- 6
|
回复 9# shaohui973
这种情况不适合我,我的socket是用户空间的程序创建的,socketfd也是由用户空间传递过来的。这样的话,内核模块根据fd来查找sock,sk之类的函数引用不了吧。
应该可行。
方案:
1. 用户态传入内核态进程的PID和文件fd.
2. 内核态模块根据PID获取到对应的task_struct
3. 根据task_struct和fd,获取到socket
下面是一个demo代码
struct socket *sockfd_lookup_task(int fd, struct task_struct *task, int *err)
{
struct file *file;
struct socket *sock;
struct files_struct *files = task->files;
rcu_read_lock();
file = fcheck_file(files, fd);
if (file) {
if (file->f_mode & FMODE_PATH || !atomic_long_inc_not_zero(&file->f_count))
file = NULL;
}
rcu_read_unlock();
if (!file)
return -1;
sock = sock_from_file(file, err);
if (!sock)
fput(file);
return sock;
}
4. 调用kernel_sendmsg向socket发送数据包
|
|