커널의 코어 영역에 기여하기란 쉽지 않다.
그래서 보통 초보 개발자들은 드라이버쪽 기여를 많이 하게되는데,
특히 드라이버쪽에 staging디렉토리에서 한다.
staging 디렉토리는 아직 메인라인 커널의 엄격한 코딩 표준을 완벽히 충족하지 못했거나,
추가적인 테스트가 필요한 과도기적 드라이버들이 모여있는 곳,
그래서 초보 기여자들이 개선할 여지가 가장 많은 곳이다.
난 그중에서 rtl8723bs 와이파이 드라이버에서 기여를 해보고자 선택했다.
/drivers/staging/rtl8723bs/core/rtw_cmd.c
여기서,

이 코드를 보면, 엄청나게 긴 연산이 있다.
이 비트 연산이 포함된 연산은 '메모리 정렬'을 위한 연산이다.
메모리 연산이 뭐냐면

컴퓨터는 데이터를 읽어낼 때, 뭉텅이 단위로 읽는다.
예를 들어, 8바이트씩 읽어낸다고 한다면 0, 8, 16, 24, 32 이렇게 읽어내는데
이때 데이터가 0, 8, 16, 24 같은 위치에 있어야 데이터를 읽기 쉽다.
만약 6에 데이터가 걸쳐있다면, 0부터 8까지 8부터 16까지 총 2번 읽어야한다.
따라서 이런 수고를 덜어주기위해서 6에 걸쳐있는 데이터를 8로 밀어주는 메모리 정렬이 필요한 것이다.

그 메모리 정렬을 하기 위한 기존 코드인데, 너무 길고 무엇을 의도하는지 알기 쉽지 않다.
따라서 나는 커널에 매크로로 정의된 PTR_ALIGN을 사용하는 코드로 수정했다.
#define PTR_ALIGN(p, a) ((typeof(p))ALIGN((unsigned long)(p), (a)))
#define ALIGN(x, a) __ALIGN_KERNEL((x), (a))
#define __ALIGN_KERNEL(x, a) __ALIGN_KERNEL_MASK(x, (__typeof__(x))(a) - 1)
#define __ALIGN_KERNEL_MASK(x, mask) (((x) + (mask)) & ~(mask))PTR_ALIGN의 정의를 살펴보면, 결국 __ALIGN_KERNEL_MASK이고,
정확히 위의 연산과 동일한 동작을 하는 것을 알 수 있다.
비트 마스킹을 활용한 연산은 CPU 사이클을 최소화하며,
특히 이미 정렬된 주소에 대해서는 불필요한 연산을 수행하지 않아 더 효율적이다.
따라서 이렇게 코드를 수정하였고, 패치를 보냈다.


2주가 지난 시점에 Greg KH 리눅스 커널 메인 개발자에게 패치 승인 메일을 받았다.
이로써 운이 좋게도 2번째 기여도 별다른 리뷰없이 통과되었다.
'Linux > start_contribute()' 카테고리의 다른 글
| 첫 리눅스 커널 기여 (4) | 2025.12.22 |
|---|