进程管理API之get_task_mm

来源:互联网 发布:知英日剧 编辑:程序博客网 时间:2024/04/28 00:14
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的成员变量mmmm = task->mm;if (mm) {#如果是kernel thread的话,将mm置位nullif (task->flags & PF_KTHREAD)mm = NULL;else#是user space的thread的话,通过mmget让mm的成员变量mm_users 加1mmget(mm);}task_unlock(task);return mm;}mmget的定义如下,可见是通过atomic_inc,让mm->mm_users 来加1static inline void mmget(struct mm_struct *mm){atomic_inc(&mm->mm_users);}