2016-03-11 4 views
1

В настоящее время я пытаюсь извлечь данные из файла Freebsd VFS vnode.Как читать фактические данные файла из Freebsd VFS vnode

struct vnode { 
     /* 
     * Fields which define the identity of the vnode. These fields are 
     * owned by the filesystem (XXX: and vgone() ?) 
     */ 
     const char *v_tag;   /* u type of underlying data */ 
     struct vop_vector *v_op;  /* u vnode operations vector */ 
     void *v_data;   /* u private data for fs */ 

     /* 
     * Filesystem instance stuff 
     */ 
     struct mount *v_mount;   /* u ptr to vfs we are in */ 
     TAILQ_ENTRY(vnode) v_nmntvnodes; /* m vnodes for mount point */ 

     /* 
     * Type specific fields, only one applies to any given vnode. 
     * See #defines below for renaming to v_* namespace. 
     */ 
     union { 
      struct mount *vu_mount; /* v ptr to mountpoint (VDIR) */ 
      struct socket *vu_socket; /* v unix domain net (VSOCK) */ 
      struct cdev *vu_cdev; /* v device (VCHR, VBLK) */ 
      struct fifoinfo *vu_fifoinfo; /* v fifo (VFIFO) */ 
     } v_un; 

     /* 
     * vfs_hash: (mount + inode) -> vnode hash. The hash value 
     * itself is grouped with other int fields, to avoid padding. 
     */ 
     LIST_ENTRY(vnode) v_hashlist; 

     /* 
     * VFS_namecache stuff 
     */ 
     LIST_HEAD(, namecache) v_cache_src; /* c Cache entries from us */ 
     TAILQ_HEAD(, namecache) v_cache_dst; /* c Cache entries to us */ 
     struct namecache *v_cache_dd;  /* c Cache entry for .. vnode */ 

     /* 
     * Locking 
     */ 
     struct lock v_lock;   /* u (if fs don't have one) */ 
     struct mtx v_interlock;  /* lock for "i" things */ 
     struct lock *v_vnlock;   /* u pointer to vnode lock */ 

     /* 
     * The machinery of being a vnode 
     */ 
     TAILQ_ENTRY(vnode) v_actfreelist; /* f vnode active/free lists */ 
     struct bufobj v_bufobj;  /* * Buffer cache object */ 

     /* 
     * Hooks for various subsystems and features. 
     */ 
     struct vpollinfo *v_pollinfo;  /* i Poll events, p for *v_pi */ 
     struct label *v_label;   /* MAC label for vnode */ 
     struct lockf *v_lockf;  /* Byte-level advisory lock list */ 
     struct rangelock v_rl;   /* Byte-range lock */ 

     /* 
     * clustering stuff 
     */ 
     daddr_t v_cstart;   /* v start block of cluster */ 
     daddr_t v_lasta;   /* v last allocation */ 
     daddr_t v_lastw;   /* v last write */ 
     int v_clen;    /* v length of cur. cluster */ 

     int v_holdcnt;   /* i prevents recycling. */ 
     int v_usecount;   /* i ref count of users */ 
     u_int v_iflag;   /* i vnode flags (see below) */ 
     u_int v_vflag;   /* v vnode flags */ 
     int v_writecount;   /* v ref count of writers */ 
     u_int v_hash; 
     enum vtype v_type;   /* u vnode type */ 
    }; 

Я предположил, что данные живут в bufobj, но я понятия не имею, как его извлечь. Bufobj также содержит список других bufobj. Он также содержит объекты bufvs, которые содержат чистые и грязные буферы. Это очень помогло бы мне, если бы кто-то указал мне на правильное направление.

+0

Вы пробовали форум разработки FreeBSD? forums.freebsd.org/forums/34 Я чувствую, что вы получите больше помощи для своей проблемы. – Amiramix

ответ

1

Чтобы прочитать файл из ядра, вы можете использовать VOP_READ(9). Посмотрите на vnode(9) manpage для получения дополнительной информации и списка других макросов для обработки vnodes.

Если вы хотите привести пример, md(4) source code - хорошее начало.

 Смежные вопросы

  • Нет связанных вопросов^_^