커널 공부를 하고 싶스니다.

ngw2833의 이미지

리눅스 커널 공부를 하고 싶습니다.
CentOS를 사용한 지는 약 10개월 정도 되었네요.
통신 프로토콜 실습을 하면서 Linux를 자주 운용했어요. 그래봐야, Telnet이나 FTP같은 애플리케이션을 이용한 것이 전부이기는 합니다.. ㅎ
아 그리고 CentOS로 초급적인 API를 한 번씩 다루어보고 리눅스 프로그래밍의 개론적인 부분을 학습한 바 았습니다.
자료구조 과목을 수강하며 Linked List 및 Binary tree 정도 까지는 공부했고 구현할 줄 알고 있어요.
c언어에 대한 지식은 임베디드 시스템을 공부하며 C를 사용하고 있고, 대학교에서 해당과목 조교를 맡고 있기도 하니..(학부생입니다 ㅎㅎ 어쩌다 실습조교를 하고 있네요.) 초보는 아니라고 생각해요. 잘한다고 말씀드리기는 어렵네요..ㅎ

어쩌다 학과에서 졸업한 지 오래된 선배 중에 커널 공부를 한 선배가 있다고 들었어요.
Driver를 다룰 줄 알고 관련해서 졸업작품도 내었다고 교수님께 들었네요.

저 역시 Kernel 공부를 하고 싶어요.
아직 추상적이기는 하지만 OS의 부분부분을 건들일 줄 아는 사람이 되고 싶어요.

어떻게 공부하면 좋을까요.

열심히 찾아보니 운영체제론, 컴퓨터 구조론, 아키텍처에 대해서 공부가 선행되어야 한다고 찾은 적 있습니다.
저는 컴퓨터공학이 아닌 정보통신공학에 재학중인 학생이라 관련된 과목이 편성되어있지 않네요. 그래서 아직 배운 적이 없네요.
(컴퓨터구조에 대해서는 임베디드 공부할 때 살짝 맛을 본 바는 있습니다.)

이런 제 상황에서 어떻게 공부를 하면 좋을까요.
책을 찾아보니 '리눅스 커널 심층분석' 'Understanding the linx kernel'같은 서적을 많이 추천해주시는 것 같더라고요.

바로 책을 구입해서 공부를 해볼까라는 생각도 들고, 컴퓨터 구조론과 운영체제론에 대해서 공부를 하고 다시 고민해볼까 생각도 드네요.
뭐가 되었든 3학년 1학기인 제게 장기적인 공부계획이 될 것 같아요.

혹시 저랑 비슷한 경험을 하셨거나, 저보다 먼저 이 길을 나서보신 분들에게 여쭈고 싶어서요.
이러한 이유로 조언을 구하고자 합니다.
감사합니다.

세벌의 이미지

이런 책은 어떤가요?
https://kldp.org/comment/626506#comment-626506

아래 글도 도움 되시길.
https://kldp.org/node/159392

Zmi nazim@Google의 이미지

리눅스 공부 따로 안해도 되요. 실무에 포함되는거만 하셔도 됩니다. 그것보다 java, jsp 더 공부하세요. 시스템개발자로 안갈꺼면.
https://dltutuapp.com/
https://9apps.ooo/
https://showbox.run/

jw8704의 이미지

커널(kernel)공부는 개인이 그 공부의 진입점을 찾기가 좀 어렵습니다. 그래도 예전에 비하여 자료나 연구주제가 많이 취미형태로 다뤄지고있으니 정보를 얻기는 어렵지않으실겁니다.

우선 커널은 여러가지 세부 분야로 이뤄져있기에 커널을 공부한다는것은 그 세부분야중 하나를 공부한다고 봐야할수도있겠죠 물론 그다음은 여러가지 분야를 두루 볼 수도 있겠구요.

