2013-04-23 49 views
0

我需要从内核线程调用get_user_pages_fast()。但get_user_pages_fast()内部使用current->mm,对于内核线程,其设置为NULL。有什么办法可以解决这个问题吗?正在讨论的内核线程正在代表另一个进程工作,如x,将x->mm设置为current->mm并调用get_user_pages_fast()可以吗?get_user_pages_fast()来自内核线程

[编辑1]:我验证了这一点,它似乎工作。我仍然担心它是否会在某些情况下破裂。任何见解都值得欢迎。谢谢。

+0

你将需要说你正在尝试使用什么语言 – thecoshman 2013-04-23 07:41:11

+1

这是linux内核,我使用C.为防万一我没有正确的框架,它不是一个编程问题(如分配工作),但在Linux内核和内核线程的环境中是否合适。 – spa 2013-04-23 08:15:07

+0

将'x-> mm'指定为'current-> mm'告诉内核您的线程具有与进程'x'相同的虚拟内存空间。这真的是你想要的吗? (它会打扰我有一个内核线程,应该留在一个纯粹的内核上下文有一个虚拟内存空间?!) – Rerito 2013-04-23 12:03:33

回答

1

我不相信这是完全安全的。 get_user_pages_fast_fast部分意味着不需要获取mm->mmap_sem,并且工作的部分原因是因为假定我们在流程本身内运行(因此例如current->mm不能完全消失)。由于你在另一个线程中运行,如果真正的进程做了某些改变其映射的事情,那么你很容易受到种族歧视。

我想问题是为什么你不能只用get_user_pages来代替?

+0

当kthread运行时,用户进程需要做的就是''fork''或''exit'',并且会有比竞争条件更严重的猴子业务来应对。我同意直接调用''get_user_pages'''设置''mm''更好。 – 2013-04-23 17:56:04

+0

Roland,@Jonathan Ben-Avraham,谢谢你,我明白现在的风险。我将探讨如何使用get_user_pages()而不是上面的hack。 – spa 2013-04-24 00:30:43

2

你的“黑客”确实会工作,但让我们退一步,并了解它的想法是:

当你在一个内核线程的,(我说的是纯内核线程(不是在内核模式下执行的用户线程,如服务系统调用的情况),那么没有用户内存可言。这就是current-> mm为空的原因:没有“当前”用户空间内存。

当你将current-> mm分配给x-> mm时,通过附加无辜x的进程内存空间成为你自己的“作弊”。因此,您执行的任何分配都将被计入x,并且将由x(它毕竟是其内存空间的一部分)可见。此外,可能会有内核对current-> mm进行内核检查,这可能会被欺骗,导致内核模式线程被内核视为用户模式线程(尽管可以说其他检查依赖于KERNEL_DS/USER_DS,你没有修改)。仍然是一个问题。如果x消亡(嘿 - 没有人的不朽),这将会破坏,并且如果不是恐慌,可能会导致哎呀。

你还没有说过为什么你需要获取用户页面 - 如果你知道x是活的并且你正在做这个作为IPC/shmem的一部分,我可以看到一个原因。如果是这种情况,您可能需要为有问题的进程提供一些API来向内核线程“注册”。否则,你的解决方案是有效的,但是......不是那么简单。

+0

@Technologygeeks,是的,我相信X是活着的。原因 - 内核线程发现X的特定页面不在内存中,需要映射页面。这就是为什么它使用get_user_page_fast()来分配新页面。 – spa 2013-04-24 00:54:39