리눅스 디바이스 드라이버 프로그래밍(1) - 디바이스 드라이버 개요, 디바이스 드라이버 종류
글 작성자: _rian
Device와 Device Driver
Device
- 네트워크 어댑터, LCD 디스플레이, 오디오, 터미널, 키보드, 하드디스크, 플로피디스크, 프린터 등과 같은 주변 장치들을 말함.
- 디바이스의 구동에 필요한 프로그램, 즉 디바이스 드라이버가 필수적으로 요구됨
Device Driver
- 실제 장치 부분을 추상화시켜 사용자 프로그램이 정형화된 인터페이스를 통해 디바이스를 접근할 수 있도록 해주는 프로그램
- 디바이스 관리에 필요한 정형화된 인터페이스 구현에 요구되는 함수와 자료구조의 집합체
- 표준적으로 동일 서비스 제공을 목적으로 커널의 일부분으로 내장
- 응용 프로그램이 하드웨어를 제어할 수 있도록 인터페이스 제공
- 하드웨어 독립적인 프로그램을 작성할 수 있도록 함.
리눅스 디바이스 드라이버
사용자 관점에서의 디바이스 드라이버
- 사용자는 디바이스 자체에 대한 정보를 알 필요 없음
- device는 하나의 파일로 인식됨
- 파일에 대한 첩근을 통하여 real device에 접근 가능함.
리눅스에서의 디바이스
- 리눅스에서 디바이스는 특별한 파일로 취급되고, 엑세스가 가능함. 사용자(응용 프로그램)은 file operation을 적용할 수 있다.
- 각 디바이스는 Major Number 와 Minor number를 가짐.
- Major number : 디바이스 장치 구분
- Minor number : 같은 종류의 디바이스들을 구분
디바이스 드라이버의 종류
Device Driver 종류 | 설명 | 등록 함수명 |
문자 드라이버 (char) | device를 파일처럼 접근하여 직접 read/write 수행 data 형태는 stream 방식으로 전송 (ex) console, keybord, serial port driver 등 |
register_chrdev() |
블록 드라이버 (block) | disk와 같은 file system을 기반으로 block 단위로 데이터를 read/write (ex) hard disk, CD-ROM driver, floppy disk |
register_blkdev() |
네트워크 드라이버 (network) | network의 물리계층과 frame 단위의 데이터 송수신 (ex) Ethernet device driver |
register_netdev() |
문자 디바이스 (Char Device)
문자 디바이스의 특징
- 자료의 순차성을 지닌 장치
- 버퍼 캐쉬를 사용하지 않음
- 장치의 raw data를 사용자에게 제공
- Terminal, Serial/Parallel, Keyboard, Sound Card, Scanner, Printer 등
문자 디바이스는 내가 수업시간에 사용한 것 중 가장 많이 사용한 디바이스 드라이버다.. 앞으로 관련 예제를 포스팅 할 예정이다
리눅스에서의 문자 디바이스
맨 앞 c => 파일 관련 정보 중 첫 문자인 c는 char device를 의미한다.
블록 디바이스 (Block Device)
블록 디바이스의 특징
- random access 가능
- 블록 단위의 입출력이 가능한 장치
- 버퍼 캐쉬에 의한 내부 장치 표현
- 파일 시스템에 의해 mount 되어 관리되는 장치
- 디스크, RAM Disk, CD-ROM등
마찬가지로 파일 관련 정보 중 첫 문자인 b는 block device를 의미한다.
네트워크 디바이스 (Network Device)
- 대응하는 장치파일이 없음
- 네트워크 통신을 통해 패킷을 송수신 할 수 있는 장치
- 응용프로그램과의 통신은 표준 파일 시스템 관련 호출 대신에 socket()이나 bind() 등의 시스템 호출
- Ethernet, PPP, ATM, ISDN 등이 있다
디바이스 드라이버의 Major & Minor Number
Major Number (주번호)
- 커널에서 디바이스 드라이버를 구분/연결하는데 사용
- 같은 디바이스 종류를 지칭. 1Byte (0~255 사이의 값)
Minor Number (부번호)
- 디바이스 드라이버 내에 장치를 구분하기 위해 사용
- 각 디바이스의 부가적인 정보를 나타냄. 2Byte(부번호)
- 하나의 디바이스 드라이버가 여러 개의 디바이스 제어 가능
(예) ls -al /dev/hda*
디바이스 드라이버 구조
리눅스 시스템 구조 상의 디바이스 드라이버는 아래와 같다.
위의 Kernel area 쪽을 보면 디바이스 인터페이스 위에 디바이스 드라이버들이 있다. 문자 디바이스 드라이버는 버퍼캐시를 사용하지 않기 때문에 (그래서 나중에 ioremap_nocache함수를 사용함) 실습에서 많이 사용한다.
'Computer Engineering > 임베디드 시스템' 카테고리의 다른 글
리눅스 디바이스 드라이버 프로그래밍(3) - 7segment led 예제 fpga에 적용시켜보기 (0) | 2019.06.13 |
---|---|
리눅스 디바이스 드라이버 프로그래밍(2) - 모듈 프로그래밍 (0) | 2019.06.12 |
임베디드 리눅스 커널 프로그래밍(3) - 시스템 호출 함수 구현 (0) | 2019.06.12 |
임베디드 리눅스 커널 프로그래밍(2) - 커널 데이터타입, 커널 인터페이스 함수 (0) | 2019.06.11 |
임베디드 리눅스 커널 프로그래밍(1) - application 프로그래밍과 커널프로그래밍의 차이점, 커널프로그래밍 시 주의사항 (2) | 2019.06.11 |
댓글
이 글 공유하기
다른 글
-
리눅스 디바이스 드라이버 프로그래밍(3) - 7segment led 예제 fpga에 적용시켜보기
리눅스 디바이스 드라이버 프로그래밍(3) - 7segment led 예제 fpga에 적용시켜보기
2019.06.13 -
리눅스 디바이스 드라이버 프로그래밍(2) - 모듈 프로그래밍
리눅스 디바이스 드라이버 프로그래밍(2) - 모듈 프로그래밍
2019.06.12 -
임베디드 리눅스 커널 프로그래밍(3) - 시스템 호출 함수 구현
임베디드 리눅스 커널 프로그래밍(3) - 시스템 호출 함수 구현
2019.06.12 -
임베디드 리눅스 커널 프로그래밍(2) - 커널 데이터타입, 커널 인터페이스 함수
임베디드 리눅스 커널 프로그래밍(2) - 커널 데이터타입, 커널 인터페이스 함수
2019.06.11