天天看点

RTEMS文件系统(5):文件系统实现需求(下)

5.4 Operation Tables

文件系统的具体操作是被间接调用地。这些由文件系统实现的函数被配置为两个表。

文件系统处理程序表含有的针对具体文件系统的函数,与实际文件类型无关。

文件处理程序例程表含有文件系统和文件类型两种函数。

5.4.1 Filesystem Handler Table Functions

OPS~表函数被定义成一个~rtems_filesystem_operations_table~结构类型。

这定义的函数是针对一个给定的文件系统。

一个表存在于每个~RTEMS~配置支持的文件系统。

该结构定义如下,并介绍这个函数管理结构中的每个函数相关的开发信息。

    typedef struct {

        rtems_filesystem_evalpath_t     evalpath;

        rtems_filesystem_evalmake_t     evalformake;

        rtems_filesystem_link_t         link;

        rtems_filesystem_unlink_t       unlink;

        rtems_filesystem_node_type_t    node_type;

        rtems_filesystem_mknod_t        mknod;

        rtems_filesystem_rmnod_t        rmnod;

        rtems_filesystem_chown_t        chown;

        rtems_filesystem_freenode_t     freenod;

        rtems_filesystem_mount_t        mount;

        rtems_filesystem_fsmount_me_t   fsmount_me;

        rtems_filesystem_unmount_t      unmount;

        rtems_filesystem_fsunmount_me_t fsunmount_me;

        rtems_filesystem_utime_t        utime;

        rtems_filesystem_evaluate_link_t eval_link;

        rtems_filesystem_symlink_t      symlink;

    } rtems_filesystem_operations_table;

5.4.1.1 evalpath Handler

evalpath~处理程序与结构中对应的字段:evalpath;

参数:

    const char *pathname,

    int flags,

    rtems_filesystem_location_info_t *pathloc

描述:

通过传递标志和有效的~rthems_filesystem_location_info_t~变量给这个函数,评估指定的路径名。

此外,为了识别路径的节点,它必须对~pathloc~变量做出必要的修改。

这包括为一个挂载的文件系统调用~evalpath,如果给定的文件系统支持~mount~命令。

如果评估成功,这个函数返回~0。否则,返回~-1~并在~errno~中设置相应的错误。

此例程是必需的,不应设置为~NULL。

5.4.1.2 evalformake Handler

evalformake~处理程序与结构中对应的字段是:evalformake;参数:

    const char *path,

    rtems_filesystem_location_info_t *pathloc,

    const char **name

描述:

该方法用来对一个路径评估,验证开始位置。

它负责为一个请求的~make~命令寻找父节点,设置识别的父节点的~pathloc~信息,并设置名称指针指向新节点名称的第一个字符。

此外,如果文件系统的支持~mount~命令,这个方法应为挂载文件系统调用~evalformake~函数。

如果评估成功,这函数返回~0。

否则,返回~-1~并在~errno~设置相应的错误。

此例程是必需的,不应设置为~NULL。

但是,如果文件系统不支持用户创建一个新的节点,它可以设置~errno~为~ENOSYS~并返回~-1。

5.4.1.3 link Handler

link~函数与结构中对应的字段是:link;参数:

    rtems_filesystem_location_info_t *to_loc,

    rtems_filesystem_location_info_t *parent_loc,

    const char *token

描述:

这个函数用来创建一个硬链接。

它首先检查我们试图创建硬链接节点的~st_nlink~计数。如果链接数超过~LINK_MAX,将返回一个错误。

链接的名称将被标准化,移除名称尾部的外来分隔符。

这个函数不是必要的,可以设置成~NULL。

%5.4.1.4 unlink Handler

%Corresponding Structure Element:

%XXX

%Arguments:

%XXX

%Description:

%XXX

%5.4.1.5 node type Handler

%Corresponding Structure Element:

%node type()

%Arguments:

%rtems_filesystem_location_info_t *pathloc

%Description:

%XXX

%5.4.1.6 mknod Handler

%Corresponding Structure Element:

%mknod()

%Arguments:

%const char *token,

%mode_t mode,

%dev_t dev,

%rtems_filesystem_location_info_t *pathloc

%Description:

%XXX

%5.4.1.7 rmnod Handler

%Corresponding Structure Element:

%XXX

%Arguments:

%XXX

%Description:

