리눅스 커널 2번째 기여: 수동 메모리 정렬 연산 PTR_ALIGN으로 최적화

2026. 1. 12. 00:09·Linux/start_contribute()

커널의 코어 영역에 기여하기란 쉽지 않다.
그래서 보통 초보 개발자들은 드라이버쪽 기여를 많이 하게되는데,
특히 드라이버쪽에 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 사이클을 최소화하며,
특히 이미 정렬된 주소에 대해서는 불필요한 연산을 수행하지 않아 더 효율적이다.
 
따라서 이렇게 코드를 수정하였고, 패치를 보냈다.

수정한 코드

https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git/commit/?h=staging-next&id=69dc48dc550640b1c33e30f32620fe5ef1b068e9
필자가 보낸 패치 반영
 
 

2주가 지난 시점에 Greg KH 리눅스 커널 메인 개발자에게 패치 승인 메일을 받았다.
이로써 운이 좋게도 2번째 기여도 별다른 리뷰없이 통과되었다.

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

첫 리눅스 커널 기여  (4) 2025.12.22
'Linux/start_contribute()' 카테고리의 다른 글
  • 첫 리눅스 커널 기여
Jminu
Jminu
  • Jminu
    뇌 구조가 바이너리
    Jminu
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch
        • Cortex-M
        • FreeRTOS
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Qualcomm 기업과제
      • Linux
        • start_contribute()
        • start_analyse()
      • Web
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Jminu
리눅스 커널 2번째 기여: 수동 메모리 정렬 연산 PTR_ALIGN으로 최적화
상단으로

티스토리툴바