Bullshitting Blog

개소리하는 블로그

[ kernel ]

타협 vs 고집

Rust 커널 서적에서 사용하는 함수들이 죄다 옛날 커널 기준이다. 지금 난 6.16 버전 받아다가 하고 있으니, 당연히 한 스텝 마다 막힘.

이쯤에서 선택지는 2개가 있다

  1. 옛날 커널을 받아서 쓴다
  2. 싸운다

일단 2번으로 하고 있다. 1주일에 커널 서적 끝내긴 개뿔. 회사 복귀 후에도 계속 싸워야 할 듯 하다.

그래도 2번을 고집하는 이유는, 1번보다 많은 것을 얻을 수 있기 때문이다. 마치 아무 대책 없이 노트북 OS 날려버리고 아치리눅스를 설치한 것과 비슷하다. 적응을 강제하는 환경을 만들어버렸더니, 아치리눅스 사용법 뿐만 아니라 개발 중에 만사에 당황하지 않는 멘탈도 얻었다.

처음에 싸우던 방법은 진짜 그 코드를 그대로 두고 조금씩 바꿔쓰기 위해 ChatGPT에 “이거 대체할 수 있는 함수나 매크로 뭐임?” 하고 물어봤다. “아 그 낡은거 왜 궁금해함? 이거같은데?” 하고 잘 답해주긴 한다. 하지만 그 대답이 쓸데없이 길다. 대부분 “그거 여기어디 있는데, export 안됨. ㅋ. 직접 c로 shim 짜셈” 이다. 걔가 코드 쭉 써준걸 보면, 그냥 rust로 쓴 척 하는 c 모듈 코드다. 그리고 잘 돌지도 않음. 물론 내 손이 문제겠지만 말이다.

그래서 바꾼 방법은, 코드 슥 읽은 다음에 그 목적을 달성하는 모듈을 직접 짜는 방법이다. 이렇게 하려니 직접 커널 소스를 돌아다니면서 찾아야 한다. 근데 아직 코드베이스 자체가 익숙치 않으니 감이 잘 안잡힘. 그 부분부터 잡아야 할 듯 하다. C 기반으로 된 책도 있긴 한데, 무슨 Calculus마냥 두꺼워서 아직 엄두는 안남. 일단 싸우고 나서 생각해 볼 예정이다.

Rust 커널

커널 버전 6.1에 rust 지원되는거 기대할 필요는 무슨. 6.16이 넘어가도록 건드리지도 못했다. 책 신나게 사놓고 말이다. 병가 4주차를 맞이하여, 이제 회사 시간표에 준하는 활동을 하고 있다. 따라서 본격적으로 진도를 나가고 있다. 오늘 4주차 일정 처음인데… 좀 딸리긴 한다. 그래서 3번째 활동 블록(대충 2-3시간 텀 주고 휴식 넣어서 잘랐음)땐 허리보호대를 착용하고 있었다. 아 그리고 뜬금없이 귤이 생각나서 점심 때 사와서 오후 간식 시간에 먹었는데, 정신이 돌아옴. 비타민 부족인가보다. 왜? 그래도 영양소 더듬이(?)는 감도가 좋아진 것 같아서 나름 만족이다. 단어 안 떠올라서 지맘대로 쓰는건 지금도 마찬가지다.

공부는 그냥 책 따라가고 있다. Rust-for-Linux의 소스를 가져다가 커널을 빌드하고, 만들어낸 모듈도 그 소스를 이용해서 빌드. 테스트는 qemu vm 위에서 테스트해보는 식으로 실습을 진행하고 있다. 실습 git repo는 아래와 같다.

https://github.com/Xanthorrhizol/rust-kernel-study

문제는 2가지였다.

제일 먼저, vim에 연동된 rust-analyzer에서 지원하게 하고 싶었다. vim을 주 도구로 사용하긴 하지만 메모장 코딩은 나도 싫다. 그래서 또 vim 세팅이랑 싸웠다. 프로젝트 최상단에 rust-project.json 생성한 후 ~/.vim/coc-settings.json 에다가 rust language server에서 rootPatternsrust-project.json 도 지원하게 추가하면 되는거였는데, 또 여기서 난리를 침.

