-
커널(kernel)이란? 시스템의 지배자, 리눅스 커널(Kernel)의 모든 것임베디드 개발 환경 이야기 2025. 9. 15. 14:10
지난 포스팅에서는 하드웨어와 OS를 연결하는 '만능 통역사' BSP에 대해 알아보았습니다.
BSP라는 튼튼한 기초 공사 덕분에, 드디어 운영체제의 핵심인 커널(Kernel)이 하드웨어를 완벽하게 제어할 준비를 마쳤습니다.오늘은 바로 그 주인공, 시스템의 절대 권력자이자 보이지 않는 지휘자인 리눅스 커널에 대해 공부해보고자 합니다.
커널이 대체 무슨 일을 하길래 그렇게 중요하다고 하는 걸까요?
Part 1. 커널이란 무엇인가? - 시스템의 정부(Government)
커널(Kernel)은 운영체제(OS)의 가장 핵심적인 부분으로, 시스템의 모든 것을 총괄하고 제어하는 주체입니다.
컴퓨터의 모든 하드웨어 자원(CPU, 메모리, 저장장치 등)과 소프트웨어 자원을 관리하며, 이들 사이의 상호작용을 조율합니다.가장 완벽한 비유는 바로 '하나의 국가와 정부' 입니다.
비유로 이해하는 커널의 역할
- 하드웨어 (CPU, 메모리, 디스크): 국가의 영토, 자원, 인프라
- 응용 프로그램 (내비게이션, 미디어 앱): 국가에서 살아가는 국민
- 커널: 국가 시스템을 총괄하는 정부
국민(앱)이 토지(디스크)를 사용하거나 도로(네트워크)를 이용하려면, 반드시 정부(커널)의 허가를 받고 정해진 절차를 따라야 합니다. 만약 국민들이 마음대로 자원을 사용한다면 국가는 대혼란에 빠지게 될 것입니다.
커널은 이러한 혼란을 막고, 한정된 자원을 모든 앱에게 공정하고 효율적으로 배분하는 역할을 수행합니다.즉, 커널은 하드웨어와 소프트웨어 사이의 궁극적인 중재자입니다. 우리가 만드는 모든 프로그램은 커널이 마련해준 환경 위에서만 동작할 수 있습니다.
Part 2. 정부(커널)의 핵심 4대 임무
이 유능한 정부는 구체적으로 어떤 일을 할까요? 커널의 수많은 기능 중, 가장 핵심적인 4가지 임무를 알아보겠습니다.
1. 프로세스 관리 (Process Management) - 멀티태스킹 지휘자
- 임무: CPU라는 한정된 자원을 여러 프로세스(실행 중인 프로그램)에게 공평하게 나눠주는 일.
- 설명: AVN 시스템에서는 내비게이션, 음악 재생, 차량 상태 표시 등 수많은 프로그램이 동시에 실행되는 것처럼 보입니다.
하지만 대부분의 시스템에서 CPU 코어의 개수는 한정되어 있죠. 커널의 스케줄러(Scheduler)는 아주 짧은 시간(밀리초 단위) 동안 여러 프로세스에 CPU 사용 시간을 번갈아 할당합니다.
이 전환(Context Switching)이 매우 빠르기 때문에 우리는 모든 프로그램이 동시에 실행되는 것처럼 느끼는 것입니다. - 비유: 혼자서 여러 요리(프로세스)를 동시에 하는 셰프(CPU).
커널은 헤드 셰프가 되어 "지금은 찌개를 100ms 끓이고, 다음 50ms는 채소를 썰어!" 라고 지시하며 모든 요리가 타지 않고 완성되도록 지휘합니다.
2. 메모리 관리 (Memory Management) - 자원 할당 전문가
- 임무: 시스템의 RAM(메모리)을 각 프로세스에 할당하고, 서로 다른 프로세스가 남의 메모리 영역을 침범하지 못하도록 보호하는 일.
- 설명: 내비게이션 앱이 음악 앱의 메모리 영역을 마음대로 수정할 수 있다면 어떻게 될까요? 시
스템은 곧바로 멈추거나 오작동할 것입니다.
커널은 가상 메모리(Virtual Memory) 라는 기법을 사용해 각 프로세스에게 독립된 자신만의 메모리 공간을 가진 것처럼 속여줍니다.
이를 통해 프로세스 간의 완벽한 격리를 보장하고, 시스템의 안정성을 확보합니다. - 비유: 도서관 사서(커널). 각 이용자(프로세스)에게 개인 열람실(가상 메모리 공간)을 배정해주고, 다른 사람의 열람실에 들어가지 못하도록 철저히 감시합니다.
3. 파일 시스템 (File System) - 데이터 관리의 달인
- 임무: 저장장치(eMMC, SD카드 등)에 있는 데이터를 파일과 디렉터리 형태로 체계적으로 관리하고 접근할 수 있도록 하는 일.
- 설명: 우리가
/home/user/music.mp3라는 경로를 사용해 파일에 접근할 수 있는 것은 커널의 파일 시스템 덕분입니다.
커널은 이런 논리적인 경로를 저장장치의 실제 물리적인 주소(몇 번째 섹터, 몇 번째 블록)로 변환해 데이터를 읽고 씁니다.
특히 리눅스 커널은 VFS(Virtual File System)라는 추상화 계층을 두어, ext4, FAT32 등 어떤 종류의 파일 시스템이든 동일한 방식으로 접근할 수 있게 해줍니다. - 비유: 거대한 자료 보관소의 관리인(커널).
우리가 '2025년 9월 AVN 개발 보고서'라는 이름표(파일명)만 알려주면, 관리인은 A-3번 캐비닛의 두 번째 서랍(물리적 주소)에서 정확히 해당 문서를 찾아다 줍니다.
4. 장치 제어 (Device Control) - 하드웨어 총괄 책임자
- 임무: 시스템에 연결된 모든 하드웨어 장치(디스플레이, 사운드 칩, 터치스크린 등)를 제어하고 관리하는 일.
- 설명: 응용 프로그램이 사운드 칩을 직접 제어하는 것은 매우 위험하고 복잡합니다.
대신 프로그램은 "이 음악을 재생해줘" 라는 요청을 커널에 보냅니다.
그러면 커널은 해당 사운드 칩의 디바이스 드라이버(Device Driver)를 통해 하드웨어에 명령을 전달합니다.
(디바이스 드라이버는 BSP의 핵심 구성요소였죠!) 이처럼 모든 하드웨어 제어는 반드시 커널을 통해 이루어집니다. - 비유: 회사의 모든 비품(하드웨어)을 총괄하는 관리팀장(커널). 직원이 프린터(하드웨어)를 사용하려면 관리팀에 요청해야지, 직접 프린터를 분해하고 조작하지는 않는 것과 같습니다.
Part 3. 유저 공간 vs 커널 공간 (넘을 수 없는 벽)
커널의 역할을 이해했다면, 반드시 알아야 할 중요한 개념이 바로 '유저 공간(User Space)'과 '커널 공간(Kernel Space)'의 분리입니다.
- 유저 공간 (User Space): 우리가 만든 일반적인 응용 프로그램(내비게이션, 미디어 앱 등)이 실행되는 영역입니다.
이 공간에서 실행되는 프로그램은 하드웨어나 메모리에 직접 접근할 권한이 없습니다. - 커널 공간 (Kernel Space): 커널 코드가 실행되는 영역입니다. 모든 하드웨어와 시스템 자원에 대한 직접적인 제어 권한을 가집니다.
왜 이 둘을 분리할까요? 바로 '안정성' 때문입니다.
만약 내비게이션 앱에 버그가 있어서 죽더라도, 유저 공간에 있기 때문에 앱만 종료될 뿐 시스템 전체(커널)는 멀쩡히 돌아갑니다.
하지만 만약 모든 프로그램이 커널 공간에서 실행된다면, 작은 앱 하나가 시스템 전체를 멈추게(Kernel Panic) 할 수 있습니다.그럼 유저 공간의 앱은 어떻게 커널의 기능을 사용하나요?
바로 '시스템 콜 (System Call)'이라는 유일한 통로를 통해서만 가능합니다.
유저 공간의 앱이 파일 읽기, 네트워크 통신 등 커널의 도움이 필요한 작업을 하려면, 커널에 정식으로 요청(System Call)을 보내야 합니다.
이것은 마치 민원인(앱)이 정부(커널)의 서비스를 이용하기 위해 정해진 민원 창구(System Call Interface)를 통해서만 요청서를 제출하는 것과 같습니다.[ 유저 공간 (User Space) ] [ 커널 공간 (Kernel Space) ]
+------------------------------------+ +--------------------------------------+
| | | |
| +-------------+ +-------------+ | System Call | +--------------------------------+ |
| | 내비게이션 App | | 미디어 App | ==========> | | 파일 시스템 / 스케줄러 / ... | |
| +-------------+ +-------------+ | Interface | +--------------------------------+ |
| | | | |
| | | V |
+------------------------------------+ | +--------------------------------+ |
| | 디바이스 드라이버 | |
| +--------------------------------+ |
+-----------------|--------------------+
V
[ 하드웨어 (Hardware) ]
정리하며: 임베디드 개발자에게 커널이란?
지금까지 커널의 역할과 구조에 대해 알아보았습니다.
정리하자면 커널은 프로세스, 메모리, 파일, 장치를 관리하는 시스템의 핵심 통제 센터입니다.그렇다면 우리 같은 임베디드 SW 개발자, 특히 '성능과 안정성'을 다루는 개발자에게 커널은 어떤 의미일까요?
- 커널은 블랙박스가 아닌 우리의 주된 '작업 공간'입니다.
우리는 커널 코드를 직접 수정하고(Kernel Hacking), 우리 보드에 맞게 설정(Kernel Configuration)하며, 특정 하드웨어를 위한 디바이스 드라이버를 개발하고 디버깅하는 일을 합니다. - 성능의 한계를 결정하는 곳:
시스템의 반응 속도를 높이기 위해 커널 스케줄러의 동작 방식을 분석하고,perf,ftrace같은 커널 프로파일링 도구를 사용해 시스템의 병목 지점을 찾아냅니다. - 안정성의 최후의 보루:
원인 모를 시스템 멈춤 현상(Kernel Panic)의 원인을dmesg로그와 크래시 덤프를 통해 분석하고, 드라이버의 잠재적인 버그를 찾아내 수정하는 것이 우리의 중요한 임무입니다.
이제 커널이 단순한 운영체제의 일부가 아니라, 우리의 성능과 안정성 목표를 달성하기 위한 가장 중요하고 강력한 도구라는 사실을 알게 되었습니다.
다음 포스팅에서는 이 커널 위에서 시스템의 서비스들을 책임지는
init시스템과systemd에 대해 알아보겠습니다.'임베디드 개발 환경 이야기' 카테고리의 다른 글
systemd 완벽 정복 : 유닛(Unit)부터 systemctl 명령어까지 (0) 2025.09.15 모든 프로세스의 시작점, init system 과 systemd란? (0) 2025.09.15 BSP란? 임베디드 시스템의 통역사 BSP 파헤치기 (0) 2025.09.15 임베디드 시스템이란? & 리눅스 부팅 시퀀스 (부트로더 -> 커널 -> init) (0) 2025.09.15 [리눅스 기초] Makefile이란? 똑똑한 빌드 자동화 (0) 2025.09.12