meminfo 의 각 bank 대해 map_memory_bank, create_mapping, alloc_init_section 를 차례로 호출하여 물리메모리에 대한 페이지 테이블 맵핑을 한다. SMDK2410 에서 노드가 1개이고, meminfo 정보가 아래와 같다면, 다음과 같은 페이지 테이블을 생성한다.
meminfo.nr_banks = 1
bank[0].start=0x30000000
bank[0].size=0x4000000
bank[0].node=0
swapper_pg_dir ( 0xC0004000 )
swapper_pg_dir ( 0xC0004000 )
offset | level 1 descriptor |
0x000 * 4 | 0 |
: | 0 |
0xC00 * 4 | 0x3000041e |
0xC01 * 4 | 0x3010041e |
: | : |
0xC3F * 4 | 0x33f0041e |
0xC40 * 4 | 0 |
: | 0 |
0xDFE * 4 | 0 |
: | |
0xFFF * 4 |
bootmem_bootmap_pages 을 호출하여, 부트 allocator 가 표시 할 페이지 갯수를 표현하기 위해 얼마 만큼의 PAGE_SIZE 가 필요한지 계산한다.
총 pfn 의 갯수는 0x4000 , 비트 단위로 보기 때문에 byte로 표현하면, 0x800 크기가 되는데, 이는 한개의 PAGE 로 표현 할 수 있다.
find_bootmap_pfn 을 호출하여, 부트 allocator 이 사용할 영역을 할당 받는다. 0x00030314 의 pfn를 리턴하게 되는데, 여기가 부트 allocator 의 bitmap 영역이 될 것이다.
node_online_map 에 현재 node에 대한 bit를 set 하고,
NODE_DATA(node) 는 &contig_page_data 를 리턴한다.
init_bootmem_node , init_bootmem_core 를 차례로 실행하여, contig_page_data.bdata 가 가리키는 contig_bootmem_data 를 설정한다. 여기서 contig_bootmem_data.node_bootmem_map 에 할당받은 bitmap 주소가 지정된다. (0x3031400 가 가상주소로 할당된다. 0xc0314000 ) 그리고, 0x800 만큼 0xff 로 초기화 한다.0x4000 만큼의 영역이 비트로 표현되기 때문에, byte로 변환된 사이즈 0x800 이 되는 것이다.
free_bootmem_node 를 node 만큼 루프를 돌며 호출하는데, 하나의 노드이기 때문에 역쉬 한번만 호출한다.
free_bootmem_core 가 호출되어, 노드에 속한 물리메모리 만큼을 test_and_clear_bit 를 호출하여, 0 으로 초기화 한다. 이는 모든 메모리 영역을 사용가능으로 설정하는 것이다.
이 후 reserved 된 영역은 다시 reserve_bootmem_node 호출하여 사용중 으로 표시 할 것이다.
'리눅스커널' 카테고리의 다른 글
[ bootmem_bootmap_pages ] mm/bootmem.c (0) | 2009.10.02 |
---|---|
[ create_mapping ] arch/arm/mm/mmu.c (0) | 2009.10.02 |
[ 부트 메모리 allocator ] (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 |