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 )
 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 호출하여 사용중 으로 표시 것이다.

Posted by blee
,