(ioctl, mmap, fsync&flush) 내용 보충 (ioctl, mmap, fsync&flush) 김 진 홍 jhkim3624@etri.re.kr 2015.10.11
ioctl mmap 목차 fsync와 flush
ioctl(chapter 10) 디바이스 제어 : ioctl() read(), write() 함수만으로 제어가 불가능 할때 mmap 디바이스 제어 : ioctl() read(), write() 함수만으로 제어가 불가능 할때 이용하는 방법은 디바이스 파일에 따라 모두 다름 man ioctl_list 이용 e.g. ioctl 명령을 이용해서 프린트 포트의 핀의 상태를 요청하는 코드 #include <sys/type.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <linux/lp.h> <----- 프린트 포트 관련 명령이 담겨있는 헤더파일 int main( int argc, char ** argv) { int fd; int prnstate; int lp; unsigned char buff[128]; fd = open("/dev/lp0", O_RDWR | O_NDELAY); <----- 프린트 포트 디바이스 열기 fsync와 flush if( fd< 0) { perror("open error"); <----- 열기 실패시 에러 메세지 출력 exit(1); } while(1) { ioctl(fd, LPGETSTATUS ,&prnstate); <----- 프린트 포트의 상태를 요청 (프린트 포트에 대한 명령은 LPGETSTATUS, 프린트 포트의 상태는 prnstate변수에 저장됨) if(prnstate & LP_PSELECD) printf("ON\n"); else printf("OFF\n"); usleep(50000); } close(fd); return 0; }
mmap(chapter 18) 프로세스 메모리 매핑 ioctl mmap 프로세스 메모리 매핑 read(), write(), ioctl()등은 메모리와 커널 공간 사이의 메모리 전달과정이 수반되기에 비효율적 특히, 많은 용량의 데이터가 전달되어야 하는 장치에 사용되면 성능이 저하됨 <read(), write() 함수의 데이터 전달 과정> read(fd, buff, size) write(fd, buff, size) 시 스 템 콜 인터 럽트 메모리 복사 함수 put_user, copy_to_user I/O 제어 함수 readb, readw, readl … get_user, copy_from_user writeb, writew, writel … 하 드 웨 어 파 일 오 퍼 레 이 션 커널 응용 fsync와 flush
mmap 프로세스 메모리 매핑 mmap을 통해 메모리 복사 없이 하드웨어의 I/O 주소공간을 직접 사용 ioctl mmap 프로세스 메모리 매핑 mmap을 통해 메모리 복사 없이 하드웨어의 I/O 주소공간을 직접 사용 응용 프로그램이 디바이스 파일을 대상으로 mmap() 호출 커널이 매핑에 대한 사전 작업 수행 커널이 디바이스 파일의 file_operation 구조체에 선언된 mmap() 함수를 호출 드라이버에 정의된 mmap()함수는 매핑을 수행 fsync와 flush
mmap 프로세스 메모리 매핑 물리 주소를 가상 주소로 매핑하는 방법 ioctl mmap mmap() 함수 사용 ioremap() 함수를 사용 fsync와 flush mmap ioremap 물리 주소를 지정하는 프로세스 가상주소 물리 주소 영역 물리 주소를 지정하는 커널 가상 주소 응용 프로그램 하드웨어 디바이스 드라이버
ioremap 물리 주소 공간과 커널 가상 주소 공간 매핑 원형 사용 ioctl mmap 물리 주소 공간과 커널 가상 주소 공간 매핑 원형 void *ioremap(unsigned long offset, unsigned long size); 매개변수 물리 주소의 시작주소와 크기 size는 MMU의 PAGE_SIZE의 n배수 사용 char *videoptr; videoptr = ioremap(0x000b0000, 0x1000); if(videoptr !=NULL){ *videoptr = ‘A’; } fsync와 flush
ioremap fsync와 flush 디바이스 파일에 저장된 데이터는 드라이버의 구현 방식에 따라 달라짐. ioctl mmap fsync와 flush 디바이스 파일에 저장된 데이터는 드라이버의 구현 방식에 따라 달라짐. 실제 하드웨어에 저장 드라이버 내부에 저장 fsync 용도 드라이버 내부 버퍼에 있는 데이터를 모두 디바이스에 씀 주의점 디바이스 파일에 따라 실행 시간이 길어지거나 함수 종료가 되지 않을 수도 있음 flush 응용 프로그램에서 디바이스를 닫기 전에 드라이버 내부에 쓸 버퍼의 내용을 하드웨어에 모두 적용하도록 함 fsync와 flush
Qna