2022-05-12 리눅스_디바이스_드라이버_1

2022. 5. 12. 00:32BE/Linux

 

Device란?

네트워크 어댑터, LCD 디스플레이, 오디오, 터미널, 키보드, 하드디스크, 플로피디스크, 프린터 등과 같은 주변 장치를 뜻함.

 

디바이스의 구동을 위해서 디바이스 드라이버가 필요함.

 

Device Driver란?

실제 device를 추상화하여 사용자 프로그램이 정형화된 인터페이스를 통해 디바이스를 제어할 수 있도록 하는 프로그램.

 

디바이스 제어에 필요한 정형화된 인터페이스를 구현하기 위하여 요구되는 함수와 자료구조의 집합체.

 

응용 프로그램이 하드웨어를 제어할 수 있도록 인터페이스를 제공한다.

 

하드웨어 독립적인 프로그램을 작성할 수 있도록 함.

 

사용자는 디바이스의 물리적인 구조와 사용법을 이해하지 않아도 됨.

 

리눅스 디바이스 드라이버 프로그래밍(1) - 디바이스 드라이버 개요, 디바이스 드라이버 종류

 

리눅스 디바이스 드라이버 프로그래밍(1) - 디바이스 드라이버 개요, 디바이스 드라이버 종류

Device와 Device Driver Device 네트워크 어댑터, LCD 디스플레이, 오디오, 터미널, 키보드, 하드디스크, 플로피디스크, 프린터 등과 같은 주변 장치들을 말함. 디바이스의 구동에 필요한 프로그램, 즉 디

butter-shower.tistory.com


디바이스 드라이버를 알기 위한 운영체제의 구조 기본 지식

 

교재 : linux device drivers

 

인터넷에 pdf 형식으로 올라와 있다. 구글링 ㄱㄱ (영어에 자신 있다면!)

 

커널의 구조

 

 

컴퓨터에서 프로그램이 정상적으로 작동되기까지는 여러 계층을 거친다.

 

커널은 Application의 요청을 System Call Interface를 통해서 받아들인다.

 

우리는 System call을 통해서 운영체제에서 제공하는 기능을 사용할 수 있다.

 

kernel은 process management, memory management, filesystems, device control, networking과 관련된 기능을 제공한다.

  • Process management
  • Memory management
  • Filesystems
  • Device control
  • Networking

 

리눅스 구조를 배우는 이유

 

리눅스 구조를 이해해야지 디바이스 드라이버를 작성하는 과정을 이해할 수 있다.

  1. 어떻게 디바이스 드라이버를 작성하는가
  2. 어떻게 디바이스와 컴퓨터가 연결되는가
  3. 어떻게 디바이스 드라이버가 동작하는가

 


1. 어떻게 디바이스 드라이버를 작성하는가

 

C언어는 Unix에 필요한 프로그램을 개발하기 위해서 만들었다.

 

운영체제를 다양한 하드웨어 환경에서 동작시키기 워해서는 기기 의존적인 어셈블리어를 사용을 최소화할 필요가 있었다.

 

그렇기에 cpu에 의존적인 어셈블리어를 최소화하고 Unix와 Linux의 많은 부분은 C언어로 작성되어있다.

 

C언어로 작성된 부분은 하드웨어가 변경되어도 어셈블리어를 변경하고 컴파일만 새로 하면 이식이 가능했기 때문이다.

 

구조도에서 보이는 Arch-dependent code가 기기 의존적 코드를 나타내고 대부분이 어셈블리어다.

 


2. 어떻게 디바이스와 컴퓨터를 연결하는가

 

모든 디바이스는 VFS(virtual File System)을 통해서 파일로 인식되고, 접근할 수 있다.

 

 

출처 : https://butter-shower.tistory.com/29

 

Driver와 VFS을 거친 Device는 파일로서 접근할 수 있다.

 

VFS은 특정 File system을 사용할 수 있게 환경을 조성한다...

 

위키백과에서 검색하여 찾아 보충하자면 ...

 

가상 파일 시스템(Virtual File System, 줄여서 VFS)은 실제 파일 시스템 위의 추상 계층이다.

 

VFS의 목적은 클라이언트 응용 프로그램이 여러 파일 시스템에 같은 방법으로 접근할 수 있게 하는 것이다.

 

이를테면 VFS를 사용하면 클라이언트 응용 프로그램은 로컬인 기억 장치에도 네트워크 위의 기억 장치에 직접적으로 접근할 수 있기 때문에 로컬과 네트워크의 차이를 느끼지 못한다.

 

