리눅스 커널에 대한 Q&A 게시판 입니다. (비밀글 체크는 꼭 필요한 경우에만)
안녕하세요 질문이 있어서 남깁니다.
작성자
유정우
작성일
2017-02-28 14:53
조회
1463
안녕하세요.
글을 보면서 항상 도움이 많이 되고있습니다. 감사합니다
다름이 아니라 제가 궁금한 점이 있어서 질문을 남깁니다.
start_kernel에서 console_init 을 통해서 serial device를 init한다고 한다면,.
그 전에 pr_info, pr_notice와 같은 함수를 통해서 출력 되고 있는 로그들은 어떤 시리얼을 통해서 나오고 있는것인지 매우 궁금합니다,.
글을 보면서 항상 도움이 많이 되고있습니다. 감사합니다
다름이 아니라 제가 궁금한 점이 있어서 질문을 남깁니다.
start_kernel에서 console_init 을 통해서 serial device를 init한다고 한다면,.
그 전에 pr_info, pr_notice와 같은 함수를 통해서 출력 되고 있는 로그들은 어떤 시리얼을 통해서 나오고 있는것인지 매우 궁금합니다,.
1) head.S 단계에서 콘솔 디버깅 방법
-> DEBUG_LL_INCLUDE에서 콘솔이 구현된 해당 include 파일을 지정하여 사용
이러한 경우 puts(), writeb(), memdump(), ... 등 준비된 매크로가 uart 포트를 통해 출력됩니다.
arch/arm/Kconfig.debug (일부 예)
---------------------------------
config DEBUG_LL_INCLUDE
string
default "debug/sa1100.S" if DEBUG_SA1100
default "debug/8250.S" if DEBUG_LL_UART_8250 || DEBUG_UART_8250
default "debug/at91.S" if DEBUG_AT91_UART
default "debug/asm9260.S" if DEBUG_ASM9260_U
2) "earlycon=", "earlyprintk=" 등의 커널 파라메터를 사용하는 경우
-> 정식 console 출력 전에도 디버깅 정보가 선택한 serial 디바이스 장치를 통해 출력됩니다.
사용법은 https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html?highlight=kernel%20parameters 를 참고하세요.
제가 지금 포팅하는 과정에서는 2) 의 과정에 해당하는 bootargs 를 주지 않은 상태입니다.
그렇다고 한다면 그 전에 pr_info, pro_notice와 같은 함수를 통해서 출력 한 것은
일단 특정 버퍼에 기록해두고 serial 디바이스를 찾은 후에 버퍼에 내용을 출력하는 과정이 있을 것 같다는 저만의 가설이 생기는데
혹시 이 부분에 대해서는 알고 계신것이 있는지요.
처음에 static char __log_buf[__LOG_BUF_LEN]을 로그 버퍼로 사용하고 console_init() 전까지 로그를 보관합니다.
__LOG_BUF_LEN에는 버퍼 크기가 들어있고 커널 컴파일 시에는 CONFIG_LOG_BUF_SHIFT 값을 사용하여 버퍼 크기를 지정합니다.
rpi2에서 초기 값으로 CONFIG_LOG_BUF_SHIFT 에 17이 설정되어 있는데 1 << 17 = 128KB를 의미합니다.
참고: #define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
컴파일 없이 추가 로그 버퍼를 준비할 수도 있습니다. "log_buf_len=" 커널 파라메터를 사용하는 경우 static 로그 버퍼를 버리고 요청한 사이즈만큼 할당하여 사용할 수도 있습니다.
관련함수: setup_log_buf()
많은 것을 배웠습니다.