tail head cat sleep
QR code linking to this page

Man page  — UIO

명칭

uio, uiomove – 디바이스 드라이버 입출력 routine

내용

서식

#include <sys/types.h>
#include <sys/uio.h>

struct uio {
        struct  iovec *uio_iov;
        int     uio_iovcnt;
        off_t   uio_offset;
        int     uio_resid;
        enum    uio_seg uio_segflg;
        enum    uio_rw uio_rw;
        struct  proc *uio_procp;
};

int
uiomove(caddr_t buf, int howmuch, struct uio *uiop);

해설

uiomove() 함수는, 유저 공간과 커널 공간의 경계를 넘는 것 조차 가능해, 버퍼와 입출력 벡터간의 데이터 전송의 실행에 사용됩니다.

캐릭터형 디바이스의 드라이버에게 건네진, 모든 read(2), write(2), readv(2) 없고 writev(2) 시스템 콜의 결과로서, 적절한 드라이버의 d_read 또는 d_write 엔트리가 struct uio 구조체의 포인터를 건네받아 불려 갑니다. 전송의 리퀘스트는, 이 구조체안에 encode 됩니다. 드라이버 자신도 이 구조체안의 데이타를 뽑기 시작하기 위해서(때문에) uiomove() (을)를 사용해야 합니다.

uio 구조체의 각 필드는 아래와 같은 대로입니다.
uio_iov
  처리해야 할 입출력 벡터의 배열입니다. 산재적인 입출력의 경우에는, 하나 이상의 벡터가 되겠지요.
uio_iovcnt
  존재하고 있는 입출력 벡터의 수를 나타냅니다.
uio_offset
  디바이스의 오프셋(offset)입니다.
uio_resid
  처리해야 할 바이트수입니다.
uio_segflg
  이하의 플래그안의 하나입니다.
UIO_USERSPACE
  입출력 벡터는 프로세스의 address 공간을 가리키고 있습니다.
UIO_SYSSPACE
  입출력 벡터는 커널의 address 공간을 가리키고 있습니다.
UIO_USERISPACE
  입출력 벡터는 프로세스의 address 공간의 인스트럭션 area를 가리키고 있습니다.
UIO_NOCOPY
  오브젝트중에 이미 데이터가 있어, 카피하지 않습니다.
uio_rw
  요구된 전송의 방향을 나타내, UIO_READ 또는 UIO_WRITE 입니다.
uio_procp
  thread에 관련지을 수 있었다 struct thread 구조체에의 포인터입니다. uio_segflg 하지만 프로세스의 address 공간과의 전송을 해야 한다라고 가리키고 있는 경우에 사용됩니다.

사용예

생각으로서 드라이버는 데이터를 위한 사적인 버퍼의 메인트넌스를 행해, 이 버퍼의 최대 사이즈의 데이터의 덩어리의 요구를 처리합니다. 아래와 같은 버퍼의 취급은 매우 간략화되고 있어 아마 움직이지 않습니다(버퍼의 포인터는 부분적인 읽을 경우 진행되지 않습니다) 해, uio 의 취급을 실제로 해 보이고 있을 뿐이다, 라고 하는 것에 주의해 주세요.
/* MIN()의 정의는 이 안에 있습니다 */
#include <sys/param.h>

#define BUFSIZE 512 static char buffer[BUFSIZE];

static int data_available;      /* 읽어들일 수 있는 데이터량 */

static int fooread(dev_t dev, struct uio *uio, int flag) {         int rv, amnt;

        while (uio->uio_resid > 0) {                 if (data_available > 0) {                         amnt = MIN(uio->uio_resid, data_available);                         if ((rv = uiomove((caddr_t) buffer, amnt, uio))                          ! = 0)                                 goto error;                         data_available -= amnt;                 } else {                         tsleep(...);    /* 보다 좋은 시기까지 기다린다 */                 }         }         return 0; error:         /* 에러의 클린 업을 여기서 행한다 */         return rv; }                         

반환값

uiomove() 하 프로세스의 address 공간과의 전송의 경우에, copyin(9) 또는 copyout(9) 에 의해 일으켜졌다 EFAULT (을)를 돌려주는 일이 있습니다.

관련 항목

read(2), readv(2), write(2), writev(2), copyin(9), copyout(9), sleep(9) [영어]

역사

uio 의 구조는 있는 조기의 버젼의 Unix 그리고 등장했습니다.

저자

이 메뉴얼 페이지는 Jörg Wunsch 하지만 썼습니다.

UIO (9) February 2, 1997

tail head cat sleep
QR code linking to this page


Ben Bullock이 유닉스 매뉴얼 페이지에서 서비스에 대한 의견을 주시기 바랍니다. Privacy policy.

Unix’s “power tools” are more like power switchblades that slice off the operator’s fingers quickly and efficiently.
— The Unix Haters' handbook