또, 마이크로소프트 윈도, 맥 오에스, 유닉스 운영 체제의 차이를 넘어 파일 시스템의 차이를 느끼는 일 없이 접근할 수 있다.

 

VFS는 커널과 실제 파일 시스템과의 인터페이스나 규격을 정의하고 있다.

 

그러므로 그 규격에 따라 간단히 새로운 파일 시스템을 커널에 추가할 수 있다.

 

파일 시스템은 새로운 공개 버전과의 호환성을 위해 수정하거나 다시 컴파일해야 할 수도 있다.

 

아니면 운영 체제에서 규격 변경에 대해 하위 호환 모드로 동작한다면 각 파일 시스템은 새로운 버전의 운영 체제에서도 그대로 사용할 수 있다.

 

출처: https://ko.wikipedia.org/wiki/가상_파일_시스템


3. 어떻게 디바이스 드라이버를 동작

 

하드웨어 장치들을 구동하는 것이 드라이버의 궁극적인 역할이다.

 

디바이스 드라이버를 작성할 때 memory를 이해해야 하는 이유가 있다.

 

Filesystems의 의해서 인식되고 접근 가능해진 디바이스를 제어하기 위해서 드라이버가 필요하다.

 

이 디바이스 드라이버는 컴퓨터에서 memory를 할당받아서 동작하기 때문이다.

 

Cpu와 디바이스 사이에 드라이버가 할당받은 memory가 위치한다고 생각하면 된다.

 

그렇기에 우리는 컴퓨터가 프로세스에 필요한 memory를 할당하고, 프로세스를 제어하는 과정을 이해할 필요가 있다.

 

virtual memory의 개념

 

구조도를 살펴보면 virtual memory라는 개념이 memory management에 사용되는 것을 알 수 있다.

 

Virtual memory는 메모리 관리 기법의 하나다.

 

기계에 실제로 이용 가능한 기억 자원을 이상적으로 추상화하여 사용자들에게 매우 큰 메모리로 보이게 만드는 것을 말한다.

 

각 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 주는 방식이다.

 

이러한 방식은 멀티태스킹 운영 체제에서 흔히 사용되며, 실제 주기억장치보다 큰 메모리 영역을 제공하는 방법으로도 사용된다.

 

가상적으로 주어진 주소를 가상 주소(virtual address) 또는 논리 주소(logical address)라고 하며, 실제 메모리 상에서 유효한 주소를 물리 주소(physical address) 또는 실주소(real address)라고 한다.

 

가상 주소 공간은 Memory Management Unit(MMU)에 의해서 물리 주소로 변환된다. (보관은 프로세스 별로 process control block(줄여서 PCB)에 보관된다.)

 

이 덕분에 프로그래머는 가상 주소 공간상에서 프로그램을 짜게 되어 프로그램이나 데이터가 주메모리상에 어떻게 존재하는지를 의식할 필요가 없어진다

 

출처 : https://ko.wikipedia.org/wiki/가상_메모리


드라이버의 종류

  • block drivers : 버퍼를 사용하는 블록단위의 데이터를 다루는 디바이스 드라이버.
  • char drivers : 버퍼가 사용 없이 데이터를 다루는 디바이스 드라이버.
  • network (IF) drivers : network의 물리계층과 frame 단위의 데이터 송수신.

 

block drivers는 주로 하드디스크, CD 등과 관련 있다.

 

char drivers는 콘솔, 키보드, 마우스, 사운드카드, 시리얼 포트 등과 관련 있다.

 

network drivers는 네트워크 어뎁터와 관련 있다.

 

 

다시 한번 구조도 보면서 각각의 드라이브에 연결된 것들에 관하여 설명해보겠다.

 

Block devices는 disks와 CDs에 연결되어있다.

 

또 버퍼 캐시를 사용하여 데이터를 블록 단위로 모아서 읽고 쓰기 때문에 char device와 비교해 file system이 관여하는 바가 더 크다.

 

char devices는 키보드나 직렬 통신, 마우스, 모니터 등등과 연결되어있다.

 

이들은 버퍼를 거치지 않고 읽고 쓰기 때문에 block devices에 비해서 즉각적인 입출력에 유리하다.

 

IF drivers 혹은 network drivers는 network interface에 연결되어 있다는 것을 알 수 있다.

 

이 모두는 VFS를 거쳐서 하나의 파일로서 접근할 수 있게 된다.