ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [GIT] 리눅스 커널 코드 분석
    Linux/development tool 2023. 10. 5. 23:45

    글의 참고

    - https://medium.com/@gabicle/git-ancestry-references-explained-bd3a84a0b821


    글의 전제

    - 밑줄로 작성된 글은 강조 표시를 의미한다.

    - 그림 출처는 항시 그림 아래에 표시했다.


    글의 내용

    - Overview

    " 개인적으로, 리눅스 커널 소스를 분석하는데 있어서 제일 중요하다고 생각되는 부분이 `히스토리`다. 이 변수 및 함수가 왜 생겼으며, 이렇게 코드를 짠 이유에 대해서 제대로 알려면 소스 코드의 히스토리를 제대로 분석할 수 있어야 한다. 리눅스 커널 소스는 git 으로 관리되고 있고, github 에서 소스 히스토리 추척이 매우 쉽기 때문에 그 방법에 대해 알아보자.

     

     

    - How to search a patch file via github ?

    " 리눅스 커널의 패치 파일을 찾는 방법은 여러 가지가 있겠지만, 내가 개인적으로 사용해보면 결과 github 가 가장 좋았다. Patchwork, Kernel Mailing Lists 에서 패치 파일을 찾는게 맞는 방법인지는 모르겠지만, 나에게는 굉장히 복잡하고 정확하게 내가 원하는 부분을 찾아내기가 어려웠다. 그런데, github 를 이용하면 몇 번의 클릭을 통해 패치 파일을 그나마 쉽게 찾아낼 수 있다.

     

    " 먼저 리눅스 커널 github 로 들어간다. 리눅스 커널 버전을 먼저 선택한다. `tag` 를 통해 선택이 가능하다.

     

     

    여기서 내가 원하는 변수 및 함수를 찾아야 한다. 위에 `Type / to search` 라고 검색창이 있다. 여기를 클릭해서 원하는 심볼을 찾자. 나 같은 경우는 kernfs 서브-시스템을 분석하는데, 문서 및 구글링 자료가 너무 없어서 어려웠던 기억이 난다. 이해가 안갔었던 `struct kernfs_node` 구조체에 count 및 active 변수의 차이에 대해서 한 번 찾아보자.

     

     

    " `linux/include/kernfs.h` 파일에 해당 구조체가 있는 것을 발견했다. 여기서 `struct kernfs_node` 라인, 즉, 190번을 클릭하면, 바로 왼족에 `...` 하는 버튼이 나온다. 이걸 클릭하면, `View git blame` 이라는 메뉴가 보일것이다.

     

     

     

    " `View git blame` 을 클릭하면, 굉장히 많은 커밋들을 볼 수 있다. 여기서 가장 최신 커밋을 보려면, 아래 그림에서 (1) 을 클릭하면 된다. 만약, 이전 커밋을 보고싶다면, (2) 을 클릭하면 된다.

     

     

    " 위에서 (1) 번을 클릭할 경우, 아래와 같은 내용을 볼 수 있다. 아래에서 (1) 은 커밋 제목과 내용을 보여준다. (2) 같은 경우, 2가지로 나눠서 볼 수 있다. 볼드체로 되어있는 부분은 현재 해당 커밋이 적용된 브랜치와 현재 최신 커널 버전을 의미한다. 그리고, 중요한 것은 그레이색 써진 텍스트다. `3.14.rc1` 은 해당 커밋이 적용됬던 태그의 버전을 의미한다. (3) 은 커밋을 적용한 개발자와 언제 커밋이 되었는지가 작성되어 있다.

     

     

    " (4) 번은 바로 직전 커밋을 의미한다. 이 commit 을 `parent commit` 이라한다. (5) 은 현재 커밋 ID 를 의미한다. 커밋 관련 용어를 부를 때, child, parent, grandparent 커밋이 존재한다. 각 커밋 관계는 아래와 같다. 8f754436 커밋이 가장 최신 커밋이라 가정한다.

    * 8f754436 (HEAD -> master, origin/master, origin/HEAD) tests: use smokehouse runner for test-bundle (#9943) // 이 커밋을 child 커밋이라 가정
    * a7133e55 report: adjust score's arc length accounting for rounded linecap (#9913) // 이 커밋은 8f754436 커밋입장에서 parent
    * 5e0cd060 core(max-potential-first-input-delay): shorten description (#10019) // 이 커밋은 8f754436 커밋입장에서 grandparent

     

     

    - How to see if modified, added, removed files & contents

    " 좌측 패널에 녹색 `+` 로 나오면, 이 패치에서 새로 파일이 추가된 것을 의미한다. 그리고, 노란색 점표시로 되어있는 파일은 수정이 된 파일을 의미한다.

     

     

    " tick-sched.c 파일은 새로 추가된 파일인데, 사이즈가 너무 커서 diff 를 보여주지 않는다. 해당 파일을 보고 싶은 경우, 파일의 우측 상단에 `...` 를 클릭해서 `View file` 을 누르면, 파일의 전체 내용을 확인해 볼 수 있다. 

     

     

     

    - Case

    1. A 파일에서 B 파일로 옮겨졌을 때, 히스토리 추척

    " cpu isolation 관련에서 분석하는 도중에 housekeeping 관련 소스를 분석할 일이 있었다. 그런데, 문제가 생겼다. 소스가 옮겨지는 문제가 발생했다. 아래와 같이, v4.15.rc-1 에서 housekeeping 관련 소스가 include/linux/tick.h 에서 include/linux/sched/isolation.h 로 이동했다. 

    include/linux/tick.h include/linux/sched/isolation.h

     

    " 내가 궁금한 건 `extern cpumask_var_t housekeeping_mask;` 가 생성된 이유를 찾는 것이다. 즉, 저 코드가 추가될 때, 커밋 내용을 찾는것이다. 그런데, 파일 바뀌면서 약간의 어려움이 발생했다. 그러나, 방법은 있다. 먼저, 소스가 지워진 include/linux/tick.h 파일이 있던 히스토리로 돌아가야 한다. `View file` 을 누르면, 해당 커밋이 적용된 시점으로 돌아간다. 즉, v4.15.rc-1 로 돌아가는 것이다.

     

     

     

    " 여기서 (1) 이 우리가 현재 위에 커밋이 적용때로 돌아온 것이라는 것을 알려준다. 그런데, 우리가 원하는 것은 위에 커밋이 적용되기 바로 직전 커밋으로 돌아가길 원한다. (2) `History` 를 클릭하자.

     

    " (1) 번은 현재 우리가 있는 커밋을 의미한다. (2) 번이 바로 우리가 찾던 커밋이다.

    'Linux > development tool' 카테고리의 다른 글

    [개발 도구] QEMU  (4) 2023.08.07
    [개발 도구] GDB  (0) 2023.08.07
    [개발 도구] linker script  (0) 2023.08.03
    [개발 도구] Shell Prompt 언어 설정  (0) 2023.08.03
    [LINUX][VIM] - Vim Session  (0) 2023.08.03
Designed by Tistory.