作者roylee17 (把我id还我阿......)
看板LinuxDev
标题Re: [问题] kernel space呼叫user space的binary
时间Sat Aug 27 13:35:09 2011
※ 引述《cobrasgo (体重突破所有均线)》之铭言:
: 标题: [问题] kernel space呼叫user space的binary
: 时间: Fri Aug 26 21:00:42 2011
:
: 各位大神好
: 小弟现在碰到一个问题无法解决
: 状况如下:
:
: 我在kernel space想要呼叫user space的binary file,并且传参数给它
: 现在麻烦的是这个参数是run time才会知道
:
: 目前survey到一个类似的做法,但是无法传参数
: 1) DECLARE_WORK产生一个work struct
: 2) PREPARE_WORK把我要执行的kernel function丢到一个work queue里
: 这个kernel function里呼叫call_usermodehelper来执行user space
: 的binary file
: 3) 呼叫queue_work()
:
: 请问一下
: 有办法从kernel space执行user space的binary,并传参数吗?
: 谢谢
:
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc)
: ◆ From: 123.195.12.202
: → roylee17:call_usermodehelper(char *path, char **argv, 08/26 21:16
: → roylee17: char **envp, enum umh_wait wait) 08/26 21:16
: → roylee17:可以传参数不是吗? 08/26 21:18
: 推 clanguage:do_execve()?? 08/27 00:15
: → cobrasgo:to 1F,应该是我写的不好,我是指prepare work时无法传 08/27 00:59
: → cobrasgo:呼叫call_usermodehelper()本身没问题,重点是kernel 08/27 01:00
: → cobrasgo:function的部份 08/27 01:00
typedef void (*work_func_t)(struct work_struct *work);
既然 work_func 接受 work_struct 为参数, 可以试试利用这点.
1. 定义你的 private work_struct:
struct foo_work {
struct work_struct work;
void *data;
};
2. 在你的 create/schedule work 处, 传入你的 argement/data:
foo_sched_work() {
foo_work *w = kmaloc(sizeof(foo_work));
/* setup your data/argument */
w->data = __your_data__;
/* setup the work_struct */
w->work.func = foo_work_func;
schedule_work(&w->work);
}
3. 在你的 work_func implementation 里:
work_func_t foo_work_func(struct work_struct *work)
{
struct foo_work *w = container_of(work, struct work_struct, work);
/* access your via w->data */
...
call_usermodehelper(...);
}
我没有验证过, 有兴趣的话可能要麻烦你试试了
不行的话, 再来想办法
Regards,
Roy
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.104.36.213
※ 编辑: roylee17 来自: 59.104.36.213 (08/27 13:46)
1F:推 cobrasgo:感谢,明天来试试 08/27 17:15
2F:推 gene7299:是利用container_of 吗? 08/29 17:05
3F:→ roylee17:是的 08/30 20:37