- Module Programming
- 절차
- 특징
- Module 적재 및 제거
- 기본 구조
- Module 관련 유틸리티
- Module Program 작성 Device Driver
: 디바이스와 시스템 사이에 데이터를 주고받기 위한 인터페이스
: 표준적으로 동일한 서비스 제공을 목적
: 커널의 일부분으로 내장
: 서브루틴과 데이터의 집합체
: 디바이스의 고유한 특성을 내포
- Device 종류
- 디바이스 파일
- File Operations
■ Character Device Driver
■ Ext4_file_operations
- 디바이스 드라이버 구현
: 모드간 데이터 전송: I/O 영역 경쟁 처리
: 디바이스 종류별 등록/해제
■ 문자 디바이스 드라이버
- 2.6 이후
1. 디바이스 번호 등록
2. cdev 구조체 생성 및 초기화
3. 디바이스 등록 cdev_add(); -> module_init();
4. file_operations 구조체에 대입될 함수들을 작성
- 출처 : http://blog.dasomoli.org/223
: register_chrdrv_region 함수는 원하는 디바이스의 번호를 미리 알고 있을 때 사용하고, alloc_chrdev_region 함수는 디바이스의 번호를 동적으로 할당받아 파라미터로 받는 dev_t 구조체 포인터를 이용해 dev_t 구조체에 넣는다.
register_chrdrv 대신 register_chrdrv_region을 사용하는 것으로 혼동할 수 있는데 그게 아닌 cdev_add 함수까지 사용하여야 한다. 실제 커널 소스의 register_chrdrv 함수를 보면 이런 과정이 구현되어 있음을 볼 수 있다.
cdev_add 함수를 사용하기 위해서는 struct cdev 구조체를 사용하여야 하는데 이 구조체를 초기화 시켜주는 함수가 cdev_init 이다. struct cdev 구조체 등을 사용하려면 <linux/cdev.h> 를 include하여야 한다. 다음은 사용 예이다.#include <linux/kernel.h> #include <linux/cdev.h> #include <linux/fs.h> ... struct file_operations dasom_fops; static struct cdev dasom_cdev = { .owner = THIS_MODULE, .ops = &dasom_fops, }; int _init dasom_init(void) { dev_t dev; int err = 0; if(major) { dev = MKDEV(major, minor); err = register_chrdev_region(dev, 1, "dasomoli"); } else { err = alloc_chrdev_region(&dev, mior, 1, "dasomoli"); major = MAJOR(dev); } if(err < 0) { err = -ENODEV; return err; } ... cdev_init(&dasom_cdev, &dasom_fops); dasom_cdev.owner = THIS_MODULE; dasom_cdev.ops = &dasom_fops; if(cdev_add(&dasom_cdev, dev, 1)) { printk(KERN_INFO"dasom: cdev creation failed.\n"); err = -ENODEV; goto error_label; } ... return 0; error_label: return err; }
- 2.6 이전
블록 디바이스 드라이버■
■네트워크 디바이스 드라이버
- Character Device Driver with VFS
- File System and Device Driver전체 요약
'Major > Linux' 카테고리의 다른 글
리눅스 - Ext4 File System (0) | 2016.02.01 |
---|---|
리눅스 - 가상 파일 시스템 (0) | 2016.01.28 |
리눅스 - 파일 디스크립터 (7) | 2016.01.28 |
리눅스 - 파일 시스템 (0) | 2016.01.28 |
리눅스 - System Call (0) | 2016.01.28 |