mm_struct中的task_size

mm_struct中的task_size

Content #

在 struct mm_struct 里面,有这样一个成员变量:

unsigned long task_size;    /* size of task vm space */

整个虚拟内存空间要一分为二,一部分是用户态地址空间,一部分是内核态地址空间,那这两部分的分界线就由 task_size 来定义。

对于 32 位的系统,内核里面是这样定义 TASK_SIZE 的:

#ifdef CONFIG_X86_32
/*
 * User space process size: 3GB (default).
 */
#define TASK_SIZE    PAGE_OFFSET
#define TASK_SIZE_MAX    TASK_SIZE
#else
/*
 * User space process size. 47bits minus one guard page.
*/
#define TASK_SIZE_MAX  ((1UL << 47) - PAGE_SIZE)
#define TASK_SIZE    (test_thread_flag(TIF_ADDR32) ? \
          IA32_PAGE_OFFSET : TASK_SIZE_MAX)
......

当执行一个新的进程的时候,会做以下的设置:

current->mm->task_size = TASK_SIZE;

对于 32 位系统,最大能够寻址 2^32=4G,其中用户态虚拟地址空间是 3G,内核态是 1G。

对于 64 位系统,虚拟地址只使用了 48 位。就像代码里面写的一样,1 左移了 47 位,就相当于 48 位地址空间一半的位置,0x0000800000000000,然后减去一个页,就是 0x00007FFFFFFFF000,共 128T。同样,内核空间也是 128T。内核空间和用户空间之间隔着很大的空隙,以此来进行隔离。

Viewpoints #

From #

22 | 进程空间管理:项目组还可以自行布置会议室