%XXX

%5.4.1.8 chown Handler

%Corresponding Structure Element:

%chown()

%Arguments:

%rtems_filesystem_location_info_t *pathloc

%uid_t owner

%gid_t group

%Description:

%XXX

5.4.1.9 freenod Handler

freenod~函数与结构中对应的字段是:freenod。

参数:

    rtems_filesystem_location_info_t *pathloc

描述:通用代码允许在评估函数中申请内存,当通用代码访问一个节点结束后可通过该函数释放节点内存。

如果评估函数申请内存用于识别一个节点,这个函数应该用来释放该节点的内存。

这个函数不是必需的,可以设置为NULL。

%5.4.1.10 mount Handler

%Corresponding Structure Element:

%mount()

%Arguments:

%rtems_filesystem_mount_table_entry_t *mt_entry

%Description:

%XXX

5.4.1.11 fsmount me Handler

fsmount_me~函数对应与结构中的字段是:fsmount_me。

参数:

    rtems_filesystem_mount_table_entry_t *mt_entry

描述:

此函数是由文件系统提供,用于在~RTEMS~环境下挂载文件系统时处理这个文件系统内部管理细节。

该函数不负责包含挂载点的文件系统的挂载细节。

rtems_filesystem_mount_table_entry_t~结构包含的关键字段如下:

    rtems_filesystem_location_info_t *mt_point_node,

此结构包含与挂载点相关的信息。

这允许我们可找到与含有挂载点的文件系统相关的~OPS~表和处理函数。

    rtems_filesystem_location_info_t *fs_root_node,

此结构包含与被挂载文件系统根节点相关的信息。

这允许我们可找到与被挂载文件系统相关的~OPS~表和处理函数。

    rtems_filesystem_options_t options,

控制访问方式,只读或读/写访问。

    void *fs_info,

它是一个已分配内存块的指针,用于保存任何文件系统的具有全局属性的特定信息。

这个分配区域非常重要,因为它可以让我们不止一次在~RTEMS~系统下挂载相同的文件系统类型。

每个挂载文件系统的实例有其自己的一套全局性的管理信息,与其他被挂载文件系统类型的实例相关的全局管理信息是分开的。

    rtems_filesystem_limits_and_options_t pathconf_info,

该表包含了下列与已挂载文件系统相关的值:

  •  link_max
  •  max_canon
  •  max_input
  •  name_max
  •  path_max
  •  pipe_buf
  •  posix_async_io
  •  posix_chown_restrictions
  •  posix_no_trunc
  •  posix_prio_io
  •  posix_sync_io
  •  posix_vdisable

这些值可以通过~pathconf()~和~fpathconf()~函数访问。

    const char *dev

为了包含一个字符串,用于标识包含文件系统信息的设备。

在当前实现的文件系统是基于内存的,并不需要设备的详细信息。

如果~mt_point_node.node_access~为~NULL,那么我们安装基本文件系统。

该函数将创建一个~IMFS~文件系统的根目录节点。

该节点对于所有者、组和其他组将有读、写和执行权限。

该节点名称将是一个空字符串。

为~IMFS~文件系统分配并初始化一个文件系统的信息结构~(fs_info)。

在挂载表项中的~fs_info~指针将被设置为指向文件系统的信息结构。

挂载表中的~pathconf_info~字段将被设置成相应的配置常数路径~(LIMITS_AND_OPTIONS)~的表(???)。

fs_root_node~结构按照以下步骤进行填充:

  1.  指针指向文件系统分配的根节点;
  2.  填充~IMFS~文件系统的目录节点处理程序;
  3.  填充~IMFS~的~OPS~表函数。

如果成功,返回~0~给调用该函数的任务,否则返回~1。

%5.4.1.12 unmount Handler

%Corresponding Structure Element:

%XXX

%Arguments:

%XXX

%Description:

%XXX

%5.4.1.13 fsunmount me Handler

%Corresponding Structure Element:

%imfs fsunmount me()

%Arguments:

%rtems_filesystem_mount_table_entry_t *mt_entry

%Description:

%XXX

%5.4.1.14 utime Handler

%Corresponding Structure Element:

%XXX

%Arguments:

%XXX

%Description:

%XXX

%5.4.1.15 eval link Handler

%Corresponding Structure Element:

%XXX

%Arguments:

%XXX

%Description:

