pidmap_init()

 

pidmap_init()

kernel/pid.c

void __init pidmap_init(void)
{
        /* Veryify no one has done anything silly */
        BUILD_BUG_ON(PID_MAX_LIMIT >= PIDNS_HASH_ADDING);

        /* bump default and minimum pid_max based on number of cpus */
        pid_max = min(pid_max_max, max_t(int, pid_max,
                                PIDS_PER_CPU_DEFAULT * num_possible_cpus()));
        pid_max_min = max_t(int, pid_max_min,
                                PIDS_PER_CPU_MIN * num_possible_cpus());
        pr_info("pid_max: default: %u minimum: %u\n", pid_max, pid_max_min);

        init_pid_ns.pidmap[0].page = kzalloc(PAGE_SIZE, GFP_KERNEL);
        /* Reserve PID 0. We never call free_pidmap(0) */
        set_bit(0, init_pid_ns.pidmap[0].page);
        atomic_dec(&init_pid_ns.pidmap[0].nr_free);

        init_pid_ns.pid_cachep = KMEM_CACHE(pid,
                        SLAB_HWCACHE_ALIGN | SLAB_PANIC);
}

pid를 관리하기 위해 possible cpu 수에 맞추어 pid_max와 pid_max_min을 산출한다. 그 후 첫 번째 pidmap 배열을 할당하고 pid 0번을 사용상태로 설정한다.

  • 코드 라인 7~8에서 1024 * possible cpu 수를 곱한 값(최소 32K부터 시작)과 pid_max_max(32bit=32K, 64bit=4M) 값 둘 중 작은 값으로 pid_max를 산출한다.
    • rpi2: pid_max=32K
  • 코드 라인 9~10에서 8 * possible cpu 수를 곱한 값(최소 301부터 시작)으로 pid_max_min을 대입한다.
    • rpi2: pid_max_min=301
  • 코드 라인 11에서 pid 관련 정보를 출력한다.
    • rpi2: “pid_max: default: 32768 minimum: 301
  • 코드 라인 13에서 init_pid_ns의 pidmap 배열에서 첫 페이지는 무조건 필요하므로 1개 페이지를 할당한다.
  • 코드 라인 15~16에서 pid 0번에 해당하는 비트를 설정하고, nr_free 수에서 1을 감소 시킨다.
  • 코드 라인 18~19에서 pid 구조체 할당 시 사용할 목적의 kmem 슬랩 캐시를 준비한다.

 

PID_MAX_DEFAULT 값은 다음과 같다. (기본적으로는 32K 개의 pid 수를 사용한다.)

  • small foot print 커널
    • 4K
  • 32bit 또는 64bit 커널
    • 32K

 

PID_MAX_LIMIT  값을 알아보면 다음과 같다. (64비트 시스템에서 4M개의 pid 수를 사용할 수 있음을 알 수 있다)

  • small foot print 커널
    • PAGE_SIZE(4K) x 8 = 32K
  • 32bit 커널
    • 32K
  • 64bit 커널
    • 4M

include/linux/threads.h

/*
 * This controls the default maximum pid allocated to a process
 */
#define PID_MAX_DEFAULT (CONFIG_BASE_SMALL ? 0x1000 : 0x8000)

/*
 * A maximum of 4 million PIDs should be enough for a while.
 * [NOTE: PID/TIDs are limited to 2^29 ~= 500+ million, see futex.h.]
 */
#define PID_MAX_LIMIT (CONFIG_BASE_SMALL ? PAGE_SIZE * 8 : \
        (sizeof(long) > 4 ? 4 * 1024 * 1024 : PID_MAX_DEFAULT))

 

컴파일 타임에 pid 관련 전역 변수의 초기값은 다음과 같다.

include/linux/threads.h

int pid_max = PID_MAX_DEFAULT;

#define RESERVED_PIDS           300

int pid_max_min = RESERVED_PIDS + 1;
int pid_max_max = PID_MAX_LIMIT;

 

cpu별 pid min 값은 1024개이고 pid max는 32K이다. (32개의 cpu 기준)

include/linux/threads.h

/*
 * Define a minimum number of pids per cpu.  Heuristically based
 * on original pid max of 32k for 32 cpus.  Also, increase the
 * minimum settable value for pid_max on the running system based
 * on similar defaults.  See kernel/pid.c:pidmap_init() for details.
 */
#define PIDS_PER_CPU_DEFAULT    1024
#define PIDS_PER_CPU_MIN        8

 

각 pid 번호의 사용 유무는 1bit를 사용한다. 1개의 페이지로 관리할 수 있는 pid 수는 PAGE_SIZE x 8 bit 이다. 관리할 최대 pid 수가 큰 경우 여러 페이지를 사용할 수 있는데 pidmap을 배열로 만들고 각 배열 인덱스는 1 개의 페이지를 관리한다. 예를 들어 1개 페이지 사이즈가 4K라고 가정할 때, 1개의 페이지 사이즈를 사용하여 pid에 대한 맵을 사용하면 1 PAGE x 8 bit = 32K 만큼의 pid를 관리할 수 있다. 따라서 pidmap 배열에 사용할 엔트리 수는 최대 pid 수(PID_MAX_LIMIT)를 32K 단위로 나누어 올림 처리한 수로 사용한다.

  • 4K 페이지, 32bit 시스템에서 최대 32K 개의 pid는 1개 페이지로 처리할 수 있어 pidmap[1]을 사용한다.
  • 4K 페이지, 64bit 시스템에서 최대 4M 개의 pid는 128개 페이지로 처리해야 하므로 pidmap[128]이 필요하다.

include/linux/pid_namespace.h

#define BITS_PER_PAGE           (PAGE_SIZE * 8)
#define BITS_PER_PAGE_MASK      (BITS_PER_PAGE-1)
#define PIDMAP_ENTRIES          ((PID_MAX_LIMIT+BITS_PER_PAGE-1)/BITS_PER_PAGE)

 

 

참조

 

댓글 남기기