또한 커널이 세부 분야로 나뉘어져있지만 common 한 부분이 분명히 있기에 어쩌면 커널을 공부한다는 사람들 중에는 특정한 세부분야를 깊이하려는 목적보다 그러한 common 한 부분을 익혀서 커널을 좀 더 이해하고 자신이 필요할때 커스터마이징하거나 분석하는 능력을기르려는 사람도있을수있겠죠.

common 한 부분을 공부하려는 목적이시든 세부적인 어떤 특정분야를 공부하시려는 목적이시든 , 둘중 어떠한 방법으로 공부를 시작하셔도 그 과정중에 양쪽 지식이 모두 필요하여 , 초심자입장에서는 어떤걸하셔도 둘다 처음에는 익히시게 될 것입니다.
물론 보안쪽이나 디바이스 드라이버를 공부하시려는 분들도 이런저런이유로 커널소스를 보게됩니다.

커널은 스케쥴링,파일시스템,,등등 으로 이뤄져있습니다. 이렇게 이뤄져있다는 말은 커널안에 소스로 짜여져있다는것입니다. 리눅스의 배포판은 레드햇,알짜,센트오에스 이런식으로 다양하지만 커널은 kernel.org 에서 공통적으로 받을수있습니다.

그래서 커널을 공부하고 분석한다는것은 kernel.org 에서 커널소스를 받아서 소스를 분석하고 그것을 문서화하고 자신이 그안에 코드를변경해보고 변경한것을 확인하고 , 이때 확인하기위해 커널소스를 재컴파일하고 재컴파일된 커널로 부팅하고 , 이러한 과정을 반복하는것을 말합니다.

보통 초보자가 처음에 커널소스를 보고 수정하고 문서화하는것은 그양이 엄청 많습니다. 왜냐면 첨에는 하나도 모르기때문이죠. 그래서 커널을 공부하려면 회사나 대학원의 연구실에가서 체계적으로 하는것이 좋습니다.
혼자하려면 의지가 엄청나게 필요하고 꾸준히 해야하기 때문이며 최소 2년은 하셔야합니다. 매일 6시간 이상씩이요.

커널을 공부한다는것은 구체적으로는 cscope,ctags 와 같은 툴을 사용하여 kernel.org 에서 받은 소스코드를 분석하고 그것을 문서화하는것입니다.

그렇게하여 코드가 이해가 되었거나 , 또는 이해하는과정중에 그안에 자신이 코드를 넣어보기도 하는데 , 넣고나서 재컴파일했더니 오류가난다거나 , 컴파일과정에서는 오류가안났는데 , 부팅해보니 오류가난다거나, 하는 그런 여러가지과정이 수없이 반복됩니다.

그런것을 거치면서 자신이 지식을 쌓아나가는것이 커널공부라고하겠네요.

또한 커널소스는 체계화되어있다보니 초심자가보기에는 함수를 따라가는것이 상당히처음에는 어려울수있습니다.

유저레벨에서 어떤함수가 호출되면 그게 시스템콜을호출하고 그게 또 커널단의 어떤걸호출하고 , 또 어떤함수는 콜백형태로 호출되고 , 또 따라가다보면 어떤건 매크로함수고 이런것들이 처음에는 많이 어려우실겁니다.

이런 수많은 난관을 극복하시는게 커널공부입니다.

도움을드리자면 최신커널일수록 분석하는데 더 어려울수있습니다.

오래된 커널을 보시고 , 처음보시기에는 그나마 파일시스템쪽이 공부하시기 좀 수월하실수있습니다.

그리고 디바이스드라이버는 커널을 공부하시다보면 모든책에서 다루는 내용이므로 연습해보실수있습니다.

하지만 커널책에서 다루는 디바이스 드라이버 내용은 , 실무에서 만드는 디바이스 드라이버랑은 좀다른게

커널책에서 다루는건 디바이스 드라이버를 만드는 방법을 알려주는것이고 , 님이 실제로 하고싶으신건 그안에 어떤 장치를 구동할수있는 코드를 넣는건데 , 그내용은 펌웨어쪽이나 데이터시트를 보고 코드를 짜는 쪽에 해당하므로 또 따로 공부하셔야합니다.

