Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

593
557
422264


[부록 A] GCC 지시어: __builtin_return_address() 함수 부록

__builtin_return_address 매크로를 사용하면 자신을 호출한 함수 주소를 알 수 있습니다. 
커널에서는 __builtin_return_address 매크로를 활용해 다양한 방식으로 디버깅 메시지를 출력합니다.

__builtin_return_address 매크로를 써서 디버깅 메시지를 출력하는 패치 코드를 소개합니다.

diff --git a/kernel/workqueue.c b/kernel/workqueue.c
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -2904,6 +2904,10 @@ bool __flush_work(struct work_struct *work)
01 {
02        struct wq_barrier barr;
03
04 +       long unsigned int caller_func_address = 0;
05 +       caller_func_address = (long unsigned int)__builtin_return_address(0);
06 +
07 +       trace_printk("caller: %pS [0x%08lx] \n", (void *)caller_func_address, (long unsigned int)caller_func_address);
08    if (WARN_ON(!wq_online))
09     return false;

패치 코드 입력 방법을 소개합니다.
다음 오리지널 코드에서 /* 패치 코드를 입력하세요 */ 부분에 04~07 번째 줄 패치 코드를 입력하면 됩니다.

https://elixir.bootlin.com/linux/v4.19.30/source/kernel/workqueue.c 
static bool __flush_work(struct work_struct *work, bool from_cancel)
{
struct wq_barrier barr;
/* 패치 코드를 입력하세요 */
if (WARN_ON(!wq_online))
return false;

위와 같은 패치 코드를 반영하면 어느 함수에서 __flush_work() 함수를 호출하는지 확인할 수 있습니다.

"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)


[부록 A] GCC 지시어
   * inline    
   * noinline    
   * __noreturn   
   * unused   
[부록 B] 리눅스 커널 실력을 키우는 방법
[부록 C] 리눅스 커널 프로젝트에 기여하기  
C.1 리눅스 커널 오픈소스 프로젝트 소개 
   * 용어  
C.2 설정 방법 
C.3 패치 코드를 작성한 후 이메일로 보내기  
C.5 리눅스 커널 오픈소스 프로젝트로 얻는 지식 


# Reference: For more information on 'Linux Kernel';

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2


 




핑백

덧글

댓글 입력 영역