关于mm_struct和内核线程,在Linux kernel Development ( Robert Love)一书中提到的一些要点是:
内核线程没有进程地址空间,因此没有相关的内存描述符。因此,内核线程的进程描述符的mm字段为NULL。
“由于内核线程在用户空间中没有任何页面,它们实际上不值得拥有自己的内存描述符和页表(页表将在本章后面讨论)。尽管如此,内核线程仍需要一些数据,例如页表,甚至需要访问内核内存。”
内核线程没有地址空间,并且mm为NULL。因此,当调度内核线程时,内核会注意到mm为NULL,并保持前一个进程的地址空间已加载。然后,内核会更新内核线程的进程描述符中的active
我正在开发一个涉及kthread的内核应用程序。我创建了一个结构数组,并在用户空间中使用malloc分配内存。然后,我调用一个系统调用(我实现了这个调用)并将数组的地址传递给内核空间。在system-call的处理程序中,我创建了2个kthread,它将监视数组。kthread可以改变一些值,用户空间线程也可以改变一些值。其想法是将数组用作共享内存。但有些时候,当我访问内核空间中的内存时(使用copy_from_user),数据会以某种方式发生变化。我可以验证地址在分配时和在内核中是相同的。但是当使用copy_from_user时,它会给出各种值,比如垃圾值。
另外,下面的语句是否正确?
in
我目前正在做一个内核模块的实验。
我编写了一个函数,它将指向结构的指针(在用户空间中)作为参数,目的是将该结构从用户空间复制到内核空间;因此,我需要copy_from_user或__get_user。
结构的定义相当简单:
struct A {
int a;
};
内核模块中的函数旨在获取a的值,并返回它的值,如下所示(有两种方法):
static int foo(struct A __user *arg)
{
int num, ret;
if (!access_ok(VERIFY_WRITE, arg, sizeof(struct A)))
ret
我试图理解task的mm字段和active_mm字段之间的区别,并遇到了引用“匿名进程”概念的20岁的莱纳斯·托瓦尔兹发来的电子邮件:
- we have "real address spaces" and "anonymous address spaces". The
difference is that an anonymous address space doesn't care about the
user-level page tables at all, so when we do a context switch into a