커널 디버깅 기능 활성화과정

Posted 2004.06.06 01:15
커널 디버깅 기능 활성화과정  (출처: http://www.kelp.or.kr 유영창)

커널 디버깅 기능 활성화과정
===========================

1. 개요

   이 문서는 커널의 압축 해제 루틴 이후부터의 커널 패치를
   하는 과정에 대하여 시간순으로 기술한 문서이다.
  
   이 문서에서는 커널의 디버깅 옵션을 활성화 하는
   방법에 대하여 기술한 문서이다.
  
2. 문서

   참조 문서 없음
      
3. 커널 디버깅 옵션

   디버그 포트에 대한  처리이다.
  
   커널 디버깅시에 시리얼로 데이타를 표출하면서 보는 것이 가장 편리하므로
   이 작업에 대한 처리를 우선적으로 해야 할것으로 보인다.
  
   우선 커널 컴파일 옵션에서 다음을 활성화 한다.
  
    Kernel hacking  --->
       [*] Kernel debugging
           [*]   Kernel low-level debugging functions
          
     이렇게 하면 두가지 옵션 변수가 활성화 된다.      
  
     CONFIG_DEBUG_KERNEL  
     CONFIG_DEBUG_LL
    
    이중 CONFIG_DEBUG_LL 이 초기에 커널을 디버깅 하기위한  좋은 툴인 것이다.
    
    이 옵션 변수를 참조하는 것을 살펴보면
    
    arch/arm/kernel/Makefile:obj-$(CONFIG_DEBUG_LL)  += debug-$(PROCESSOR).o
    arch/arm/kernel/head-armv.S:#ifdef CONFIG_DEBUG_LL

    이렇게 존재한다.
    
    우선 첫번째 문장에 의해서 참조되는 것은
    
    arch/arm/kernel/debug-armv.S 이다.
    
    두번째로 참조 되는 것은
    
    arch/arm/kernel/head-armv.S 안에서 CONFIG_DEBUG_LL 에 의해서 활성화 되는 구문이다.
    
    이 옵션만 활성화한 상태에서 커널을 컴파일 하면 다음과 같은 에러가 발생한다.

    
=================================================================================================
===    
        debug-armv.S:389: #error Unknown architecture
        make[1]: *** [debug-armv.o] Error 1
        make[1]: Leaving directory `/var/data/project/ez-m28/kernel_patch/linux-m28-
pre/arch/arm/kernel'
        make: *** [_dir_arch/arm/kernel] Error 2
    
=================================================================================================
===    

    이것은 해당 아키텍쳐에 관련된 디버깅 루틴이 없다는 표시이기도 하다.
    즉 S3C2410의 커널은 이 부분에 대한 처리를 하지 않았다.
    
    우리는 작업의 편리성과 가난함(? - 고가의 에뮬레이터가 없다)으로 인하여
    이 부분을 만들어 가는 것이 편리하다.
    
    물론 다른 아케텍쳐에서 한 루틴을 훔쳐 보고 비슷하게 만들면 별문제가 없다.
    손보아야 할 화일은 다음과 같다.
    
    arch/arm/kernel/debug-armv.S
    
    우리가 추가해야 할 위치는 388 라인쯤에 발견할수 있는
    
    #else
    #error Unknown architecture
    #endif

    구문 바로 전에 만들어야 한다.
    
  
     CONFIG_ARCH_S3C2410    
        
    이 디버깅 루틴은 매크로를 선언하게 되어 있는데
    
    다음과 같은 매크로들은 만들어 주어야 한다.
    
    1) .macro        addruart,rx
        -> rx 로 넘어온 레지스터에 UART 주소를 넘긴다.
        
    2) .macro        senduart,rd,rx  
        -> rd 로 넘어온 데이타를 rx 레지스터에 써 넣는다.
           즉 시리얼 포트에 데이타를 써 넣는다.
    
    3) .macro        waituart,rd,rx
        -> UART에 데이타를 쓸수 있으때 까지 기다린다.
    
    4) .macro        busyuart,rd,rx
        -> UART에 써 넣어진 데이타가 처리 된것을 기다린다.
    
    다음과 같이 만들었다.
    
    
=================================================================================================
===    
        #elif defined(CONFIG_ARCH_S3C2410)
        
                        .macro        addruart,rx
                        mrc        p15, 0, rx, c1, c0
                        tst        rx, #1                        @ MMU enabled?
                        moveq        rx, #0x10000000        @ physical base address
                        movne        rx, #0xD0000000        @ virtual address
                        add        rx, rx, #0x00170000        @ UART0
                        .endm
        
                        .macro        senduart,rd,rx
                        str        rd, [rx, #0x20]        @ UTXH0
                        .endm
        
                        .macro        waituart,rd,rx
        1001:                ldr        rd, [rx, #18]                @
                        tst        rd, #1 << 9                @ UARTFLGUTXFF - 1 when full
                        bne        1001b
                        .endm
        
                        .macro        busyuart,rd,rx
                        .endm
    
=================================================================================================
===    

    참고) 디버깅 할때 체크 포인트 찍는 LED루틴은 다음과 같이 사용했다.            
            
                        mov     r1,     #0x10000000   @C
                        add     r1, r1, #0x00100000   @C
                        add     r1, r1, #0x0000001c   @C
                        mov     r0, #0x7              @C
        dled0:          str     r0,[r1]               @C
                        b       dled0                 @C


    위 LED 보다 아무래도 디버거의 루틴을 이용하는 것이 좋은데
    일단
    
    arch/arm/kernel/head-armv.S 화일에서
    
                    mov        r0, #F_BIT | I_BIT | MODE_SVC        @ make sure svc mode
                msr        cpsr_c, r0                        @ and all irqs disabled
                bl        __lookup_processor_type

                다음에 아래 루틴을 추가해 보았다.
                    
                    moveq        r0, #'X'                        @C
                beq        __error                         @C
            
    시리얼로 이렇게 나온다.
    
        Copy Kernel Image .....
        Copy Ramdisk Image .....
        Starting kernel ...
        Uncompressing Linux............................................. done, booting t
        he kernel.
        
        Error: X    

    큭큭큭 일단 뭔가 나온다.
    
    FIFO 처리가 제대로 될지는 모르겠지만 일단 12 문자까지는 무조건 나올 것이다.
    
    커널 디버깅 기능이 제대로 활성화 된것을 확인 한 것이다.      
    
    커밋한 CVS :  include/asm-arm/arch-s3c2410/s3c2410.h
                       -> UART 선언에 VA_IO_BASE1로 선언되어 있어서 VA_IO_BASE0으로 바꿈
                  arch/arm/kernel/debug-armv.S



2003-07-26 18:23:22

« PREV : 1 : ··· : 381 : 382 : 383 : 384 : 385 : 386 : 387 : 388 : 389 : ··· : 537 : NEXT »