임베디드기사 필기 08 — 임베디드 펌웨어 ③ 디바이스 드라이버 개발
임베디드기사 필기 08 — 임베디드 펌웨어 ③ 디바이스 드라이버 개발 (module_init·세마포어·뮤텍스·워치독)
2과목 ③ 디바이스 드라이버 개발 파트입니다.
세마포어 vs 뮤텍스 차이는 필기·실기 전 회차 최빈출이에요.
module_init() 조합도 반복 출제됩니다.
디바이스 드라이버 개요
디바이스 드라이버: OS와 하드웨어 장치 사이의 인터페이스
분류:
문자 드라이버(Character Driver) — 바이트 단위 순차 접근 (키보드, 시리얼)
블록 드라이버(Block Driver) — 블록 단위 임의 접근 (디스크, 플래시)
네트워크 드라이버 — 패킷 단위 전송 (이더넷)
module_init() 조합 ⭐⭐ (반복 출제!)
리눅스 커널 모듈 드라이버의 핵심 함수 조합이에요.
핵심 함수
module_init(초기화함수) // 모듈 적재 시 호출
module_exit(종료함수) // 모듈 제거 시 호출
register_chrdev(major, name, fops) // 문자 장치 등록
unregister_chrdev(major, name) // 문자 장치 해제
request_region(start, n, name) // I/O 포트 영역 할당
release_region(start, n) // I/O 포트 영역 해제
드라이버 등록 흐름
module_init()
↓
register_chrdev() — 문자 장치 번호 등록
↓
request_region() — 입출력 포트 영역 할당
↓
장치 파일 생성(mknod)
메모리 할당 함수
kmalloc(size, GFP_KERNEL)
— 연속된 물리 메모리 할당
— 크기 제한 있음 (일반적으로 128KB 이하)
— 빠름, 인터럽트 핸들러에서도 사용 가능
vmalloc(size)
— 가상 주소 공간에 메모리 할당
— 물리적으로 연속될 필요 없음
— 큰 메모리 할당에 적합
— kmalloc보다 느림
모듈 관리 명령어
insmod 드라이버.ko # 모듈 적재
rmmod 드라이버 # 모듈 제거
lsmod # 적재된 모듈 목록
mknod /dev/장치 c 주번호 부번호 # 장치 파일 생성
기출 문제
Q. 리눅스 커널 모듈에서 문자 장치를 등록하는 함수는?
A. register_chrdev()
Q. kmalloc과 vmalloc의 차이는?
A. kmalloc은 연속된 물리 메모리를 할당하고, vmalloc은 가상 주소 공간에 할당하여 물리적으로 연속될 필요가 없다.
세마포어 vs 뮤텍스 ⭐⭐⭐ (전 회차 최빈출!)
세마포어 (Semaphore)
정의: 공유 자원의 접근을 제어하는 정수값 기반 동기화 도구
특징:
값: 0 이상의 정수 (카운팅 세마포어)
용도: 여러 개의 공유 자원 관리 가능
소유권: 없음 — 다른 프로세스/스레드가 신호(Signal) 가능
이진 세마포어: 값이 0 또는 1 (뮤텍스와 유사하지만 소유권 없음)
관련 함수:
down() / wait() / P() — 세마포어 값 1 감소 (자원 획득)
up() / signal() / V() — 세마포어 값 1 증가 (자원 반환)
뮤텍스 (Mutex)
정의: 상호 배제(Mutual Exclusion)를 위한 잠금 메커니즘
특징:
값: 0 또는 1 (이진값)
용도: 단일 공유 자원의 임계 영역 보호
소유권: 있음 — 잠근 스레드만 해제 가능!
→ 세마포어의 특수한 형태
관련 함수:
mutex_lock() — 뮤텍스 잠금 (획득)
mutex_unlock() — 뮤텍스 해제
핵심 비교표
| 구분 | 세마포어 | 뮤텍스 |
| 값 | 정수 (0 이상) | 0 또는 1 |
| 용도 | 여러 공유 자원 관리 | 단일 자원 상호 배제 |
| 소유권 | 없음 | 있음 (잠근 스레드만 해제) |
| 해제 주체 | 다른 프로세스도 가능 | 잠근 스레드만 가능 |
| 관계 | 상위 개념 | 세마포어의 특수한 형태 |
기출 문제
Q. 세마포어와 뮤텍스의 가장 큰 차이점은?
A. 세마포어는 소유권 개념이 없어 다른 프로세스도 신호를 보낼 수 있지만, 뮤텍스는 소유권이 있어 잠근 스레드만이 해제할 수 있다.
Q. 뮤텍스는 세마포어와 어떤 관계인가?
A. 뮤텍스는 세마포어의 특수한 형태로, 이진 세마포어에 소유권 개념이 추가된 것이다.
시그널 (Signal) ⭐
리눅스에서 프로세스에 비동기 이벤트를 알리는 메커니즘이에요.
| 시그널 | 번호 | 의미 |
| SIGCHLD | 17 | 자식 프로세스 상태 변경 (종료·정지) |
| SIGHUP | 1 | 터미널 연결 끊김 (데몬 재시작에 활용) |
| SIGINT | 2 | 키보드 인터럽트 (Ctrl+C) |
| SIGQUIT | 3 | 키보드 종료 (Ctrl+) |
| SIGTSTP | 20 | 키보드 일시 정지 (Ctrl+Z) |
| SIGKILL | 9 | 강제 종료 (무시 불가!) |
| SIGTERM | 15 | 종료 요청 (기본 kill 시그널) |
기출 문제
Q. 자식 프로세스가 종료될 때 부모에게 보내는 시그널은?
A. SIGCHLD
Q. Ctrl+C를 눌렀을 때 프로세스에 전달되는 시그널은?
A. SIGINT
커널 타이머
init_timer(&timer) // 타이머 초기화
timer.function = 콜백함수; // 만료 시 실행할 함수
timer.expires = jiffies + 지연; // 만료 시간 설정
add_timer(&timer) // 타이머 활성화
del_timer(&timer) // 타이머 비활성화
jiffies: 리눅스 커널의 틱(tick) 카운터
HZ(초당 인터럽트 횟수) 단위로 증가
워치독 (Watchdog) ⭐
시스템 오동작을 감지하고 자동으로 재부팅하는 하드웨어·소프트웨어 기능이에요.
동작 원리:
타이머를 주기적으로 리셋(킥, Kick)해야 함
→ 일정 시간 내 리셋 안 되면 시스템 자동 재부팅
용도:
임베디드 시스템의 무한 루프, 행(Hang) 상태 감지
자동화된 복구
관련 파일:
/dev/watchdog — 워치독 장치 파일
주기적으로 쓰기(write) 해주면 타이머 리셋
커널 메모리 영역
ZONE_DMA — DMA가 직접 접근 가능한 낮은 주소 영역 (0~16MB)
ZONE_NORMAL — 일반 커널 코드가 접근하는 영역 (16MB~896MB)
ZONE_HIGHMEM — 커널 주소 공간을 초과하는 고주소 영역 (896MB 이상)
인터럽트 처리 순서 ⭐ (실기 반복!)
1. 인터럽트 요청 신호 발생
2. 현재 실행 중인 명령 완료
3. 현재 프로세서 상태 저장 (레지스터, PC 등)
4. 인터럽트 서비스 루틴(ISR) 실행
5. 이전 상태 복구 및 프로그램 재개
💡 실무에서는?
20년 인프라/보안 SI 경력에서 워치독은 네트워크 장비, 보안 어플라이언스에서 빠지지 않는 기능이에요. 방화벽이나 IPS 장비가 소프트웨어 버그로 행(Hang)에 빠졌을 때 자동으로 재부팅해서 서비스를 복구하는 게 워치독이거든요. 세마포어·뮤텍스는 멀티스레드 기반 보안 솔루션에서 공유 메모리 접근 시 반드시 사용해요. 특히 WAF, IPS 같은 패킷 처리 시스템에서 스레드 간 패킷 큐 접근에 뮤텍스를 쓰는 게 일반적이에요.
핵심 정리
✅ module_init() → register_chrdev() → request_region() 순서
✅ kmalloc=연속물리메모리 / vmalloc=가상주소(물리연속불필요)
✅ insmod=적재 / rmmod=제거 / mknod=장치파일생성
✅ 세마포어: 정수값, 소유권 없음, 여러 자원 관리
✅ 뮤텍스: 이진값, 소유권 있음(잠근 스레드만 해제), 세마포어의 특수형태
✅ SIGCHLD=자식종료 / SIGINT=Ctrl+C / SIGKILL=강제종료(무시불가)
✅ 워치독: 주기적 킥 없으면 자동 재부팅
✅ ZONE_DMA/ZONE_NORMAL/ZONE_HIGHMEM
다음 편에서는 OS·프로세스관리·스케줄링·병행성제어로 이어갑니다!
궁금한 점은 댓글로 남겨주세요!
2026.08.11 - [자격증 정복/임베디드기사(기능사)] - 임베디드기사 필기 07 — 임베디드 펌웨어 ② OS 포팅 (커널소스트리·리눅스부팅·runlevel·busybox)
임베디드기사 필기 07 — 임베디드 펌웨어 ② OS 포팅 (커널소스트리·리눅스부팅·runlevel·busybox)
임베디드기사 필기 07 — 임베디드 펌웨어 ② OS 포팅 (커널소스트리·리눅스부팅·runlevel·busybox)2과목 [2-2] OS 포팅 파트입니다.커널소스트리 디렉토리와 runlevel은 리눅스마스터 1급과 겹치는 최빈
tech.seanney.pe.kr
2026.08.10 - [자격증 정복/임베디드기사(기능사)] - 임베디드기사 필기 06 — 임베디드 펌웨어 ① 스타트업코드·부트로더·OS부트과정·전원관리
임베디드기사 필기 06 — 임베디드 펌웨어 ① 스타트업코드·부트로더·OS부트과정·전원관리
임베디드기사 필기 06 — 임베디드 펌웨어 ① 스타트업코드·부트로더·OS부트과정·전원관리2과목 [2-1] 펌웨어 파트입니다.스타트업코드 순서와 OS 부트 5단계는 실기까지 최빈출이에요.기출 검
tech.seanney.pe.kr