디바이스 드라이버 (Device Driver) - 1. 개요


  • 시스템이 지원하는 하드웨어를 응용 프로그램에서 사용할 수 있도록 커널에서 제공하는 라이브러리
  • 응용 프로그램이 하드웨어를 제어하려면 커널에 자원을 요청하고, 커널은 요청에 따라 시스템 관리
    ..

  • 디바이스 드라이버의 역할
    • 디바이스 드라이버는 하드웨어를 사용가능하게 만들어 줄 뿐 하드웨어를 어떻게 사용할지에 대한 결정은 응용 프로그램에 넘겨야 한다.
    • 디바이스 드라이버는 온갖 상황을 고려해 균형있게 작성한다.

  • 리눅스 디바이스 드라이버의 공통적 특성
    • 커널 코드
      • 디바이스 드라이버는 커널의 한 부분이므로, 커널의 다른 코드와 마찬가지로 잘못되면 시스템에 치명적인 피해를 줄 수 있다.
    • 커널 인터페이스
      • 디바이스 드라이버는 리눅스 커널이나 자신이 속한 서브시스템에 표준 인터페이스를 제공해야 한다.
    • 커널 메커니즘과 서비스
      • 디바이스 드라이버는 메모리 할당, 인터럽트 전달, wait queue와 같은 표준 커널 서비스를 사용할 수 있다.
    • Loadable
      • 대부분의 리눅스 디바이스 드라이버는 커널 모듈로서, 필요할 때 로드하고 더 이상 필요하지 않을 때 언로드 할 수 있다.
    • 설정 가능 (Configuration)
      • 리눅스 디바이스 드라이버를 커널에 포함하여 컴파일할 수 있다.
      • 어떤 장치를 넣을 것인지는 커널을 compile할 대 설정할 수 있다.


  • 디바이스 드라이버 종류
    • 문자 디바이스 드라이버
      • 임의의 길이를 갖는 문자열이나 자료의 순차성을 지닌 장치를 다루는 디바이스 드라이버
      • serial, console, keyboard, printer, mouse 등이 있다.
    • 블록 디바이스 드라이버
      • 일정 크기의 버퍼(블록 단위)를 통해 데이터를 처리하는 디바이스
      • 커널 내부의 파일시스템에서 관리하고 내부적인 버퍼가 있는 디바이스 드라이버
      • 하드 디스크, 램 디스크 등이 있다.
    • 네트워크 디바이스 드라이버
      • 네트워크 계층과 연결되어 네트워크 통신을 통해 네트워크 패킷을 송수신할 수 있는 기능을 제공
      • 이더넷, PPP 등이 있다.


리눅스 커널


운영체제란, 커널과 디바이스 드라이버, 커맨드 쉘 혹은 유저 인터페이스, 그리고 기본적인 파일들과 시스템 유틸리티를 포함한다.
     커널은 시스템의 다른 모든 부분을 위한 기본적인 서비스를 제공하고, 하드웨어를 관리하며, 시스템 자원을 나눠준다.


커널은 5개의 기능 블럭으로 구분한다.

      • 프로세스 관리
      • 메모리 관리
      • 파일 시스템 관리
      • 디바이스 관리
      • 네트워크 관리






커널 코드의 구성은 다음과 같다.


디렉토리 

내용 

 arch

 CPU 종속적인 코드

 ARM, MIPS와 같이 프로세서마다 독자적인 하위 디렉터리 존재

 crypto

 암호화 API

 Documentation

 커널 하위 시스템에 대한 간략한 설명 

 drivers

 장치 드라이버와 주변 장치 컨트롤러

 fs

 파일 시스템 구현과 관련된 코드

 include

 커널 헤더 파일

 init

 커널 시작 및 초기화 관련 코드

 ipc

 프로세스 간 통신 관련 코드 ex. 메시지 큐, 세마포어, 공유 메모리

 kernel

 스케줄러, 인터럽트 처리, 락킹 등 기본 커널에서 아키텍처 중립적인 부분이 구현

 lib

 일반적인 Hashing, CRC (Cyclic Redundancy Code) 계산 함수 같은 라이브러리 루틴

 mm

 메모리 관리 구현 코드

 net

 IPv4, IPv6, 블루투스와 같은 네트워크 프로토콜

 scripts

 커널 빌드에 사용할 스크립트

 security

 보안용 프레임워크

 sound 리눅스 오디오 하위 시스템

 usr

 초기 유저 공간 코드




