tail head cat sleep
QR code linking to this page

Man page  — VNODE

명칭

vnode – 파일 또는 디렉토리의 내부 표현

내용

서식

#include <sys/param.h>
#include <sys/vnode.h>

/*
 * vnode 의 형태입니다. VNON 는 형태가 없는 일을 의미합니다.
 */
enum vtype      { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD };

/* * vnode 의 태그형입니다. * 외부 프로그램 (예를 들면, pstat) (을) 위해서만 있어, 결코 커널 * 에 의해 검사되어야 하는 것이 아닙니다. */ enum vtagtype   {         VT_NON, VT_UFS, VT_NFS, VT_MFS, VT_PC, VT_LFS, VT_LOFS, VT_FDESC,         VT_PORTAL, VT_NULL, VT_UMAP, VT_KERNFS, VT_PROCFS, VT_AFS, VT_ISOFS,         VT_UNION, VT_MSDOSFS, VT_TFS, VT_VFS, VT_CODA, VT_NTFS };

/* * 개개의 하위 파일 시스템은 그 사적인 area를 할당해 그것을 * v_data 나들 적합니다. 눌이 아니다면, 이 area는 getnewvnode()로 * 해방됩니다. */ TAILQ_HEAD(buflists, buf);

typedef int     vop_t __P((void *)); struct namecache;

/* * 이러한 항목의 독 붐비어 또는 기록은 적절한 락의 보관 유지를 요구합니다. * v_freelist 는 글로벌 vnode_free_list 단순 락으로 락 됩니다. * v_mntvnodes 는 글로벌 mntvnodes 단순 락으로 락 됩니다. * v_flag, v_usecount, v_holdcount 및 v_writecount 는 vinterlock * 단순 락으로 락 됩니다. * v_pollinfo 는 그 중에 포함되어 있는 락으로 락 됩니다. */ struct vnode {         u_long  v_flag;                         /* vnode 플래그 (이하 참조) */         int     v_usecount;                     /* 유저의 참조 카운트 */         int     v_writecount;                   /* 기록자의 참조 카운트 */         int     v_holdcnt;                      /* 페이지 & 버퍼의 참조 */         daddr_t v_lastr;                        /* 마지막 독포함 (예측) */         u_long  v_id;                           /* 케이파비리티 식별자 */         struct  mount *v_mount;                 /* 지금 있는 VFS 에의 포인터 */         vop_t   **v_op;                         /* vnode 조작 벡터 */         TAILQ_ENTRY(vnode) v_freelist;          /* vnode 면세표 */         LIST_ENTRY(vnode) v_mntvnodes;          /* 마운트 포인트의 vnode */         struct  buflists v_cleanblkhd;          /* 깨끗한 블록 리스트 선두 */         struct  buflists v_dirtyblkhd;          /* 더러워진 블록 리스트 선두 */         LIST_ENTRY(vnode) v_synclist;           /* 더러워진 버퍼 첨부 vnode */         long    v_numoutput;                    /* 기입중의 수 */         enum    vtype v_type;                   /* vnode 의 형태 */         union {                 struct mount    *vu_mountedhere;/* mount 된 VFS 에의 포인터 (VDIR) */                 struct socket   *vu_socket;     /* UNIX IPC (VSOCK) */                 struct specinfo *vu_specinfo;   /* 디바이스 (VCHR, VBLK) */                 struct fifoinfo *vu_fifoinfo;   /* FIFO (VFIFO) */         } v_un;         struct  nqlease *v_lease;               /* 대출의 소프트 참조 */         daddr_t v_lastw;                        /* 마지막 기록 (클러스터) */         daddr_t v_cstart;                       /* 클러스터의 개시 블록 */         daddr_t v_lasta;                        /* 마지막 할당 */         int     v_clen;                         /* 현재의 클러스터장 */         int     v_maxio;                        /* 최대 I/O 클러스터 사이즈 */         struct vm_object *v_object;             /* VM 오브젝트의 보존 장소 */         struct  simplelock v_interlock;         /* 사용 카운트와 플래그의 락 */         struct  lock *v_vnlock;                 /* 비락 파일 시스템용 */         enum    vtagtype v_tag;                 /* 하위 데이터의 형태 */         void    *v_data;                        /* 파일 시스템의 사적 데이터 */         LIST_HEAD(, namecache) v_cache_src;     /* 우리로부터의 캐쉬 엔트리 */         TAILQ_HEAD(, namecache) v_cache_dst;    /* 우리에게로의 캐쉬 엔트리 */         struct  vnode *v_dd;                    /* .. 의 vnode */         u_long  v_ddid;                         /* .. 의 케이파비리티 식별자 */         struct  {                 struct  simplelock vpi_lock;    /* 이하를 보호하는 락 */                 struct  selinfo vpi_selinfo;    /* 폴링측의 식별 */                 short   vpi_events;             /* 무엇을 찾고 있는 것인가 */                 short   vpi_revents;            /* 무엇이 일어났는가 */         } v_pollinfo; }; #define v_mountedhere   v_un.vu_mountedhere #define v_socket        v_un.vu_socket #define v_specinfo      v_un.vu_specinfo #define v_fifoinfo      v_un.vu_fifoinfo

