Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

493
557
422263


[부록 B] 리눅스 커널 실력을 키우는 다양한 방법 - 블로그/스터디모임 부록

여러분, 이 책을 거의 대부분 읽고 이해를 하셨나요? 혹은 세부 주제(인터럽트/프로세스)을 조금 더 알고 싶으신가요?

    먼저 축하 드립니다. 
   
신입 개발자분이 이 책의 내용을 이해하는 것은 정말 힘든 일이거든요. 그런데 이 책을 거의 다 읽고 나면 다음과 같은 생각이 들 수 있습니다.
  
    조금 더 커널 코드를 분석해볼까?
      
또한 커널 코드를 분석하다 보면 이런 생각이 문득 떠오를 수 있습니다.

    커널 코드를 분석했는데 좀 지루하다. 커널을 접하는 다양한 방법이 있나?

필자만 이런 생각을 한 줄 알았는데 리눅스 세미나에서 많은 분들이 공통적으로 제게 주신 질문이었습니다. 이번 시간에는 '리눅스 커널'을 접하는 다음과 같은 방법에 대해 이야기해보려 합니다. 
블로그에 커널 분석 내용을 올리기
kldp나 stackoverflow에 답신 올리기
스터디 클럽 참석하기
리눅스 커널 메일링 리스트 구독하기

필자가 소개한 방법을 활용해 커널을 자주 접하고 익히기를 희망합니다. 

블로그에 공부한 내용을 올리기

커널 소스 코드를 분석한 후 새롭게 알게 된 내용을 블로그에 정리해 보는 것은 어떨까요? 구글링으로 검색이 잘 되는 블로그를 하나 오픈한 다음에 여러분의 블로그에 아래와 같은 '주제의 글'을  꾸준히 올리는 것입니다.  
새롭게 분석한 커널 코드
개발 도중 알게 된 노하우
리눅스에 대한 자신의 생각

블로그에 글을 올리면 누가 혜택을 받을까 
만약 여러분 오픈한 블로그에 리눅스 커널에 대한 유용한 분석 자료나 개발 팁을 올렸다고 가정하겠습니다. 그러면 이 글을 읽고 누가 도움을 받게 될까요? 여러분이 올린 블로그의 글을 읽은 다른 학생이나 개발자일 수 있습니다.

    하지만 여러분이 올린 블로그 글에 도움을 받는 첫 번째는 여러분이 될 가능성이 높습니다. 

그 이유는 간단합니다.

    여러분이 공부한 내용을 나중에 찾아 볼 가능성이 높기 때문입니다. 

사실 프로젝트에 투입돼 개발하다 보면 문제를 해결할 시간이 충분히 주어지지 않습니다. 실전 개발에서 빨리 문제를 해결해야 하거든요. 문제를 해결하기 위해서는 먼저 로그나 덤프를 분석할 때가 많습니다. 그런데 이 과정에서 로그나 덤프에 관련된 커널이나 드라이버 코드를 분석으로 이어집니다. 기존 커널 코드 분석 내용이나 개발 팁을 활용해야 할 때가 있습니다. 

    문제는 ‘예전에 분석했던 내용이 잘 떠오르지 않는다.’란 것입니다.

사실 저도 이런 것을 많이 겪었거든요. 한 가지 예를 들어볼까요?

    커널 코드를 전처리 코드로 빌드하는 명령어가 뭐였지?

이럴 때 필자는 필자의 블로그를 먼저 검색합니다. 블로그에서 '전처리'란 키워드를 검색하니 바로 다음 포스팅을 확인할 수 있습니다.

[라즈베리파이] 리눅스 커널: 전처리 파일 추출
http://rousalome.egloos.com/9969513

diff --git a/Makefile b/Makefile
index 4a7e6df..313dbbe 100644
--- a/Makefile
+++ b/Makefile
@@ -395,6 +395,7 @@ KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs
                   -fno-strict-aliasing -fno-common
                   -Werror-implicit-function-declaration
                   -Wno-format-security
+                  -save-temps=obj
                   -std=gnu89
 KBUILD_CPPFLAGS := -D__KERNEL__
 KBUILD_AFLAGS_KERNEL :=

만약 필자가 필자의 블로그에 위와 같은 내용을 올리지 않았다면 어떻게 했을까요?   

    기억을 더듬으면서 구글링을 합니다. 
   
문제는 구글링하면서 헤매다가 30분 정도 보낼 수 있다는 사실입니다. 이런 시간들이 쌓이면 자연히 퇴근 시간이 늦어질 수 있죠.

그래서 필자는 커널 코드 분석 내용이나 개발 팁을 필자의 블로그에 올려 놓습니다. 미래의 '필자'를 위해 블로그에 분석 내용을 올리는 것입니다. 

블로그를 통해 다른 개발자들에게 기여

