ARM Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

200239
1625
172597


[리눅스커널] 리눅스소개: 리눅스와 리눅스커널은 왜 배워야 할까? 1. 리눅스 소개와 전망

리눅스와 리눅스 커널은 왜 배워야 할까

리눅스 세미나에서 다음과 같은 질문을 종종 받곤 합니다.

    리눅스를 배워야 하는 이유가 무엇인가요?

이 질문은 특히 리눅스를 처음 접하는 분들이 많이 던지는 질문이었습니다. 이런 질문을 받고는 리눅스를 과연 왜 배워야 할까, 곰곰이 생각해봤습니다. 여러 생각 끝에 내린 다음과 같은 결론을 내리게 됐습니다.

    소프트웨어 개발을 하려고 한다면 리눅스를 반드시 알아야 한다.

그래서 이번 절에서는 먼저 리눅스를 왜 배워야 하는지 설명하겠습니다. 

리눅스는 왜 배워야 할까?  

최근 IT 직무 기술로 리눅스가 채택되어 IT 아카데미에서 ‘리눅스’를 교육 과정으로 운영하는 곳이 많습니다. 대학교 학부 과정에서도 리눅스 시스템 프로그래밍을 배울 수 있습니다. 또한 대학원 프로젝트 과제도 리눅스 환경에서 수행되는 경우가 많습니다. 이처럼 리눅스는 정규 교육 과정으로 자리를 잡아 가는 듯합니다. 그런데 여러분은 리눅스를 왜 배워야 하는지 생각해본 적이 있나요? 그리 많지는 않을 텐데, 리눅스를 배우는 이유는 크게 다음과 같습니다.

첫째, 리눅스는 IT 산업 전반에서 쓰는 운영체제입니다. 휴대폰, 클라우드 서버, 네트워크 장비는 물론 전기자동차와 IoT 디바이스까지 리눅스를 채택하고 있습니다.

둘째, 네트워크, 브라우저, WAS 웹 애플리케이션, 보안 유틸리티 등 수많은 프로그램이 리눅스 기반 환경에서 동작합니다. 여러분이 리눅스를 알고 싶지 않고 리눅스 사용법을 알고 싶지 않을 수 있더라도 다양한 프로그램을 실행하고 운영하기 위해서는 리눅스를 알아야 합니다.

셋째, 리눅스는 오픈소스 기반 운영체제입니다. 리눅스는 하드웨어를 제어하는 리눅스 커널과 그 위에서 실행되는 리눅스 유틸리티로 구성돼 있습니다. 그런데 리눅스 커널은 물론이고 대부분 리눅스에서 실행되는 프로그램의 소스코드는 공개돼 있습니다.

구체적으로 다음과 같은 기술들이 리눅스 시스템 프로그램이나 리눅스 디바이스 드라이버에 구현돼 있고,
운영체제 핵심 기능
네트워크 패킷 통신
메모리 시스템
파일 시스템과 SD 카드
각종 보안 기술
각종 센서 드라이버
CPU 아키텍처(ARM, x86): 익셉션, 인터럽트, 메모리 관리

소스코드가 공개돼 있어서 소스코드를 분석함으로써 세부 동작 원리를 파악할 수 있습니다.
리눅스 커널은 왜 배워야 할까?  

누군가가 ‘프로그래머로 일하려면 리눅스를 배워야 한다’라고 말한다면 대부분 수긍할 것입니다. 하지만 ‘리눅스 커널도 배워야 한다’라고 주장한다면 바로 납득하기는 어려울 것입니다. 이번에는 ‘리눅스 커널을 배워야 하는 이유’에 대해 이야기해보려고 합니다.
 
이 책의 주제가 리눅스 커널이긴 하지만 필자는 솔직히 말씀드리고 싶습니다.

    반드시 리눅스 커널을 배울 필요는 없습니다.

임베디드 리눅스나 리눅스 시스템을 개발할 때 ‘커널 소스’를 읽지 않고도 ‘리눅스 명령어’를 입력하고 ‘커널 로그’를 읽으면서 개발할 수도 있습니다. 커널에 대한 깊이 있는 지식 없이도 개발자로서의 경력을 유지할 수도 있습니다.

하지만 필자는 다음과 같이 말씀드리고 싶습니다.

    리눅스 고급 개발자 또는 엔지니어로 실력을 인정받고 오랫동안 리눅스 개발을 하고 
    싶다면 리눅스 커널은 반드시 배워야 합니다.

