[ 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 하나 뿐이다.
'리눅스커널' 카테고리의 다른 글
[ create_mapping ] arch/arm/mm/mmu.c (0) | 2009.10.02 |
---|---|
[ bootmem_init_node ] arch/arm/mm/init.c (0) | 2009.10.02 |
[ prepare_page_table ] arch/arm/mm/mmu.c (0) | 2009.10.02 |
[ cpu_architecture ] arch/arm/kernel/setup.c (0) | 2009.10.02 |
[ ecc_mask ] arch/arm/mm/mmu.c (0) | 2009.10.02 |