꾸준히 공부한 내용을 블로그에 올리면 다른 개발자에게 도움을 줄 수 있습니다. 
구글링으로 유용한 정보를 찾아내는 능력은 개발자의 필수 역량이 된지 오래입니다.

리눅스 커널 오픈 소스 프로젝트에 자신의 코드를 추가하는 것만이 기여(Contribution)는 아닙니다. 자신의 지식을 다른 개발자에게 공유하고 알리는 것도 참 의미가 있죠.

블로그는 개발자의 내공을 알리는 퍼스널 브랜딩 창구

유명 개발자는 각자 블로그를 갖고 있는 경우가 많습니다. 

아래는 리눅스 커널 리드(Lead)개발자인 Greg Kroah-Hartman과 게임계의 레전드 개발자인 김포프님의 블로그입니다.
http://www.kroah.com/log : Greg Kroah-Hartman
https://kblog.popekim.com : 김포프

어떤 개발자는 자신의 블로그 주소를 명함이나 이메일 서명에 추가하는 경우도 많습니다. 이렇게 블로그는 IT 개발자가 자신의 알리는 퍼스널 브랜딩의 주요 매체로 활용하고 있습니다.

여러분도 블로그를 하나 개설하고 1주일에 꾸준히 2개 씩 포스팅을 하는 목표를 잡으면 어떨까요? 6개월 정도 시간이 지나면 여러분의 블로그에 유익한 자료로 가득 차 있을 것입니다.

사실 이 책의 출발점도 필자의 블로그였습니다. 2016년도부터 꾸준히 리눅스 커널과 디버깅 자료를 블로그에 꾸준히 올렸습니다. 블로그에 올린 자료들이 모이니 자연히 책이 됐습니다. 

리눅스 사이트에서 답신 달기

kldp.org  혹은 stackoverflow.com 사이트에 가면 여러 개발자가 올린 리눅스 관련 질문을 읽을 수 있습니다. 여기 가서 질문을 올리라고요? 아닙니다.

    질문을 남기는 것 보다 다른 개발자가 올린 질문에 대답을 해보는 것은 어떨까요?

stackoverflow나 kldp.org 에는 실전 개발자들이 겪는 문제를 확인할 수 있습니다. 한국에서 유명한 리눅스 포털인 다음 사이트를 예를 들어볼까요?

어떤 분이 다음과 같은 질문을 올렸습니다.
출처: https://kldp.org/node/161302

커널 소스 파악 질문있습니다.
context switching이 어떻게 동작하는지 궁금하여 분석을 해보려다...내공이 부족하여 질문을 올리게 되었습니다.
일단
movq %rsp,TASK_threadsp(%rdi)
movq TASK_threadsp(%rsi), %rsp
이런 코드가 있는데 TASK_threadsp가 어떤 동작을 하는지 모르겠습니다. 찾아 들어가면 결국 마지막에
asm volatile("\n->" #sym "%0" #val :: "i" (val)) 나옵니다. 이건 또 어떤 문법인지..제가 C언어를 못하는건지 아니면 어셈인지.. 파악을 못하겠습니다. 도움좀 부탁드립니다.

이 질문을 보고 필자는 다음과 같은 답변을 달았습니다
TASK_threadsp 는 태스크 디스크립터 thread.sp 주소 오프셋입니다

컨택스트 스위칭을 할 때 레지스터 세트를 프로세스 만의 공간에 저장하거나 로딩합니다.
해당 코드는 관련 동작인데, TASK_threadsp 는 태스크 디스크립터 구조체 기준으로 thread.sp 주소 오프셋을 의미합니다.

https://code.woboq.org/linux/linux/include/generated/asm-offsets.h.html
#define TASK_threadsp 12120 /* offsetof(struct task_struct, thread.sp) */
...

필자는 ARMv7, ARMv8 아키텍처에 익숙해 x86 관련 어셈블리 코드는 최근 자주 보지 못했습니다. 하지만 코드를 보고 연구를 해서 위와 같이 답신을 올린 것입니다.

여러분도 다른 개발자가 올린 질문에 대답을 하면서 다른 개발자에게 도움을 주면 어떨까요? 이 과정에서 자연히 공부를 하게 됩니다.

커널 스터디 클럽 

리눅스에 관심이 있는 동료나 친구들이 있으면 리눅스 커널 스터티 모임을 하나 만드는 것은 어떨까요? 1주일 동안 자신이 공부한 내용을 발표하면 좋겠죠. 스터디 모임을 한 다음 뒷풀이를 할 때도 커널을 주제로 토론을 해보는 것을 어떨까요? 

먼저 스터디 모임을 꾸준히 연 다음에 공부한 내용을 공유하는 것이 중요할 것 같습니다.

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

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


 

핑백

덧글

댓글 입력 영역