%XXX

%5.4.1.16 symlink Handler

%Corresponding Structure Element:

%XXX

%Arguments:

%XXX

%Description:

%XXX

5.4.2 File Handler Table Functions

rtems_filesystem_file_handlers_r~结构类型定义了处理程序表函数。

它定义了给定的文件系统中节点类型的函数。

每个文件系统的节点类型都对应着一个表。

该结构定义如下。紧接着将列出与文件相关的在这个函数管理结构中的每个函数的开发信息。

    typedef struct {

        rtems_filesystem_open_t         open;

        rtems_filesystem_close_t        close;

        rtems_filesystem_read_t         read;

        rtems_filesystem_write_t        write;

        rtems_filesystem_ioctl_t        ioctl;

        rtems_filesystem_lseek_t        lseek;

        rtems_filesystem_fstat_t        fstat;

        rtems_filesystem_fchmod_t       fchmod;

        rtems_filesystem_ftruncate_t    ftruncate;

        rtems_filesystem_fpathconf_t    fpathconf;

        rtems_filesystem_fsync_t        fsync;

        rtems_filesystem_fdatasync_t    fdatasync;

        rtems_filesystem_fcntl_t        fcntl;

    } rtems_filesystem_file_handlers_r;

%5.4.2.1 open Handler

%Corresponding Structure Element:

%open()

%Arguments:

%rtems_libio_t *iop,

%const char *pathname,

%unsigned32 flag,

%unsigned32 mode

%Description:

%XXX

%5.4.2.2 close Handler

%Corresponding Structure Element:

%close()

%Arguments:

%rtems_libio_t *iop

%Description:

%XXX

%NOTES:

%XXX

%5.4.2.3 read Handler

%Corresponding Structure Element:

%read()

%Arguments:

%rtems_libio_t *iop,

%void *buffer,

%unsigned32 count

%Description:

%XXX

%NOTES:

%XXX

%5.4.2.4 write Handler

%Corresponding Structure Element:

%XXX

%Arguments:

%XXX

%Description:

%XXX

%NOTES:

%XXX

%5.4.2.5 ioctl Handler

%Corresponding Structure Element:

%XXX

%Arguments:

%rtems_libio_t *iop,

%unsigned32 command,

%void *buffer

%Description:

%XXX

%NOTES:

%XXX

%5.4.2.6 lseek Handler

%Corresponding Structure Element:

%lseek()

%Arguments:

%rtems_libio_t *iop,

%off_t offset,

%int whence

%Description:

%XXX

%NOTES:

%XXX

5.4.2.7 fstat handler

fstat()~函数对应结构中的字段是~fstat。参数:

    rtems_filesystem_location_info_t *loc,

    struct stat *buf

说明:

以下信息是从文件系统特定的节点中提取地,并放置在~stat~结构中:

  •  st_mode
  •  st_nlink
  •  st_ino
  •  st_uid
  •  st_gid
  •  st_atime
  •  st_mtime
  •  st_ctime

注意:

stat()~和~lstat()~服务都是直接使用~fstat()~处理程序直接实现的。

行为上的差异是由特殊文件实体调用该函数之前如何评估此路径决定。

fstat()~系统调用的实现直接由该文件系统处理函数实现。

%5.4.2.8 fchmod Handler

%Corresponding Structure Element:

%fchmod()

%Arguments:

%rtems_libio_t *iop

%mode_t mode

%Description:

%XXX

%NOTES:

%XXX

%5.4.2.9 ftruncate Handler

%Corresponding Structure Element:

%XXX

%Arguments:

%XXX

%Description:

%XXX

%NOTES:

%XXX

%5.4.2.10 fpathconf Handler

%Corresponding Structure Element:

%XXX

%Arguments:

%XXX

%Description:

%XXX

%NOTES:

%XXX

%5.4.2.11 fsync Handler

%Corresponding Structure Element:

%XXX

%Arguments:

%XXX

%Description:

%XXX

%NOTES:

%XXX

%5.4.2.12 fdatasync Handler

%Corresponding Structure Element:

%XXX

%Arguments:

%XXX

%Description:

%XXX

%NOTES:

%XXX

%5.4.2.13 fcntl Handler

%Corresponding Structure Element:

%XXX

%Arguments:

%XXX

%Description:

%XXX

%NOTES:

%XXX