리눅스 커널 2번째 기여: 수동 메모리 정렬 연산 PTR_ALIGN으로 최적화
·
Linux/start_contribute()
커널의 코어 영역에 기여하기란 쉽지 않다.그래서 보통 초보 개발자들은 드라이버쪽 기여를 많이 하게되는데,특히 드라이버쪽에 staging디렉토리에서 한다. staging 디렉토리는 아직 메인라인 커널의 엄격한 코딩 표준을 완벽히 충족하지 못했거나,추가적인 테스트가 필요한 과도기적 드라이버들이 모여있는 곳,그래서 초보 기여자들이 개선할 여지가 가장 많은 곳이다. 난 그중에서 rtl8723bs 와이파이 드라이버에서 기여를 해보고자 선택했다./drivers/staging/rtl8723bs/core/rtw_cmd.c여기서,이 코드를 보면, 엄청나게 긴 연산이 있다.이 비트 연산이 포함된 연산은 '메모리 정렬'을 위한 연산이다. 메모리 연산이 뭐냐면컴퓨터는 데이터를 읽어낼 때, 뭉텅이 단위로 읽는다.예를 들어, 8..
나의 sht20드라이버는 무엇이 부족했을까, 메인라인 코드와 비교 분석
·
Linux/start_analyse()
라즈베리파이 온습도 제어 시스템을 만들면서sht20 온습도 센서를 사용했고, 이 과정에서 sht20센서의 디바이스 드라이버를 직접 제작했다. 디바이스 트리를 작성하고, 데이터 시트를 보고 명령어를 짜고 꽤나 공부가 되었던 토이 프로젝트 인데,정작 리눅스 내에 sht21 드라이버가 있는 줄은 몰랐다.https://github.com/Jminu/Yocto-rasp-BSP/blob/master/meta-mylayer/recipes-kernel/sensor-drivers/files/sht20_driver.c Yocto-rasp-BSP/meta-mylayer/recipes-kernel/sensor-drivers/files/sht20_driver.c at master · Jminu/Yocto-rasp-BSPbuil..
/drivers/char/mem.c 드라이버 2차 분석
·
Linux/start_analyse()
기존devlist[5] = {"zero", &zero_fops, FMODE_NOWAIT, 0666};devlist[7] = {"full", &full_fops, 0, 0666};에서 write_zero와 read_zero에 대해서 이전에 봤다. 간단하게 보자면,zero_fops#define write_zero write_null이고,write_null 코드421 static ssize_t write_null(struct file *file, const char __user *buf,422 size_t count, loff_t *ppos)423 { 424 return count;425 }걍 아무 동작도 하지않음.read_zero 코드4..
첫 리눅스 커널 기여
·
Linux/start_contribute()
커널 분석을 하다가 발견리눅스 커널에 관심을 가지면서 커널 분석을 시작했고,더 나아가서 커널에 기여를 해보고싶다는 생각이 들었다.오픈소스 기여, 특히 커널에 기여한다는 것은 개발자의 로망이 아닌가? 나같은 초보 개발자들이 커널의 코어 소스코드를 수정한다는 것은 사실 쉽지 않다.코어부분은 초고수개발자들이 수십년에 걸쳐서 검증이 된, 거의 완벽한 코드이기 때문이다. 그래서 보통 드라이버쪽에 staging된 코드(아직 개발될 여지가 많은 코드)들을 대체로 수정한다고 한다.더 쉬운건, 주석이나 코드 스타일 수정이 있다. 수정한 부분을 발견한건 우연이었다.프로세스 생성 커널 분석을 하다가,copy_process() 함수에 이런 주석이 있었다.p->set_child_tid = (clone_flags & CLONE_..
프로세스 생성 분석 fork (thread_info, task_struct 구조체) - 3
·
Linux
thread_info 구조체와 task_struct 구조체에 대해서 알아보자.저번에 ftrace로 확인했듯이, fork를 호출했을때 함수 호출 순서는 이렇다.__arm64_sys_clone() → __do_sys_clone() → kernel_clone() → copy_process() 여기서 kernel_clone함수를 살펴보자.pid_t kernel_clone(struct kernel_clone_args *args){ u64 clone_flags = args->flags; struct completion vfork; struct pid *pid; struct task_struct *p; int trace = 0; pid_t nr; if ((clone_flags & CLONE_PIDFD) && ..
메모리 프로파일러 (시스템 콜 후킹)
·
Linux
실시간으로 프로세스의 메모리를 추적하는 툴을 제작을 25년 2월부터 시작했다.처음에는 ptrace를 활용해서 추적하려했으나 생각하는대로 동작하지 않았고ptrace 동작방식 자체가 해당 프로세스를 중간중간 멈추게 하기 때문에 실시간성이 없었다... 그렇게 지지부진한 상태로 있다가,커널 공부하는 김에 메모리 관련 시스템콜이 발생하면 유저 공간으로 전달해주도록 수정하면실시간성이 확보되지않을까 싶어서 이 방식으로 다시 시작했다. 또, 커널 ↔ 유저 데이터 전달이 이뤄져야하기 때문에어떻게 하지? 생각하다가 Netlink-Socket이 있다는걸 알았고 사용했다. 커널에 netlink-socket 내부 모듈을 작성했다.https://c-pointers.com/lsp/Netlink/Netlink/Basic_exampl..