첫 리눅스 커널 기여

2025. 12. 22. 15:38·Linux/start_contribute()

커널 분석을 하다가 발견

리눅스 커널에 관심을 가지면서 커널 분석을 시작했고,

더 나아가서 커널에 기여를 해보고싶다는 생각이 들었다.

오픈소스 기여, 특히 커널에 기여한다는 것은 개발자의 로망이 아닌가?

 

나같은 초보 개발자들이 커널의 코어 소스코드를 수정한다는 것은 사실 쉽지 않다.

코어부분은 초고수개발자들이 수십년에 걸쳐서 검증이 된, 거의 완벽한 코드이기 때문이다.

 

그래서 보통 드라이버쪽에 staging된 코드(아직 개발될 여지가 많은 코드)들을 대체로 수정한다고 한다.

더 쉬운건, 주석이나 코드 스타일 수정이 있다.

 

수정한 부분을 발견한건 우연이었다.

프로세스 생성 커널 분석을 하다가,
copy_process() 함수에 이런 주석이 있었다.

p->set_child_tid = (clone_flags & CLONE_CHILD_SETTID) ? args->child_tid : NULL;
	/*
	 * Clear TID on mm_release()?
	 */
p->clear_child_tid = (clone_flags & CLONE_CHILD_CLEARTID) ? args->child_tid : NULL;

이 코드의 의미는 이렇다.

"clone_flags와 CLONE_CHILD_CLEARTID가 true일때 args->child_tid를 넣고, 아니면 NULL을 넣자"

그러면 결국 2가지 경우가 나온다.

  1. p->clear_child_tid = args->child_tid
  2. p->clear_child_tid = NULL

이 두가지 경우에 따라 mm_release()에서의 동작방식이 달라지게 된다.

그래서 mm_release()함수를 찾아보았다.

static void mm_release(struct task_struct *tsk, struct mm_struct *mm)
{
	uprobe_free_utask(tsk);

	/* Get rid of any cached register state */
	deactivate_mm(tsk, mm);

	/*
	 * Signal userspace if we're not exiting with a core dump
	 * because we want to leave the value intact for debugging
	 * purposes.
	 */
	if (tsk->clear_child_tid) {
		if (atomic_read(&mm->mm_users) > 1) {
			/*
			 * We don't check the error code - if userspace has
			 * not set up a proper pointer then tough luck.
			 */
			put_user(0, tsk->clear_child_tid);
			do_futex(tsk->clear_child_tid, FUTEX_WAKE,
					1, NULL, NULL, 0, 0);
		}
		tsk->clear_child_tid = NULL;
	}

	/*
	 * All done, finally we can wake up parent and return this mm to him.
	 * Also kthread_stop() uses this completion for synchronization.
	 */
	if (tsk->vfork_done)
		complete_vfork_done(tsk);
}
  1. p->clear_child_tid = clone_args인 경우에는 put_user(0, tsk->clear_child_tid)에 의해 tsk->clear_child_tid가 가르키는 주소로 가서 0을 쓰고 주소를 NULL로 바꾼다. 이 과정은 자식이 부모에게 죽기전에 나 죽는다~라고 알리는 과정이라고 보면 된다.
  2. p->clear_child_tid = NULL인 경우에는 그냥 넘어간다.

그래서 어떤 주석을 수정했는가?

	/*
	 * Clear TID on mm_release()?
	 */

원래의 이 주석은 "TID가 mm_release에서 clear되는가?"

라는 뜻이고,

 

분석 결과 mm_release에서 clear_child_tid를 체크하고 clear해주는건 자명하다.

따라서

이렇게 주석을 수정하고

패치메일을 보냈다.

 

그리고 3주가 약간 넘은 시점에

커널 핵심 개발자인 Andrew Morton으로부터 메일을 받았다.

결과적으로는 패치를 승인했고, 이 패치를 빠른 시일내에 반영하겠다. 라는 답을 받았다.

https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/fork-comment-fix-remove-ambiguous-question-mark-in-clone_child_cleartid-comment.patch

 

 

리눅스 커널 책을 읽을때, 등장했던 Andrew Morton이 직접 코드를 보고 승인을 해줬는데

감회가 새롭다..

 

아마

Andrew Morton이 최종적으로 Linus Torvalds에게 패치를 또 올릴텐데,

토발즈 아저씨가 내가 쓴 코드를 직접 확인한다고 생각하니 개발자로써 떨리지 않을 수 없다.

 

기분좋은 첫 기여였다.

다음 기여는 주석수정이 아닌, 드라이버쪽 기여를 해보고싶다.

'Linux > start_contribute()' 카테고리의 다른 글

커널 기여: race condition 가능성 해결  (0) 2026.02.01
커널 기여 근황  (0) 2026.01.27
리눅스 커널 2번째 기여: 수동 메모리 정렬 연산 PTR_ALIGN으로 최적화  (2) 2026.01.12
'Linux/start_contribute()' 카테고리의 다른 글
  • 커널 기여: race condition 가능성 해결
  • 커널 기여 근황
  • 리눅스 커널 2번째 기여: 수동 메모리 정렬 연산 PTR_ALIGN으로 최적화
Minu Jin
Minu Jin
정보의 바다
  • Minu Jin
    뇌 구조가 바이너리
    Minu Jin
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch
        • Cortex-M
        • FreeRTOS
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Qualcomm 기업과제
      • Linux
        • start_contribute()
        • start_analyse()
      • Web
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    C++
    파이썬
    드라이버 분석
    commit
    INIT
    커널
    c언어
    리눅스
    피보나치
    백준
    시스템콜
    yolo
    Qualcomm
    동적메모리
    토발즈
    커널 기여
    순환
    Git
    소수
    포인터
    버퍼
    앤드류모튼
    Branch
    스택
    파일 입출력
    이진 트리
    rubikpi3
    rubik pi
    arm
    자료구조
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Minu Jin
첫 리눅스 커널 기여
상단으로

티스토리툴바