다음은 책 내용의 예제가 버전이 안맞아서 deprecated된 모듈들과 한바탕 싸움질을 해야 했다는 것이다. 첫 예제인 printk부터 말이다. 다음 예제는 module 매크로 내부의 params 파라미터를 사용해보는 것인데, 이것도 deprecated다. printk는 그래도 옵션 켜면 vprintk라는 대체 함수가 제공되었는데, params는 대체함수도 없고, ffi로 직접 구현해야 한다. 그 삽질을 하다가 printk만 커밋했음.

강하게 키우는가보다. 덤벼라.

QEMU VM 생성 삽질기

Rust 커널 서적을 따라가면서 커널을 빌드해서 qemu로 실행시키기 위한 과정을 밟고 있었다. 그리고 busybox 위에서 그걸 돌리도록 되어 있었음. 그래서 busybox 최신 릴리즈(1.37.0)에서 make menuconfig 실행하는데, ncurses가 없다고 설치하라고 자꾸 떴다. 대충 그 방향키로 뚝딱거릴 수 있도록 GUI스럽게 만들어둔 터미널 기반 환경을 사용하기 위해 필요하다고 함. 근데, 문제는 그 패키지 이미 설치 다 되어 있다는 것이다. 그리고 이미 리눅스 커널 빌드하기 전에 똑같이 make menuconfig 이용 잘 했었음.

그럼 그 환경 대신 일반 cli 환경을 이용하는 방법이 있다. make config 하면 되는데, 그렇게 해봐도 실제로 qemu로 실행해보면 아무 것도 안뜨고 멈춰 있었다. 그래서 처음엔 qemu 해결하려고 이런저런 해결책들을 반영하면서 삽질을 했다.

ChatGPT 선생에게 보고를 했고, linux-api-headers, base-devel 다 재설치 해도 해결이 안됨. 그랬더니 선생도 귀찮은지, “아 소스 까봐! scripts/kconfig/lxdislog/check-lxdialog.sh 이거임. 대충 거기서 에러 왜 뱉는지 찾아보셈” 이런 식의 답변을 함. 정말 들어가서 봤더니, 문제되는 부분이 있었다.

그리고 이제 ChatGPT 선생이 이제 시니어를 해먹기 시작한 듯 하다. “아 그 저 여기에 거기 그 뭐 있을텐데 봐보셈”. 방식의 답변이다. 대충 바이브인데 정확하기까지 하다.

image.png

C언어 메인함수에 반환형 타입도 명시 안하고 쓰는 신박한 모습이다. 저 부분 int 추가해주니 해결됨. 그래서 git repo 최신에도 저게 저렇게 들어가 있는지 확인해보니, 이미 작년에 고쳐놨다. “릴리즈 주기가 이렇게 느리다고?” 싶다. 사실 부럽다. 우린 고객사의 “해-줘” 한 마디에, 해가 중천에서 “아 피곤한데 집에 갈까?” 하는 오후 3시에, 갑자기 새 일에 착수해서 다른 일 다 제쳐두고 일주일동안 그 짓만 하는데 말이다. 그에 반해 이 busybox는 최신 릴리즈인 1.37.0은 작년 9월, 저 부분이 고쳐진건 작년 10월이다. 그리고 지금까지 릴리즈가 안된 것이다. busybox라는 이름과 대비된다.

여튼 그럼 해결 됐을까? 아니다.

그럼 실제로 문제 원인은 뭐였냐고? 기대해도 좋다.

콘솔을 ttyS0 로 이용해야 하는데 tty50 으로 계속 쓰고 있었다. 심지어 “왜 굳이 50이지? 다른 특별한 숫자도 아닌?” 하면서 그냥 50을 입력하고 넘어감. 그래서 쉘에 아무 것도 출력이 안된 것이었다.

이게 디버깅의 묘미다. 돌고 돌아 오타 한 글자를 찾는 행위가 바로 디버깅이다.