자유게시판

안녕하세요 질문이 있어서 남깁니다.

작성자
유정우
작성일
2017-02-28 14:53
조회
703
안녕하세요.

글을 보면서 항상 도움이 많이 되고있습니다. 감사합니다

다름이 아니라 제가 궁금한 점이 있어서 질문을 남깁니다.

start_kernel에서 console_init 을 통해서 serial device를 init한다고 한다면,.

그 전에 pr_info, pr_notice와 같은 함수를 통해서 출력 되고 있는 로그들은 어떤 시리얼을 통해서 나오고 있는것인지 매우 궁금합니다,.
전체 5
  • 2017-02-28 15:49
    잘 알고 계시겠지만 보통 임베디드 리눅스 시스템에서 uart 등의 serial 장치를 통해 console의 입출력을 수행 시 console_init()을 수행한 후에야 정식으로 tty 장치를 통해(tty -> line disciply -> uart) 출력이 됩니다. 그 전까지는 early하게 serial 포트를 사용하는 방법이 다음과 같이 2가지 정도 있습니다.

    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 를 참고하세요.

  • 2017-02-28 15:50
    따라서 위의 2)번과 같은 방법을 사용하면 pr_info(), pr_notice(), printk() 등에서 console 출력을 할 수 있습니다.

  • 2017-03-02 16:32
    상세한 답변 정말 감사합니다.

    제가 지금 포팅하는 과정에서는 2) 의 과정에 해당하는 bootargs 를 주지 않은 상태입니다.
    그렇다고 한다면 그 전에 pr_info, pro_notice와 같은 함수를 통해서 출력 한 것은
    일단 특정 버퍼에 기록해두고 serial 디바이스를 찾은 후에 버퍼에 내용을 출력하는 과정이 있을 것 같다는 저만의 가설이 생기는데
    혹시 이 부분에 대해서는 알고 계신것이 있는지요.

  • 2017-03-02 20:01
    네. 생각하신대로 console이 준비되기 전까지는 환형 로그 버퍼에 기록합니다.

    처음에 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()

  • 2017-03-02 20:49
    아 감사합니다

    많은 것을 배웠습니다.