그럼 ‘리눅스 커널’을 배워야 하는 이유를 더 자세히 알아보겠습니다.

첫째, 임베디드 리눅스 혹은 BSP(Board Support Package) 개발자로 디바이스 드라이버 개발을 맡고 있다면 리눅스 커널을 잘 알아야 합니다. 그 이유는 간단합니다.

    디바이스 드라이버는 커널 함수를 호출하는 방식으로 구현돼 있기 때문입니다.

C 프로그래밍을 잘 하려면 strcpy , strcmp , printf 같은 라이브러리 함수의 용법을 잘 알아야 하듯이 디바이스 드라이버 개발을 잘 하려면 커널이 제공하는 함수의 동작 원리를 파악하고 있어야 합니다. 그래서 임베디드 리눅스 혹은 BSP 벤더에서는 ‘리눅스 커널’을 직무 교육 과정으로 운영하는 경우가 많습니다.

둘째, 고급 리눅스 시스템 프로그래머가 되려면 리눅스 커널을 알아야 합니다.

리눅스 시스템 프로그램은 다음과 같은 함수로 구성돼 있습니다.

open(), read(), write(), close(): 파일 처리 관련 함수
fork(), getpid(), exit(): 프로세스 처리 관련 함수
sigaction(), pause(): 시그널 처리 관련 함수

이러한 함수를 호출하면 리눅스 라이브러리 함수가 이를 처리할 것이라 생각할 수 있습니다. 하지만 실제로는 리눅스 라이브러리의 도움으로 POSIX 시스템 콜을 호출해 커널이 동작합니다. 한 가지 예를 들어볼까요?

리눅스 시스템 프로그램으로 open() , read() , write() 함수를 호출했는데 함수에서 에러를 반환했습니다. 에러 코드를 반환한 주인공은 누구일까요? 리눅스 라이브러리일까요? 그 주인공은 바로 커널입니다. 여기에는 그럴만한 이유가 있습니다. 리눅스 시스템 프로그램을 실행하는 주체는 커널이기 때문입니다. 따라서 커널을 배우면 리눅스 시스템 프로그램의 세부 동작 원리를 알 수 있습니다.

셋째, 운영체제의 핵심 원리를 소스코드 분석으로 배울 수 있습니다. 리눅스 커널은 오픈소스 프로젝트 이므로 다음과 같은 커널의 핵심 구현 원리를 소스코드 분석을 통해 배울 수 있습니다.

CPU 아키텍처(ARM, x86): 익셉션, 인터럽트, 메모리 관리
스케줄링
시스템 콜
시그널
가상 파일시스템
메모리 관리

우리가 새로운 소프트웨어 기술을 배우는 과정은 크게 두 가지로 생각해볼 수 있습니다.

우선 프로그램을 사용해 본다.
코드를 작성하거나 소스코드를 분석해본다.

프로그램을 사용해 본 후 소스코드를 분석해서 구현 방식을 파악하면 더 많은 것을 배울 수 있습니다. 마찬가지로 커널도 이 방식으로 배울 수 있습니다. 즉, 커널 디버깅을 통해 ‘커널을 사용’해보고 커널 소스를 작성하면서 분석할 수 있습니다. 운영체제 커널을 이론만으로 공부하는 방법보다 더 빨리 실력이 늘 것 같지 않나요?

넷째, IT 산업을 이루는 제반 기술의 세부 구현 방식을 알 수 있습니다. 파일 시스템, 메모리 관리, 네트 워크, 이더넷 등의 기술들은 커널에서 소스코드로 만날 수 있습니다.

지금까지 설명한 ‘리눅스 커널을 배워야 하는 이유’를 한 문장으로 정리하면 다음과 같습니다.

    고급 리눅스 개발자가 되려면 커널을 배워야 한다.



"혹시 궁금점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답글 올려드리겠습니다!"






# Reference: 리눅스 커널

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 1

디버깅을 통해 배우는 리눅스 커널의 구조와 원리. 2




핑백

덧글

  • brw 2019/11/21 13:37 # 삭제 답글

    잘보고갑니다.
  • AustinKim 2019/11/23 18:29 #

    자주 오셔서 유용한 정보 얻어 가셨으면 좋겠습니다. 감사합니다.
댓글 입력 영역