/* * vnode 플래그입니다. */ #define VROOT           0x00001 /* 파일 시스템의 루트 */ #define VTEXT           0x00002 /* vnode 는 순수한 텍스트 prototype */ #define VSYSTEM         0x00004 /* vnode 는 커널이 사용중 */ #define VISTTY          0x00008 /* vnode 는 tty 를 표현 */ #define VXLOCK          0x00100 /* vnode 는 하위의 형태의 변경을 위해 락중 */ #define VXWANT          0x00200 /* 프로세스가 vnode 를 기다리고 있습니다 */ #define VBWAIT          0x00400 /* 출력의 완료를 기다리고 있습니다 */ #define VALIASED        0x00800 /* vnode 에 별명이 있습니다 */ #define VDIROP          0x01000 /* LFS: vnode 가 디렉토리 조작에 관여 */ #define VOBJBUF         0x02000 /* VM 오브젝트에 버퍼를 할당 */ #define VNINACT         0x04000 /* LFS: lfs_vunref 로 ufs_inactive() 하지 않는다 */ #define VAGE            0x08000 /* 면세표의 선두에 vnode 를 삽입 */ #define VOLOCK          0x10000 /* 오브젝트를 기다리기 위해서(때문에) vnode 가 락 */ #define VOWANT          0x20000 /* 프로세스가 VOLOCK 를 기다리고 있습니다 */ #define VDOOMED         0x40000 /* 이 vnode 는 재이용중 */ #define VFREE           0x80000 /* 이 vnode 는 면세표상 */ #define VTBFREE         0x100000 /* 이 vnode 는 면세표행 */ #define VONWORKLST      0x200000 /* syncer 작업 리스트상 */ #define VMOUNT          0x400000 /* mount 처리중 */

해설

vnode 는 UNIX 에서의 파일 활동의 중심입니다. 개개의 활동중의 파일, 개개의 현재의 디렉토리, 개개의 mount 된 파일, 텍스트 파일, 및 루트를 위해서(때문에) 할당일의적인 vnode 가 있습니다.

개개의 vnode 는 3 개의 참조 카운트, v_usecount, v_holdcnt v_writecount (을)를 가지고 있습니다. 최초의 것은 커널내에서 이 vnode 를 사용하고 있는 클라이언트의 수입니다. 이 카운트는 vref(9), vrele(9)vput(9) 에 의해 관리됩니다. 2 번째의 것은 커널내에서 이 vnode 의 재이용을 거부하고 있는 클라이언트의 수입니다. 이 카운트는 vhold(9) [영어] 및 vdrop(9) [영어] 에 의해 관리됩니다. vnode 의 v_usecount v_holdcnt 의 양쪽 모두가 0 에 이르면(자), 그리고 그 vnode 는 면세표상에 놓여져 것에 의해 다른 파일 시스템으로, 다른 파일을 위해서(때문에) 재이용될지도 모릅니다. 면세표에의 및 면세표로부터의 이행은, getnewvnode(9) [영어], vfree(9) 및 vbusy(9) 에 의해 취급됩니다. 3 번째의 것은 파일에 기록중의 클라이언트의 수의 카운트입니다. 이것은 open(2)close(2) 시스템 콜에 의해 관리됩니다.

vnode 를 돌려주는 모든 호출해 (예를 들면 VFS_GET(9), VOP_LOOKUP(9) 등)은 vnode 의 v_usecount (을)를 1 두개 늘립니다. 호출측이 vnode 의 이용을 완료했을 때에는, 이 참조는 vrele(9) (또는 vnode 가 락 되고 있으면 vput(9)) 의 호출에 의해 해방되어야 합니다.

그 외의 공통에 사용되는 vnode 구조체의 멤버는, 이름 캐쉬에서의 일관성을 관리하기 위해서 사용된다 v_id 라고 그 vnode 를 소유하고 있는 파일 시스템을 가리킨다 v_mount 라고 그 vnode 가 표현하는 오브젝트의 형태를 포함한다 v_type 라고 그 vnode 의 파일 시스템 특유의 데이터를 보존하기 위해서 파일 시스템에 의해 사용된다 v_data (이)가 있습니다. v_op 필드는 vnode 의 기능을 실장하는 파일 시스템내의 함수를 호출하기 위한 VOP_* 매크로에 의해 사용됩니다.

VNODE 의 형태

VNON 형태 없음입니다.
VREG 통상 파일입니다. VM 오브젝트의 지지가 있을지도 모르고 없을지도 모릅니다. 반드시 지지 오브젝트를 취득하고 싶은 경우에는, vfs_object_create(9) (을)를 호출합니다.
VDIR 디렉토리입니다.
VBLK 블록 타입 디바이스입니다. VM 오브젝트의 지지가 있을지도 모르고 없을지도 모릅니다. 반드시 지지 오브젝트를 취득하고 싶은 경우에는, vfs_object_create(9) (을)를 호출합니다.
VCHR 캐릭터형 디바이스입니다.
VLNK 기호 연결입니다.
VSOCK 소켓입니다. 통지 락은 동작하지 않을 것입니다.
VFIFO FIFO (이름 첨부 파이프)입니다. 통지 락은 동작하지 않을 것입니다.
VBAD 낡은 형식의 잘못된 섹터 MAP입니다.

VFIFO 는 /sys/kern/sys_pipe.c 의 "struct fileops" 를 사용합니다. VSOCK 는 /sys/kern/sys_socket.c 의 "struct fileops" 를 사용합니다. 그 외의 모두는 /sys/kern/vfs_vnops.c 의 "struct fileops" 를 사용합니다.

VFIFO/VSOCK 의 코드에 왠지 "struct fileops" 가 사용되고 있는 이유는, 커널에의 VFS 코드의 불완전한 통합의 문화유산입니다.

관련 항목

VFS(9)

저자

이 메뉴얼 페이지는 Doug Rabson 하지만 썼습니다.

VNODE (9) June 30, 1999

tail head cat sleep
QR code linking to this page


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

If at first you don't succeed, you must be a programmer.