UIO(9)

명칭
uio, uiomove - 디바이스 드라이버 입출력 routine

서식
<sys/types.h> <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 하지만 썼습니다.