[커널 17차] 64주차

2021.11.21 00:46

ㅇㅇㅇ 조회 수:64

이후부터 5.15 버전으로 진행

page_alloc_init() 이후부터 진행

 

jump_label_init()
parse_early_param()
- 모두 setup_arch()에서 초기화 진행되었고 여기서는 그냥 리턴

 

- 함수 parse_args()로 static_command_line에서 parameter를 parsing하여 __start___param 영역부터 __stop___param 영역에 저장한다. 더 정확하게는 static command line에 __start___param 영역부터 __stop___param 영역까지 정의된 kernel parameter들 중 해당되는 것이 있으면 parameter parsing setup을 위한 callback함수를 수행한다.
- 이 때 parsing 중 unknown parameter가 나오는 경우 함수 unknown_bootoption()로 전역변수 배열 envp_init[] 및 argv_init[]에 unknown parameter를 저장한다.
- 리턴값은 after_dashes에 저장되며, 에러가 있으면 에러가 저장되고, 아니면 extra init args가 저장된다. extra init args가 없는 경우엔 NULL이 반환된다
- 함수 print_unknown_bootoptions()로 unknown paramter들을 로그로 출력한다
- after_dashes에 extra init args가 저장된 경우, 다시 함수 parse_args()로 after_dashes의 parameter들을 parsing하여 argv_init[]에 저장한다. 이 과정은 set_init_arg() 함수에서 수행된다.
- extra_init_args가 존재하면 (함수 setup_boot_config()에서 생성하였다) 함수 parse_args()로 extra_init_args의 parameter들을 parsing하여 argv_init[]에 저장한다. 역시 set_init_arg() 함수에서 수행된다.


unknown_bootoption()
- 인자로 단일 parameter string, parameter value를 받는다
- 함수 repair_env_string()으로 parameter의 형태를 다시 복원한다. 이전에 “=“을 token처리를 위해 “\0”으로 변경하였는데, 이를 다시 복원한다. parameter=val 또는 parameter=“val” 형태 모두 처리해 준다.
- 함수 obsolete_checksetup()로 obsolete parameter인지 체크한다. obsolete kernel param들에 대해서 루프를 돌면서 현재 parameter string과 일치하는지 확인한다. 만약 일치하면 3가지 경우로 나누어 처리한다
1) early param인 경우 parameter 길이가 정확히 일치하는지 확인하여 prefix인 경우를 배제하고 obsolete로 처리한다. 단 callback을 더 수행해야 하는 경우가 있으므로 루프는 계속 수행한다.
2) early param이 아닌 경우 parameter에 setup_func callback이 있는지 확인하고 없으면 obsolete로 리턴한다
3) setup_func callback이 있으면 callback을 수행하고 에러가 발생하면 obsolete로 리턴한다
- obsolete로 결론나면 unknown이 아니므로 리턴한다
- parameter 이름 중간에 ‘.’이 있으면 module parameter이므로 그냥 리턴한다
- panic later 처리가 되어 있으면 더 처리할 필요가 없으므로 그냥 리턴한다
- value가 있으면 environment option이므로 전역변수 배열 envp_init[]에 parameter를 저장한다. 이 때 배열이 overflow되면 커널 패닉으로 처리해야 하므로 panic later에 “env”를 입력하고 parameter를 panic parameter에 저장한다
- value가 없으면 command line option이므로 전역변수 배열 argv_init[]에 parameter를 저장한다. 이 때 배열이 overflow되면 커널 패닉으로 처리해야 하므로 panic later에 “init”을 입력하고 parameter를 panic parameter에 저장한다

 

print_unknown_bootoptions()
- memblock()으로 임시 메모리를 할당하여 envp_init[]와 argv_init[]에 저장된 unknown parameter를 저장하고 커널로그로 출력한다. 이 후 임시 메모리를 해제한다

 

set_init_arg()
- unknown_bootoption() 함수와 유사한 방식으로 parameter를 argv_init[]에 저장한다

 

setup_log_buf() 진행할 차례

XE Login