기본적으로 운영체제는 

1. 사용자 공간


2. 커널 

두개의공간으로 나누어져 있다. 문서 편집기 익스플로러같은 응용 프로그램코드는 사용자 공간에 

있으며 네트워크 스택, 같은 OS기반은 코드는 커널에 상주한다.

커널 코드는 민감한 리소스를 관리하며 응용 프로그램 사이의 보안과 신뢰 장벽을 제공한다.

이러한 까닭에 사용자 모드 응용 프로그램은 CPU 에 의해 커널 리소스를 직접 접근하는 것을 막는다.

사용자 공간 응용 프로그램은 사용자 -> 커널로 이동하는 특별한 서브루틴 콜인 시스템 콜의 수단으로

기본 커널의 대부분의 요청을 취한다.  보통 시스템 콜 벡터와 함께 추가되며 여기서 요청자는

원하는 시스템 콜을 색인 숫자로 기억한다.  하지만 이런 시스템 콜에도 드라이버 장치는 막혀있다.

대부분의 하드웨어 주변 기기는 반드시 커널 안에서 직접 접근 하여야 한다. 

그러나 사용자 코드는 장치와 통신해야 하는 경우가 있다. 


일단 마우스 장치에 대해서 

/dev/해당 관련 마우스 장치에 파일을

open ()으로 열어서 리턴되는 fd(File descriptor) 값을 이용하여서


#include <sys/ioctl.h>

int ioctl(int fd, int request, argp);


ioctl (I/O Control)을 통해서 장치 제어를 한다. 


ioctl 의 경우 (int fd, int request, argp) 로 들어오게 된다.


fd는 open으로 인해 반환된 fd(file descriptor)

request : 드라이버에서 취해야 할 명령을 보낸다. 


성공일시 0 값 실패시 -1 반환 


-1을 얻었을시에 error 값을 참조하면 문제 확인 가능(EFAULT argp는 접근할수 없는 메모리 영역)

ENOTTY : fd는 문자 디바이스 파일과 연관되어있지 않다.


EINVAL : 디바이스파일에 연동된 드라이버가 request 또는 argp처리 불가능 


// 

int fd  ; // file descriptor


int ret;

int level = 2;

mousehw_t mhw;


fd = open=("/dev/장치명",O_RDWR);

if(fd==-1)  // -1 이면 에러

{

std::cout<<"Open Error -> Error Number : - > " ;

checking();

std::cout<<""<<std::endl;

}

std::cout<<"Current File Descriptor :: ->>>>  <<fd <<std::endl;


ret = ioctl(fd,MOUSE_SETLEVEL,&level);









'GNU > FreeBSD' 카테고리의 다른 글

COMMAND - top  (0) 2016.07.04
Unix Errno 표기  (0) 2016.07.04
Mouse_Control - 2 일차  (0) 2016.06.30
Mouse_Control - 1 일차  (0) 2016.06.29
Free BSD 유용한 명령어  (0) 2016.06.14

+ Recent posts