■ 개념

포트의 입력 / 출력 허가권을 설정한다.

ioperm   는 프로세스를 위해 포트 주소 from 을 시작으로 num 바이트를 turn_on 값으로 포트 접근 허가 비트를 설정한다.
ioperm 의 사용은 루트 권한을 요구한다.
  
예를 들어, ioperm(0x300, 5, 1)이면 0x300 포트부터 0x304번 포트까지의 접근 권한을 주는 것이다.
turn_on에 Boolean으로 1을 주면 허가, 0을 주면 접근을 금지 시킨다.

ioperm이라는 함수는 프로그램이 root의 권한을 가지고 있어야 실행된다.

그리고 ioperm 에서 접근허가 된 포트라도 프로그램이 끝나면 자동적으로 접근금지가 되므로 굳이 ioperm( , ,0)을 줄 필요는 없다. 

ioperm()은 0x000부터 0x3FF 까지의 포트에만 접근할 수 있게 한다. 

더 높은 포트에 접근하려고 하면 iopl()이라는 함수를 사용하여야 한다. 
iopl()은 모든 포트에 대한 접근허가를 단 한번에 준다. 

그러므로 조심하여야 한다. 잘못된 포트로의 접근은 켬퓨터에 치명적인 문제를 일으킬 수 있다.


■ 매개변수 전달

   #include <unistd.h> /* for libc5 */
   #include <sys/io.h> /* for glibc */

   int ioperm(unsigned long from, unsigned long num, int turn_on)


   - from : read or write first port
   - num : num byte
   - turn_on : turn_on value permit? (1:true, 0:false)


■ 반환값

   성공시, 0이 리턴된다. 에러시 -1이 리턴되며 errno는 적당한 값이 설정된다.


■ inb / outb

포트에 실질적으로 값을 쓰고 읽는 기능을 주는 함수는 inb()/outb()이다. 

원하는 포트(port)에서 한 바이트(8bit)를 읽기 위해서는 inb(port)를, 쓰기 위해서는 outb(value, port)를 사용하는 데 value는 주고자 하는 값이다. 

두 바이트씩 즉 16bit씩 읽고 쓰기 위해서는 inw(port)/outw(value, port)를 사용하는데, 이는 실질적으로 port로 지정한 포트와 그 다음 포트를 합쳐서 읽고 쓰는 것이다. 또한 32bit씩 읽고자 한다면 inl(port)/outl(value, port)를 사용하며 이는 지정된 port 에서 연속적으로 이어서 4포트를 한꺼번에 읽고 쓰는 것이다. 

포트를  읽고 쓸 때는 근사적으로 1microsecond(백만분의 1초)가 소요된다. 

또한 포트에 접근한 후에 값을 읽고 쓰는 것을 보다 확실히 하기 위해서 약간의 delay시간을 줄 수 있는 데, 이에 쓰이는 함수는 inb_p()/outb_p()와 같이 함수 끝에 _p를 붙이는 것이다. 이는 pause를 의미하며, delay시간은 io.h에 정의되어 있는 매크로를 사용하여 조종되어질 수 있고, 초기치는 약 4 microsecond 이다. 

이를 바꾸는 방법은 #define REALLY_SLOW_IO (value) 이므로 이를 이용하면 된다. 그런데 이 pause시간을 정하는 매크로는 0x80포트를 통하여 이루어 지므로 이에 대한 접근권한을 주는 것을 잊지 말아야 한다.


'L inux > Device Driver' 카테고리의 다른 글

문자 디바이스  (0) 2011.09.28
디바이스 드라이버의 이해  (2) 2011.09.28
인터페이스 정보 얻기  (0) 2011.04.14
mknod() - 디바이스 파일 생성  (0) 2011.04.04
ioctl() - 디바이스 io 제어  (4) 2011.04.01
by 민트앤라떼 2011. 4. 12. 11:52