디바이스 드라이버 소개
* 사용자 App이 하드웨어와 직접 통신하지 못하는 이유
특수 명령을 실행하고 인터럽트를 처리하기 위한 권한을 제한적으로 상속 받았기 때문.
* 디바이스 드라이버의 역할
애플리케이션과 커널에 하드웨어 접근&사용 인터페이스를 제공.
* PC 호환 시스템의 하드웨어 블록 다이어그램
- North Bridge, South Bridge로 통하는 모든 장비들을 특정한 운영체제에서 사용하려면, 그에 맞는 디바이스 드라이버 구현이 필요.
North Bridge는 IO 속도가 빠른 장비들을 연결해야 하며, South Bridge는 속도가 비교적 느려도 되는 장비들을 연결.
PC 호환 시스템의 하드웨어 블록 다이어그램
* 인터럽트 처리
프로세서와 IO 디바이스의 속도가 일치하지 않기 때문에 하드웨어 시그널을 비동기적으로 처리하는 '인터럽트' 매커니즘이 존재. 커널은 인터럽트 처리가 필요한 디바이스마다 IRQ(Interrupt Request) 번호를 할당. 프로세서는 ISR(Interrupt Service Routine)을 통해 인터럽트 처리
* 리눅스에서의 디바이스
리눅스에서는 모든 디바이스를 '파일'로 취급하며, Virtual File System(VFS)를 두어 추상화하여 접근함.
- 파일 종류 예시) /dev 디렉토리 밑에 있는 파일들
tty(teletypewriter; 모니터, 키보드 등의 문자 디바이스), sda or hda(디스크 등의 블록 디바이스) 등이 있음.
- 코딩 예시) 문자 디바이스로부터 file descriptor을 얻어오는 코드
fd = open( "/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK );
* 디바이스 드라이버 공통 메소드
모든 디바이스 드라이버를 구현할 땐 필수적으로 구현해야 하는 메소드들이 있음.
1) init() : 드라이버 초기화 및 커널에 등록
- 디바이스의 주 번호 할당 요청
- 디바이스별 구조체를 위한 메모리 할당
2) open(), release() : App이 디바이스를 열거나 해제할 때 호출
3) read(), write() : App과 디바이스 사이에서 자료 교환할 때 사용
4) ioctl() : read & write 만으로 구현하기 힘든, 커스터 마이징이 필요한 기능을 구현할 때 사용
참고한 웹사이트 및 출처 -
http://forum.falinux.com/zbxe/index.php?document_srl=406200&mid=device_driver
http://www.embeddedlinux.org.cn/
'Linux' 카테고리의 다른 글
Ubuntu 14.04 환경 변수 설정 (0) | 2016.11.08 |
---|---|
rcp로 local에서 remote 파일 전송 (0) | 2016.10.10 |