%6.4.2 Regular File Handler Table Functions
rtems_filesystem_file_handlers_r~结构类型定义了处理程序表函数。
它定义了具体到给定文件系统上的每个节点类型的处理函数。
每个文件系统上的节点类型对应着一张这样的表。
该结构定义如下,后续的章节将介绍这个管理结构中包含的与文件相关的函数的开发信息。
rtems_filesystem_file_handlers_r IMFS_memfile_handlers = {
memfile_open,
memfile_close,
memfile_read,
memfile_write,
memfile_ioctl,
memfile_lseek,
IMFS_stat,
IMFS_fchmod,
memfile_ftruncate,
NULL, /* fpathconf */
NULL, /* fsync */
IMFS_fdatasync,
IMFS_fcntl
};
%6.4.2.1 memfile_open() for Regular Files
memfile_open()~函数与结构中的字段~open~相对应;参数:
rtems_libio_t *iop,
const char *pathname,
unsigned32 flag,
unsigned32 mode
文件:memfile.c。
描述:目前这个函数值是一个空壳。没有执行任何有意义的操作,并且永远返回成功。
%6.4.2.2 memfile_close() for Regular Files
memfile_close()~函数与结构中的字段~close~相对应;参数:
rtems_libio_t *iop
文件:memfile.c。
描述:这个函数对于基本文件系统下的文件是一个哑函数(????源代码中并不是哑函数)。
从文件控制块中获取~IMFS_jnode_t~指针并立即返回成功代码。
%6.4.2.3 memfile_read() for Regular Files
memfile_read()~函数与结构中的字段~read~相对应;参数:
rtems_libio_t *iop,
void *buffer,
unsigned32 count
文件:memfile.c。
描述:此函数将确定与此文件关联的~jnode。
然后,它将以~jnode、文件位置索引、缓冲区和传输字节数为参数调用~IMFS_memfile_read()~函数。
IMFS_memfile_read()~将做到以下处理:
验证~jnode~是与一个内存文件相关联;
验证读取的目的地址是有效的;
如果读取长度过长,将调整读取的长度;
从与该文件相关联的内存块中获取数据;
更新文件中的数据访问时间。
%6.4.2.4 memfile write() for Regular Files
%Corresponding Structure Element:
%XXX
%Arguments:
%XXX
%File:
%XXX
%Description:
%XXX
%6.4.2.5 memfile_ioctl() for Regular Files
memfile_ioctl()~函数与结构中的字段~ioctl~相对应;参数:
rtems_libio_t *iop,
unsigned32 command,
void *buffer
文件:memfile.c。
描述:当前的代码只是为未来的开发预留位置。该函数返回成功完成状态。
%6.4.2.6 memfile_lseek() for Regular Files
Memfile_lseek()~函数与结构体中的字段~lseek~相对应;参数:
rtems_libio_t *iop,
off_t offset,
int whence
文件:memfile.c。
描述:这个函数确保基于内存的文件足够大,以便为新文件位置的索引定位。
IMFS_memfile_extend()~函数用来评估文件的当前内存文件的大小,并且如果新文件位置索引有需要将申请额外的内存块。
这个例程总是返回一个成功代码。
%6.4.2.7 IMFS_stat() for Regular Files
IMFS_stat()~函数与结构体中的字段~stat~相对应;参数:
rtems_filesystem_location_info_t *loc,
struct stat *buf
文件:imfs_stat.c。
描述:该函数实际上为设备和常规文件执行状态处理。
IMFS_jnode_t~结构可确定文件系统下的节点类型。
如果节点是与设备相关的,节点信息被提取并设置~stat~结构中的~st_dev~字段。
如果节点是一个普通文件,从该节点中提取文件的大小。
这个函数拒绝其他类型的节点。
以下信息从节点中获取并放置在~stat~结构中:
st_mode
st_nlink
st_ino
st_uid
st_gid
st_atime
st_mtime
st_ctime
%6.4.2.8 IMFS_fchmod() for Regular Files
IMFS_fchmod()~函数与结构中的字段~fchmod~相对应;参数:
rtems_libio_t *iop
mode_t mode
文件:imfs_fchmod.c。
描述:此函数从当前文件控制块的信息中获得~IMFS_jnode_t~结构的指针。
根据配置的函数将调用~getuid()~函数或从~IMFS_jnode_t~结构中获取用户的~ID。
然后检查是否有所有权改变文件的模式。如果调用者没有,则返回一个错误代码。
一个额外的测试用以验证调用者不是改变该节点的性质。
如果调用者试图改变不止用户组和其他用户组的权限,将返回一个错误。
如果所有的先决条件得到满足,用户,组和其他用户组的位域将按照调用参数中的模式进行设置。
%6.4.2.9 memfile ftruncate() for Regular Files
%Corresponding Structure Element:
%XXX
%Arguments:
%XXX
%File:
%XXX
%Description:
%XXX
%6.4.2.10 No pathconf() for Regular Files
%Corresponding Structure Element:
%NULL
%Arguments:
%Not Implemented
%File:
%Not Implemented
%Description:
%Not Implemented
%6.4.2.11 No fsync() for Regular Files
%Corresponding Structure Element:
%XXX
%Arguments:
%XXX
%File:
%XXX
%Description:
%XXX
%6.4.2.12 IMFS fdatasync() for Regular Files
%Corresponding Structure Element:
%XXX
%Arguments:
%XXX
%File:
%XXX
%Description:
%XXX
%6.4.3 Directory Handler Table Functions
在~rtems_filesystem_file_handlers_r~结构中定义了处理程序表函数。
它定义了一个给定文件系统上与具体节点类型相关的函数。
该结构定义如下,在后续的小节中将详细介绍这个表中的每一个函数的开发信息。
rtems_filesystem_file_handlers_r IMFS_directory_handlers = {
IMFS_dir_open,
IMFS_dir_close,
IMFS_dir_read,
NULL, /* write */
NULL, /* ioctl */
IMFS_dir_lseek,
IMFS_dir_fstat,
IMFS_fchmod,
NULL, /* ftruncate */
NULL, /* fpathconf */
NULL, /* fsync */
IMFS_fdatasync,
IMFS_fcntl
};
%6.4.3.1 IMFS_dir_open() for Directories
IMFS_dir_open()~函数与结构体中的字段~open~相对应;参数:
rtems_libio_t *iop,
const char *pathname,
unsigned32 flag,
unsigned32 mode
文件:imfs_directory.c。
描述:此函数从文件控制块中寻找与该目录相关联的~jnode。
该例程将验证该节点是一个目录。如果它不是一个目录,将返回错误代码。
如果它是一个目录,文件控制块的偏移量将被设置成~0。这使我们能够开始从目录起始位置读取数据。
%6.4.3.2 IMFS_dir_close() for Directories
IMFS_dir_close()~函数与结构中的字段~close~相对应;参数:
rtems_libio_t *iop
文件:imfs_directory.c。
描述:这个函数在基本文件系统的目录下是一个空函数。它立即返回一个成功代码。
%6.4.3.3 IMFS_dir_read() for Directories
IMFS_dir_read()~函数与结构体中字段~read~相对应;参数:
rtems_libio_t *iop,
void *buffer,
unsigned32 count
参数:imfs_directory.c。
描述:这个函数将从目录的当前偏移位置读取固定数量的数据。函数返回从目录中读取的字节数。
%6.4.3.4 No write() for Directories
%Corresponding Structure Element:
%XXX
%Arguments:
%XXX
%File:
%XXX
%Description:
%XXX
%6.4.3.5 No ioctl() for Directories
%Corresponding Structure Element:
%ioctl
%Arguments:
%File:
%Not supported
%Description:
%XXX
%6.4.3.6 IMFS dir lseek() for Directories
IMFS_dir_lseek()~函数与结构体中的字段~lseek~相对应;参数:
rtems_libio_t *iop,
off_t offset,
int whence
文件:imfs_directory.c。
参数:这个函数改变文件控制块中的偏移量。
没有对当前打开目录下的孩子的数量进行测试。
当文件位置索引超过打开目录最后的项目时,
imfs_dir_read()~函数通过返回读取~0~个字节给调用程序防止读取超出了当前目录尺寸的数据。
%6.4.3.7 IMFS_dir_fstat() for Directories
IMFS_dir_fstat()~函数与结构体中的字段~fstat~相对应;参数:
rtems_filesystem_location_info_t *loc,
struct stat *buf
文件:imfs_directory.c。
描述:在~rtems_filesystem_location_info_t~结构中的节点访问信息用于定位合适的~IMFS_jnode_t~结构。
下面信息从~IMFS_jnode_t~结构中获取并放置到~stat~结构中:
st_ino
st_mode
st_nlink
st_uid
st_gid
st_atime
st_mtime
st_ctime
通过遍历目录项目链表并累加所有这个目录的孩子的~dirent~结构体尺寸来获得~st_size~字段的值。
%6.4.3.8 IMFS_fchmod() for Directories
IMFS_fchmod()~函数与结构体中的字段~fchmod~相对应;参数:
rtems_libio_t *iop
mode_t mode
文件:imfs_fchmod.c。
描述:此函数将从当前的文件控制块中获得~IMFS_jnode_t~的指针。
根据配置函数通过调用~getguid()~函数或者从~IMFs_jnode_t~结构中或片区用户的~ID。
然后检查是否有所有权改变文件的模式。如果调用者没有,则返回一个错误的代码。
一个额外测试用以验证调用者不是要改变该节点的性质。
如果调用者试图改变不止用户组和其他用户组的权限,将返回一个错误。
如果所有的先决条件都得到满足,用户、组和其他用户组的位域将按照调用参数中的模式进行设置。
%6.4.3.9 No ftruncate() for Directories
%Corresponding Structure Element:
%XXX
%Arguments:
%XXX
%File:
%XXX
%Description:
%XXX
%6.4.3.10 No fpathconf() for Directories
%Corresponding Structure Element:
%fpathconf
%Arguments:
%Not Implemented
%File:
%Not Implemented
%Description:
%Not Implemented
%6.4.3.11 No fsync() for Directories
%Corresponding Structure Element:
%XXX
%Arguments:
%XXX
%File:
%XXX
%Description:
%XXX
%6.4.3.12 IMFS fdatasync() for Directories
%Corresponding Structure Element:
%XXX
%Arguments:
%XXX
%File:
%XXX
%Description:
%XXX
%6.4.4 Device 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_file_handlers_r;
%6.4.4.1 device open() for Devices
device_open()~函数对应结构中的字段~open;参数:
rtems_libio_t *iop,
const char *pathname,
unsigned32 flag,
unsigned32 mode
文件:deviceio.c。
描述:这个函数将使用文件控制块为设备定位节点结构。
从~jnode~中提取设备的主和副编号。
主和副设备编号将被用作调用~rtems_io_open()~函数时参数,打开设备的驱动程序。
参数列表发送到驱动程序,它包含文件控制块,标志和模式信息。
%6.4.4.2 device_close() for Devices
device_close()~函数与结构中的字段~close~相对应;参数:
rtems_libio_t *iop
参数:deviceio.c。
描述:这个函数从文件控制块引用的~IMFS_jnode_t~结构内提取主和副设备驱动程序的编号。
这也形成了一个包含该文件控制块的参数列表。
调用~rtems_io_close()~函数时指定指定的主、副设备编号可关闭指定的设备。
%6.4.4.3 device read() for Devices
device_read()~函数与结构体中的字段~read~相对应;参数:
rtems_libio_t *iop,
void *buffer,
unsigned32 count
文件:deviceio.c。
描述:此函数将从文件描述符相关的~jnode~中提取设备的主、副编号。
调用~rtems_io_read()~函数将作用于与文件描述符相关联的设备驱动程序。
主、副设备编号将作为参数,参数列表包括:
文件控制块;
文件位置索引;
缓冲区指针,读取的数据被放置的地方;
字节计数,表示程序希望从设备中读取的字节数;
文件控制块中的标志。
从~rtems_io_read()~函数返回的实际读取的字节数被返回给调用程序。
%6.4.4.4 device write() for Devices
%Corresponding Structure Element:
%XXX
%Arguments:
%XXX
%File:
%XXX
%Description:
%XXX
%6.4.4.5 device ioctl() for Devices
device_ioctl()~函数与结构体中的字段~ioctl~相对应。
rtems_libio_t *iop,
unsigned32 command,
void *buffer
文件:deviceio.c。
描述:此处理程序将获得与设备相关的状态信息。
状态的形式是依赖于具体的设备。
rtems_io_control()~函数使用该设备的主、副编号获得状态信息。
rtems_io_control()~需要一个~rtems_libio_ioctl_args_t~参数表,
包含文件控制块,设备特定的命令和一个存储函数返回的设备状态信息的缓冲指针。
该设备的特定命令应指示出希望从设备获取信息的种类。
在~rtems_io_control()~处理后,缓冲区应该包含请求的设备信息。
如果设备不能得到正确的信息,将返回~-1~到调用程序,否则返回~ioctl_return~的值。
%6.4.4.6 device lseek() for Devices
device_lseek()~函数与结构体中的字段~lseek~相对应;参数:
rtems_libio_t *iop,
off_t offset,
int whence
文件:deviceio.c。
描述:目前这个函数是一个占位函数,始终返回成功代码。
%6.4.4.7 IMFS stat() for Devices
IMFS_stat()~函数与结构体中的字段~stat~相对应;参数:
rtems_filesystem_location_info_t *loc,
struct stat *buf
文件:imfs_stat.c。
描述:该函数实际上为设备和常规文件执行状态处理。
IMFS_jnode_t~结构可确定文件系统下的节点类型。
如果节点是与设备相关的,节点信息被提取并设置~stat~结构中的~st_dev~字段。
如果节点是一个普通文件,从该节点中提取文件的大小。
这个函数拒绝其他类型的节点。
以下信息从节点中获取并放置在~stat~结构中:
st_mode
st_nlink
st_ino
st_uid
st_gid
st_atime
st_mtime
st_ctime
%6.4.4.8 IMFS fchmod() for Devices
IMFS_fchmod()~函数与结构中的字段~fchmod~相对应;参数:
rtems_libio_t *iop
mode_t mode
文件:imfs_fchmod.c。
描述:此函数从当前文件控制块的信息中获得~IMFS_jnode_t~结构的指针。
根据配置的函数将调用~getuid()~函数或从~IMFS_jnode_t~结构中获取用户的~ID。
然后检查是否有所有权改变文件的模式。如果调用者没有,则返回一个错误代码。
一个额外的测试用以验证调用者不是改变该节点的性质。
如果调用者试图改变不止用户组和其他用户组的权限,将返回一个错误。
如果所有的先决条件得到满足,用户、组和其他用户组的位域将按照调用参数中的模式进行设置。
%6.4.4.9 No ftruncate() for Devices
%Corresponding Structure Element:
%XXX
%Arguments:
%XXX
%File:
%XXX
%Description:
%XXX
%6.4.4.10 No fpathconf() for Devices
%Corresponding Structure Element:
%fpathconf
%Arguments:
%Not Implemented
%File:
%Not Implemented
%Description:
%Not Implemented
%6.4.4.11 No fsync() for Devices
%Corresponding Structure Element:
%XXX
%Arguments:
%XXX
%File:
%XXX
%Description:
%XXX
%6.4.4.12 No fdatasync() for Devices
%Not Implemented
%Corresponding Structure Element:
%XXX
%Arguments:
%XXX
%File:
%XXX
%Description:
%XXX
%7 Miniature In-Memory Filesystem
%This chapter describes the Miniature In-Memory FileSystem (miniIMFS). The miniIMFS is
%a reduced feature version of the IMFS designed to provide minimal functionality and have
%a low memory footprint.
%This chapter should be written after the IMFS chapter is completed and describe the implementation
%of the mini-IMFS.
%8 Trivial FTP Client Filesystem
%This chapter describes the Trivial FTP (TFTP) Client Filesystem.
%This chapter should be written after the IMFS chapter is completed and describe the implementation
%of the TFTP.
RTEMS文件系统(6):内存文件系统(下)
最新推荐文章于 2018-01-23 16:16:37 发布