연락처 정보

코스 개요

소개

  • GNU/리눅스의 간단한 역사
  • 라이선싱
  • 커널 버전 관리
  • 릴리스 주기
  • 커널 트리는(Kernel Trees)
  • 메인라인(Mainline)
  • 커널 vs. 유저스페이스
  • 메커니즘 vs. 정책
  • 커널 드라이버 대안
  • RTOS vs. 리눅스

메모리 관리

  • 가상 메모리 vs. 물리 메모리
  • 커널에서의 메모리 할당
  • 페이지(Page)
  • 존(Zone)
  • API
  • 슬랩(Slab)

커널 패치

  • 수명 주기
  • git
  • 커널 소스
  • 패치 생성
  • 패치 검사
  • 패치 수정
  • 패치 배포
  • 감사가 완료된 코드(Audited Code)

커널 모듈

  • 커널 소스 가져오기
  • 구성/빌드/설치
  • 장치 드라이버 (정적 링크, 런타임 로딩)
  • 초기화/종료
  • 라이선싱
  • EXPORT_SYMBOL GPL
  • 아웃 오브 트리는(Out of Tree) Makefile
  • module-init-tools
  • 커널 트리 내의 모듈
  • Kconfig
  • 매개변수 전달
  • Sparse

캐릭터 드라이버(Char Drivers)

  • 아키텍처
  • 유저/커널 인터페이스
  • I/O 서브시스템
  • VFS
  • sysfs (디바이스, 버스, 드라이버, 클래스),
  • kobject/ktype/kset
  • 리눅스 커널 드라이버 모델
  • 장치 파일
  • 캐릭터 드라이버

    • 초기화
    • 등록
    • 오픈, 리리즈
    • cdev, cdev_add, cdev_del, ...
    • 메이저/마이너 넘버
    • udev, udevmonitor, udevadm

고급 캐릭터 드라이버 작업

  • ioctl
  • unlocked ioctl
  • compat ioctl
  • 유저스페이스 API
  • 커널스페이스 API
  • 프로세스 수명 주기
  • 대기/블로킹
  • 대기/각성
  • 대기 큐(Wait Queue)
  • 번떼리드 허드(Thundering Herd)
  • poll/select

커널 디버깅

  • 디버깅
  • 커널 디버깅

    • git를 이용한 이진 탐색(Binary Search)
    • 커널의 디버깅 지원 기능
    • printk, syslogd, klogd, 로그 레벨, 레이트 리미트, 디버그 레벨, 선택적 서브시스템 디버깅
    • debugfs 쿼리를 통한 디버깅
    • Oops 디버깅, Oops 발생시키기
    • 매직 SysRq 키
    • kgdb/kdb
    • JTAG

트레이싱(Tracing)

  • gcov
  • lcov
  • oprofile
  • ftrace

    • nop tracer
    • function tracer
    • sched switch tracer
    • function graph tracer
    • dynamic tracer
  • trace-cmd/kernelshark
  • perf
  • LTTng

인터럽트(Interrupts)

  • 인터럽트 vs. 폴링(Polling)
  • 인터럽트
  • 프로그램 섹션
  • 재진입성(Reentrancy)
  • 이벤트
  • 인터럽트 핸들러
  • 공유 인터럽트 핸들러
  • 인터럽트 흐름
  • 인터럽트 제어

작업 지연(Deferring Work)

  • 상부/하부 절반(Top/Bottom Halves)
  • softirq
  • tasklet
  • 작업 큐(Work Queues)
  • 스레드형 인터럽트(Threaded Interrupts)

동시성(Concurrency)

  • 임계 영역/섹션
  • 원자성(Atomic)
  • 래스 컨디션(Race Condition)
  • 동기화
  • 락(Locking)
  • 락 솔루션
  • 데드락(Deadlock)
  • 컨테션(Contention)
  • 무엇을 잠가야 할까?
  • 무엇을 사용할 수 있을까?

    • 원자 연산(Atomic Operations)
    • 스핀 잠금(Spin Locks)
    • 리더-라이터 스핀 잠금
    • 세마포어(Semaphore)
    • 바이너리 세마포어
    • 뮤텍스(Mutex)
    • 리더-라이터 세마포어
    • 완료 변수(Completion Variables)
    • 시퀀셜 잠금(Sequential Locks)
    • 프리에뎁션(Preemption) 비활성화
    • 순서 지정 및 장벽(Ordering and Barriers)

시간(Time)

  • HZ
  • Jiffies
  • 대/소 지연
  • 커널 타이머

하드웨어 I/O

  • I/O 포트
  • I/O 메모리
  • 레지스터에 접근할 때 부수 효과(Side Effects)를 어떻게 처리할까?

유저-커널 통신

  • put(get)_user()
  • copy to(from)_user()
  • 커널 I/O
  • 메모리 매핑
  • procfs
  • sysfs
  • debugfs
  • relayfs
  • netlink
  • ioctl

이식성(Portability)

  • 워드 사이즈
  • 불투형 타입(Opaque Types)
  • 부호 있는/없는 문자
  • 데이터 정렬
  • 정수 승격(Integral Promotion)
  • 코드 재사용
  • 엔디anness
  • 시스템 틱(System Tick)
  • 페이지 크기
  • 명령어 순서
  • SMP/프리에뎁션/하이 메모리

별도로 명시되지 않는 한, 이 콘텐츠와 과정 구성표는 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제(CCBY-NC-SA 4.0).에 따라 라이선스되었습니다.

요건

  • GNU/리눅스 시스템을 일반 사용자로서 사용하는 데 대한 기본 지식
  • 명령줄 쉘 사용에 대한 기본 지식
  • 유저스페이스(애플리케이션) 개발에 대한 기본 지식
  • C 프로그래밍 중급 지식
  • 이전에 임베디드 GNU/리눅스 시스템 아키텍처 과정을 수강했거나(강력히 권장), 해당 과정에서 다루는 주제에 대해 잘 이해하고 있어야 합니다.
 35 시간

참가자 수


참가자별 가격

회원 평가 (3)

예정된 코스

관련 카테고리