* 리눅스 디바이스 드라이버


 리눅스 디바이스 드라이버는 리눅스 커널의 일부분으로 포함되어 컴퓨터나 임베디드 시스템의 하드웨어를 제어하는 기능 및 이에 대한 인터페이스를 제공한다.

임베디드 시스템에서 주변장치를 제어하고자 하는 응용프로그램은 리눅스 디바이스 드라이버가 제공하는 인터페이스를 통하여 해당 장치를 제어할 수 있다. 


 리눅스 디바이스 드라이버는 리눅스 커널 자체에서 이미 지원하는 것도 있고 임베디드 시스템 개발 과정에서 개발자가 직접 작성해야 하는 경우도 있다. 


- 문자 디바이스 


 문자 디바이스는 바이트 단위로 동작하며 파일처럼 바이트 스트림으로 읽거나 쓸 수 있는 디바이스이며, 블록 디바이스는 블록 단위로 동작하며 하드디스크처럼 내부에 파일시스템을 가질 수 있는 디바이스이다. 


- 블록 디바이스 


 블록 디바이스는 하드디스크나 USB 메모리 처럼 내부에 파일시스템을 가질 수 있는 디바이스다


* 문자 디바이스 드라이버


 디바이스 드라이버도 디바이스 종류와 마찬가지로 문자 디바이스 드라이버, 블록 디바이스 드라이버 및 네트워크 디바이스 드라이버로 분류할 수 있다.. 임베디드 시스템 개발 시 가장 많이 사용하는 문자 디바이스 드라이버의 작성 시에는 응용 프로그램에서 이 디바이스를 사용할 수 있도록 하기 위해 open(), close(), read(), write(), ioctl() 같은 시스템 호출 함수들을 구현해야 한다. 



* 리눅스 커널 모듈 


 리눅스 시스템에서 디바이스 드라이버는 커널 모듈 형태로 만들어진다. 커널 모듈은 커널의 재컴파일 및 설치가 필요 없이 동적으로 리눅스 커널에 모듈 형태로 커널 기능의 추가나 제거를 가능하게 해준다. 따라서 리눅스 부팅 이후 커널이 실행중인 동안에도 필요 시에 커널에 기능을 추가할 수 있다.


커널 모듈 코드에는 init-module() 함수와 cleanup_module() 함수가 반드시 포함되는데, init_module() 함수는 커널 모듈이 메모리에 적재될 때 호출되며 cleanup_module()은 커널 모듈이 제거될 때 호출된다. 커널 모듈은 실행파일이 아닌 오브젝트 파일 형태이므로 커널 모듈을 컴파일할 때는 C 컴파일러에게 오브젝트 코드만을 생성하도록 하는 '-c' 옵션을 주면 된다. 


커널 모듈이 실제로 링크되는 시점은 메모리에 적재될 때이다. 커널 모듈을 메모리에 적재할 때는 insmod명령을 사용하고, 제거할 때에는 rmmod 명령을 사용한다.

커널 모듈소스에는 헤더 파일로서 linux/module.h가 포함되어야 한다. 




간단한 커널 모듈프로그램

#define MODULE

#include "linux/module.h"
#include "linux/kernel.h"

int init_module(void)
{
printk(" Linux Kernel Module Loading ... \n");
return 0;
}

void cleanup_module(void)
{
printk(" Linux Kernel Module Unloading ...\n");
}



커널 모듈이 메모리에 적재될 때(insmod 명령 사용) init_module()함수에 의해 적재된 커널 모듈이 초기화되면 자신을 현재 실행중인 커널에 등록한다. 이때 등록에 사용하는 함수 이름은 문자 디바이스의 경우 register_chrdev(), 블록 디바이스의 경우 register_blkdev() 이다.


rmmod 명령에 의해서 커널 모듈이 제거될 때에는 cleanup_module()함수가 호출되어 init_module() 함수에서 할당받은 자원을 반환하고, 문자 디바이스의 경우 unregister_chrdev() 함수를 사용하여 커널 모듈의 등록을 해제한다. 블록 디바이스의 경우 등록 해제에 unregister_blkdev()함수를 사용한다.



* file_operations 구조체 


file_operations 구조체는 사용하려는 응용 프로그램과 디바이스 드라이버를 서로 연결해 주는 기능을 하며, 디바이스 드라이버 내에서 구현된 함수들에 대한 포인터들로 구성되어 있다.  file_operations 구조체는 include/linux/fs.h 헤더 파일에 정의되어 있으며 다음에 이 내용의 일부를 보였다.










블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

댓글을 달아 주세요