728x90
커널 디버깅 기능 활성화과정 (출처: 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
커널 디버깅 기능 활성화과정
===========================
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
728x90
'Research > SystemProg' 카테고리의 다른 글
왜 arm-linux-gcc에서는 #pragma pack이 안될까? (출처:www.kelp.or.kr) (0) | 2004.06.13 |
---|---|
가상 메모리 (0) | 2004.06.07 |
압축 해제 이후 커널 패치 과정 (0) | 2004.06.06 |
[Q] relocation of bss and data (0) | 2003.12.10 |
Glabl변수의 초기화 및 영역 (0) | 2003.12.01 |