[ bootmem_init ] arch/arm/mm/init.c
 
물리 메모리 영역 만큼 부트 메모리 allocator 를 만들고 초기화 한다.
meminfo 구조체에서 bank size 0 경우, node MAX_NUMNODES 보다 것은 node -1 설정한다. 정보이며, node 별로 bank 정보를 참조 무시하게 만든다.
check_initrd 호출하여, ramdisk image 어느 node 속하는지 판단한다.
노드별로 bootmem_init_node 호출 하여, end_pfn 값을 갱신하게 되는데, 과정에서 memend_pfn 값도 결정된다. memend_pfn 노드들 중에 가장 높은 메모리 pfn 저장한다.
high_memory memend_pfn 에서 PAGE_SHIFT 만큼 곱하여 물리 메모리의 끝을 가리킨다.
max_pfn pfn 갯수를 저장한다.
// include/linux/nodemask.h
#define for_each_node(node)    for_each_node_mask((node), node_possible_map)
#if MAX_NUMNODES > 1
#define for_each_node_mask(node, mask)          \
    for ((node) = first_node(mask);         \
        (node) < MAX_NUMNODES;          \
        (node) = next_node((node), (mask)))
#else /* MAX_NUMNODES == 1 */
#define for_each_node_mask(node, mask)          \
    if (!nodes_empty(mask))             \
        for ((node) = 0; (node) < 1; (node)++)
#endif /* MAX_NUMNODES */
smdk2410 에서는 MAX_NUMNODES 값은 1 된다.
결과로 저장되는 변수들의 값은 다음과 같다.
high_memory = 0xC4000000, max_pfn = 0x00004000, mamend_pfn=0x00034000

[ check_initrd ] arch/arm/mm/init.c
 
phys_initrd_start ,phys_initrd_size 전역변수를 참조하여, initrd 존재하는 메모리 노드를 구한다.
CONFIG_BLK_DEV_INITRD 정의 되어 있지 않다면, initrd_node = -2 저장되고,
phys_initrd_size 0 아니고, meminfo bank 내에 존재 하지 않다면, initrd_node = -1 저장된다.
어느 노드에 속하는지 찾아서 initrd_node 저장한다.
NUMA 지원되지 않는다면, 노드는 0 하나 뿐이다.
Posted by blee
,