사용자 영역과 커널 영역

        • 사용자 영역

          • 응용 프로그램이 동작하기 위해 사용되는 메모리 공간
            • stack 영역
               - 프로그램 시행시 지역 변수나 환경 변수와 같은 변수들이 위치
            • heap 영역
               - 동적 메모리 할당 영역
            • bss 영역
               - 초기화 되어 있지 않은 전역 변수나 정적 변수들이 저장.
               - 로더에 의해 메모리로 적재될 때 공간을 확보한 후, 0으로 초기화
            • data 영역
               - 초기화되어 있는 전역 변수들이 저장
            • text 영역
               - 프로그램 코드(함수나 일반 처리문 등)와 읽기 전용 데이터(상수)로 이루어짐

        • 커널 영역

          • 운영체제가 실행되기 위해서 필요한 메모리 공간



커널에 자원 처리를 요청하는 방법 

        • 시스템 콜 방식
          • 소프트웨어 인터럽트
          • 응용 프로그램으로 하여금 하드웨어나 다른 운영체제 리소스를 접근할 수 있게 해준다.
시스템콜에 대한 이미지 검색결과


        • 시스템 콜 핸들러

          • 유저 공간의 응용 프로그램이 직접 커널 코드를 호출하는 것은 불가능

          -> 커널은 보호된 메모리 공간에 있으므로 시스템이 커널 모드로 전환되어야 함


          • 소프트웨어 인터럽트
            • 유저공간에서 커널 모드로 진입하기 위해 exception이 발생하면 시스템은 커널 모드로 전환되어 exception handler를 실행한다.
            • 이 핸들러가 시스템 콜 핸들러가 된다.


          • 시스템 콜 핸들러 open() 수행과정
            1. test.c main()에서 open() 호출
            2. libc.a에서 open()
              시스템콜의 고유번호를 eax 레지스터에 저장
              SW 인터럽트 발생
            3. ARM에서 system_call() 명령이 저장된 vector table 참조
            4. vector_swi()에서 open() 명령의 번호를 참조하여 sys_open() 호출
            5. sys_open()은 dev_open()을 호출하면서 실제 open  명령을 수행



리눅스 부팅 과정

      1. Power on
      2. ROM-BIOS 프로그램 실행

            • BIOS (Basic Input/Output System): 메모리의 특정 번지로 자동 로드되어 실행됨
            • POST(Power On Self Test) 수행

                  • 장착된 H/W가 인식됨. (예: 시리얼 장치, 마우스 장치, 사운드 장치)
                  • H/W의 물리적인 손상체크와 초기화가 병행
            • 부팅 매체 (Disk, CD_ROM 등) 검색
            • MBR(Master Boot Record)를 읽어, 부트로더(GRUB)를 로드시킨다.
      3. GRUB  실행(부트로더 실행)

            • 부팅메뉴 선택
              • /boot/grub/grub.conf 파일
              • kernel 이미지 로드
              • swapper 프로세스 호출
      4. swapper 프로세서 (PID=0)

            • 커널 이미지 압축을 해제
            • 각 장치 드라이브들을 초기화
            • 루트( / ) 파일 시스템을 read-only로 마운트
            • 파일시스템 검사
            • 루트( / ) 파일시스템을 read-write 모드로 마운트
            • init 프로세스 (PID=1)
      5. init 프로세스 (PID=1)

            • 리눅스에서 모든 프로세스는 그 실행과 함께 설정파일을 읽어들인다.
            • init 프로세스는 /etc/inittab이라는 설정 파일을 읽어들여 무엇을, 어떻게, 언제 실행할 것인가를 결정하여 커널 서비스 시작




출처 http://cheonee.tistory.com/entry/리눅스-커널과-디바이스-드라이버

출처 http://cherub.sungkyul.edu/~web/jinboard/files/63_boot.pdf

출처 http://www.linuxlab.co.kr/docs/5-2.htm

출처 http://yongho1037.tistory.com/563

출처 http://young3276.tistory.com/4

 


+ Recent posts