그리고 디바이스드라이버는 기본적으로 커널메모리공간안에서 동작할수있는 코드 라고 생각하시면됩니다.

커널공부는 분량이 상당히 많고 시간이오래걸립니다. 그리고 그냥하셔서는 절대안되는 분야입니다.

그시간이 너무 오래걸리기때문에 공부과정중에 반드시 어떤 학위라던가 회사경력등이 있어야지 혼자 집에서 공부한다고하면 그시간이지나서 공부를 잘했다해도 시간동안 사회적 결과물이 없는 상태가됩니다.

꼭 대학원이나 회사를 들어가셔서 하시기 바랍니다.

그리고 커널소스 공부가 대략 10년전만해도 하는사람이 지금처럼 많지않았고 , 또 기술자로 꽤 인정받았던걸로 알지만 지금은 그렇지않습니다.

하는사람이많고 자료가 많이개방되고 커리큘럼이 잘되어있어서 하는사람이 많습니다.

그래도 기술자로써 필요한 부분은아셔야할테니 공부를 하시되 , 커널만해서는 안됩니다.

응용프로그래밍 기술도 잘아셔야합니다.

주저리 적었는데 도움이 되셨으면 좋겠습니다.

키워드를 말씀드리자면 , inode , inode table, superblock , 이런것을 검색하면서 공부해보시죠.

또 read 가 호출되고 disk 에 쓰이기까지의 과정을 알아보시구요.

그럼 화이팅입니다.!

AustinKim의 이미지

리눅스 커널 그 자체는 매우 생소하고 또한 바다와 같아서 어느 코드를 먼저 봐야 할 지 감을 잡기 어렵습니다.
하지만 혼자서 리눅스 커널을 해 볼 수 있는 방법이 없지는 않는데요.

<< 시작 >>

다음 방법을 한 번 해 보시면 어떨까요?
1. 리눅스 커널을 빌드할 수 있는 보드를 구입(ex: 라즈베리파이, 기타 등등)
: 요즘 시중에 다양한 리눅스 보드가 나왔는데 라즈베리파이가 제일 유명하다고 하네요.
2. 간단한 리눅스 드라이버 작성
: 책이나 블로그에 있는 내용을 참고해서 캐릭터 디바이스 수준으로 간단한 드라이버를 하나 작성해 봅니다.
: 드라이버 코드 실행 시 커널 로그를 출력하는 것이라도 좋습니다.
3. 코드 분석
: 드라이버 코드를 보면 커널 함수를 쓸 수 밖에 없습니다.
: 관련 커널 코드를 차근 차근 분석하면서 알아간 내용을 개인 노트(블로그 혹은 메모장)에 정리합니다.

임베디드 디바이스나 커널 개발자들도 초보 때는 위와 같은 방법으로 리눅스 커널에 접하는 것 같습니다.

<< 중급 >>

이렇게 리눅스 디바이스 드라이버 코드를 작성하다 보면 리눅스 커널 특정 분야에 관심을 갖게 됩니다.
관심있는 분야에 대해 리눅스 커널 메일링 리스트에 등록해서 메일을 받아 보면서 메일로 전달되는 내용(커널 코드 패치 + 토론)을 보고 코드를 볼 수도 있습니다.

(개인블로그)
http://rousalome.egloos.com

gurugio의 이미지

커널을 공부하면 그래 공부열심히했구나 소리는 듣겠지만
사실 취업해서 계속 커널관련된 일을 하기가 쉽지 않습니다.
막상 커널관련된 일을 하게되더라도 진짜 커널 자체를 수정하고 기능을 추가하는 것보다는
자사에서 만든 코드를 조금씩 수정하고 테스트하는게 거의 대부분입니다.
커널 개발자들은 정말 대단하지만 그만큼 대단한 개발자들이 커널개발을 하게되더라구요.

그래도 공부할 커리큘럼이 필요하시면 이걸 참고하시는것도 방법일것 같습니다.
https://github.com/gurugio/lowlevelprogramming-university