300x250


내용보충(ioctl,mmap,flush,fsync).pptx



내용 보충

(ioctl, mmap, fsync&flush)


ioctl(chapter 10)

디바이스 제어 : 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); <----- 프린트 포트 디바이스 열기

 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)

프로세스 메모리 매핑
read(), write(), ioctl()등은 메모리와 커널 공간 사이의 메모리 전달과정이 수반되기에 비효율적

특히, 많은 용량의 데이터가 전달되어야 하는 장치에 사용되면 성능이 저하됨
<read(), write() 함수의 데이터 전달 과정>


프로세스 메모리 매핑
mmap을 통해 메모리 복사 없이 하드웨어의 I/O 주소공간을 직접 사용
1.응용 프로그램이 디바이스 파일을 대상으로 mmap() 호출
2.커널이 매핑에 대한 사전 작업 수행
3.커널이 디바이스 파일의 file_operation 구조체에 선언된 mmap() 함수를 호출

4.드라이버에 정의된 mmap()함수는 매핑을 수행




프로세스 메모리 매핑
물리 주소를 가상 주소로 매핑하는 방법
1.mmap() 함수 사용
2.ioremap() 함수를 사용

ioremap
물리 주소 공간과 커널 가상 주소 공간 매핑

원형

void *ioremap(unsigned long offset, unsigned long size);

매개변수

물리 주소의 시작주소와 크기

sizeMMUPAGE_SIZEn배수

사용

char *videoptr;
videoptr = ioremap(0x000b0000, 0x1000);
if(videoptr !=NULL){
*videoptr = ‘A’;
}






fsyncflush
디바이스 파일에 저장된 데이터는 드라이버의 구현 방식에 따라 달라짐.
실제 하드웨어에 저장
드라이버 내부에 저장
fsync
용도
드라이버 내부 버퍼에 있는 데이터를 모두 디바이스에 씀
주의점
디바이스 파일에 따라 실행 시간이 길어지거나
함수 종료가 되지 않을 수도 있음
flush
용도
응용 프로그램에서 디바이스를 닫기 전에 드라이버 내부에 쓸 버퍼의 내용을 하드웨어에 모두 적용하도록 함


반응형

+ Recent posts