您的位置:首页 > 其它

进程管理API之get_task_mm

2017-11-29 08:54 627 查看
struct mm_struct *get_task_mm(struct task_struct *task) 其作用是得到task_struct *task的
成员变量mm,如果是user space的task的话,通过将得到mm_struct *mm 结构体的mm_users成员变量加1
如果是kernel space的task的话,其mm为null
其使用的例子如下:
int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len,
unsigned int gup_flags)
{
struct mm_struct *mm;
mm = get_task_mm(tsk);
if (!mm)
return 0;
}

其源码分析如下:
struct mm_struct *get_task_mm(struct task_struct *task)
{
struct mm_struct *mm;
#访问task 时需要通过task_lock/task_unlock 保护起来.
task_lock(task);
#得到task_struct *task的成员变量mm
mm = task->mm;
if (mm) {
#如果是kernel thread的话,将mm置位null
if (task->flags & PF_KTHREAD)
mm = NULL;
else
#是user space的thread的话,通过mmget让mm的成员变量mm_users 加1
mmget(mm);
}
task_unlock(task);
return mm;
}
mmget的定义如下,可见是通过atomic_inc,让mm->mm_users 来加1
static inline void mmget(struct mm_struct *mm)
{
atomic_inc(&mm->mm_users);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: