[커널 17차] 54주차

2021.09.11 23:30

ㅇㅇㅇ 조회 수:115

복습 : bootmem_init() ~ setup_arch() 종료
 
CONFIG_BOOT_CONFIG : OFF
CONFIG_BLK_DEV_INITRD : ON
 
setup_boot_config()
- CONFIG_BOOT_CONFIG : OFF이면 boot config 데이터를 사용하지는 않고  initrd 영역에서 제거만 한다
- ON이면 다음을 수행한다
1. 함수 get_boot_config_from_initrd()로 initrd 영역에서 boot config data, size, checksum을 읽어오고 boot config 영역을 initrd 영역에서 분리한다
2. 전역 변수 boot_command_line에서 "bootconfig" argument를 parsing한다
3. 에러가 발생하거나 bootconfig argument가 없으면 그냥 리턴
4. parse_args() 함수의 리턴값이 0이 아니면 전역변수 initargs_found = true로 세팅
5. boot config data가 NULL이면 그냥 리턴
6. boot config size가 XBC_DATA_MAX보다 크면 에러 리턴
7. boot config checksum이 정확하지 않으면 에러 리턴. 여기서 boot config data 값을 byte 단위로 다 더해서 checksum을 검사한다
8. boot config size + 1 만큼 memblock 할당을 요청하고 할당된 영역에 boot config data를 boot config size만큼 memcpy 수행한다. 마지막엔 '\0'을 추가한다.
9. xbc_init() 함수로 boot config data로부터 boot config data의 자료구조 노드 트리를 구성한다
10. xbc_make_cmdline() 함수로 extra_command_line과 extra_init_args 전역변수를 세팅한다. xbc tree로부터 각각 "kernel"/"init" key로 검색하여 command line을 구하여 전역변수에 전달한다.
 
 
get_boot_config_from_initrd()
- CONFIG_BLK_DEV_INITRD : ON 일때만 작동
- initrd 영역에서 boot config 값을 parsing해서 가져온다
 
1. initrd 영역의 끝에서 MAGIC value를 체크하고 실패하면 그냥 리턴
2. MAGIC 영역보다 8 byte 위 지점에서 각각 4 byte 씩 boot config 값의 size와 checksum을 읽어온다
3. size 지점에서 size 만큼 위 지점에서 boot config data를 읽어온다. 이 지점이 initrd start 보다 위쪽으로 넘어가면 initrd 영역을 벗어나므로 에러 처리한다
4. initrd end 영역을 boot config data 바로 위로 조정해서 initrd 영역과 boot config 영역을 분리한다
5. parsing한 boot config data, size, checksum을 리턴한다
 
+---------------+ initrd_start
|                    |
+---------------+ new initrd_end
|                    |  ^
|      Boot      |  |
|    Config     | size
|      Data      |  |
|                    |  V
+---------------+ 8 byte above
|     Size        | (4 bytes)
+---------------+
|  Checksum | (4 bytes)
+---------------+ magic len above
|                    |
|     Magic     |
|                    |
+---------------+ initrd_end
 
 
setup_command_line()
- extra_command_line + boot_command_line + 1 길이의 static_command_line 메모리 영역을 memblock으로 할당받는다
- extra_command_line + boot_command_line + extra_init_args + 4 + 1 만큼의 길이를 가지는 saved_command_line 메모리 영역을 memblock으로 할당받는다
- saved_command_line에 차례대로 extra_command_line, boot_command_line, extra_init_args를 copy한다
- static_command_line에 차례대로 extra_command_line, command_line (boot_command_line과 동일하다)을 copy한다
 
 
setup_nr_cpu_ids()
- possible cpu 중 가장 큰 index + 1을 nr_cpu_ids 전역변수에 저장한다
 
 
CONFIG_HAVE_SETUP_PER_CPU_AREA : ON
 
setup_per_cpu_areas() 분석할 차례
 
percpu 내용 복습
- http://jake.dothome.co.kr/per-cpu/

XE Login