07. 디바이스 드라이버의 초기화와 종료 김진홍 jhkim3624@etri.re.kr 2015.10.11.
1. 초기화와 종료 처리 2. 모듈 사용 횟수 관리 3. I/O 영역의 경쟁 처리 함수 목차
개요 개요 하드웨어의 동작 모듈과 하드웨어 사용 1. 초기화와 종료 처리 2. 모듈 사용 횟수 관리 3. I/O 영역의 경쟁 처리 함수 개요 하드웨어의 동작 시스템의 시작과 함께 동작 응용 프로그램이 디바이스 파일을 열었을 때 동작 모듈과 하드웨어 사용 모듈 초기화 시점에 하드웨어를 초기화 모듈 제거 시점에 하드웨어 사용 중지
초기화와 종료 모듈 적재와 제거 과정 insmod : module_init – 모듈 적재 1. 초기화와 종료 처리 2. 모듈 사용 횟수 관리 3. I/O 영역의 경쟁 처리 함수 모듈 적재와 제거 과정 insmod : module_init – 모듈 적재 rmmod : module_exit – 모듈 제거
모듈 초기화와 종료 module_init의 초기화 처리 디바이스 드라이버 등록 디바이스 드라이버에 내부 구조체 메모리 할당 1. 초기화와 종료 처리 2. 모듈 사용 횟수 관리 3. I/O 영역의 경쟁 처리 함수 module_init의 초기화 처리 디바이스 드라이버 등록 주번호, 디바이스 이름, 파일 조작에 필요한 함수 테이블의 위치 값 디바이스 드라이버에 내부 구조체 메모리 할당 e.g. 컨텍스트 동작과 인터럽트 처리를 위한 lock 관련 변수 여러 프로세스가 하나의 디바이스에 접근할 경우 사전 처리(20장) 하드웨어 초기화
모듈 초기화와 종료 module_exit의 종료 처리 디바이스 드라이버의 해제 디바이스 드라이버에 할당된 모든 메모리의 해제 1. 초기화와 종료 처리 2. 모듈 사용 횟수 관리 3. I/O 영역의 경쟁 처리 함수 module_exit의 종료 처리 디바이스 드라이버의 해제 디바이스 드라이버에 할당된 모든 메모리의 해제 하드웨어 제거에 따른 처리
open() 함수와 release() 함수의 처리 1. 초기화와 종료 처리 2. 모듈 사용 횟수 관리 3. I/O 영역의 경쟁 처리 함수 open()/close() 함수 int fd; fd = open(DEVICE_FILENAME, O_RDWR|O_NDELAY); if(fd<0) { printf(“error number %d”, error); exit(1); } 응용프로그램 struct file_operations call_fops = { : .open = xxx_open, } 구조체 open에 해당하는 함수 호출 (드라이버가 등록된 상태) int xxx_open (struct inode *inode, struct file *filp) { int err = 0; // open 처리 내용들 : return err; } open에 대응되는 함수
초기화와 종료 정리 처리 항목과 처리 시점 1. 초기화와 종료 처리 2. 모듈 사용 횟수 관리 3. I/O 영역의 경쟁 처리 함수 처리 항목과 처리 시점 항목 초기화 종료 열기 닫기 디바이스 드라이버의 등록 ● 디바이스 드라이버의 해제 동작에 필요한 내부 구조체의 메모리 할당 동작에 필요한 내부 구조체의 메모리 해제 여러 프로세스가 접근할 경우 사전 처리 여러 프로세스가 접근할 경우 종료 처리 주 번호에 종속된 부 번호를 관리하는 처리 하드웨어 검출 처리 및 에러 처리 하드웨어 초기화 제거 가능한 하드웨어 제거 처리 응용에서 드라이버를 사용하는 경우 초기 처리 응용에서 드라이버를 사용하지 않는 경우 처리 부 번호에 관련된 프로세스별 처리 프로세스별 메모리 할당 프로세스별 메모리 해제 모듈 사용 횟수 증가 모듈 사용 횟수 감소 사용 자원 등록 사용 자원 해제 인터럽트 서비스 함수 등록 인터럽트 서비스 함수 해제
커널 2.6 디바이스 드라이버의 사용 횟수 커널에서 관리 핫플로그인 처리가 필요할 땐 open()시 직접 호출 증가 1. 초기화와 종료 처리 2. 모듈 사용 횟수 관리 3. I/O 영역의 경쟁 처리 함수 디바이스 드라이버의 사용 횟수 커널에서 관리 핫플로그인 처리가 필요할 땐 open()시 직접 호출 증가 try_module_get(THIS_MODULE) 0일경우 실패(적재되지 않은 상태) 감소 module_put(THIS_MODULE)
I/O 메모리 영역 메모리영역 경쟁 처리 PCI나 기타 내부적으로 I/O 제어를 위해 메모리 영역을 사용하는 경우 1. 초기화와 종료 처리 2. 모듈 사용 횟수 관리 3. I/O 영역의 경쟁 처리 함수 메모리영역 경쟁 처리 PCI나 기타 내부적으로 I/O 제어를 위해 메모리 영역을 사용하는 경우 등록된 자원인가 확인 check_mem_region() 자원 등록 request_mem_region() 등록된 자원 제거 release_mem_region() int xxx_open(struct inode *inode, struct file *filp) { int err; if(err = check_mem_region(0x3FF0400, 0x10)) return err; request_mem_region(0x3FF0400, 0x10, “TEST”); return 0; }
Qna