자격증 정복/임베디드기사(기능사)

임베디드기사 필기 08 — 임베디드 펌웨어 ③ 디바이스 드라이버 개발

올드 IT직장인 2026. 8. 12. 14:00

임베디드기사 필기 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

 

반응형