When building a VFS executable file, you can include whatever specific functionality is required in this file, such as:
For example, you will need to build a "file version" and a "network version" of VFS to separate file calls from network calls. In some cases, you will need to include a network stack and file systems in the VFS ("full version" of VFS).
Building a "file version" of VFS
Let's examine a VFS program containing only an implementation of the lwext4 file system without a network stack. To build this executable file, the file containing the main()
function must be linked to the vfs_server
, vfs_fs
and lwext4
libraries:
CMakeLists.txt
project (vfsfs)
include (platform/nk)
# Set compile flags
project_header_default ("STANDARD_GNU_11:YES" "STRICT_WARNINGS:NO")
add_executable (VfsFs "src/vfs.c")
# Linking with VFS libraries
target_link_libraries (VfsFs
${vfs_SERVER_LIB}
${LWEXT4_LIB}
${vfs_FS_LIB})
# Prepare VFS to connect to the ramdisk driver process
set_target_properties (VfsFs PROPERTIES ${blkdev_ENTITY}_REPLACEMENT ${ramdisk_ENTITY})
A block device driver cannot be linked to VFS and therefore must also be run as a separate process.
Interaction between three processes: client, "file version" of VFS, and block device driver.
Building a "network version" of VFS together with a network driver
Let's examine a VFS program containing a network stack with a driver but without implementations of files systems. To build this executable file, the file containing the main()
function must be linked to the vfs_server
, vfs_implementation
and dnet_implementation
libraries.
CMakeLists.txt
project (vfsnet)
include (platform/nk)
# Set compile flags
project_header_default ("STANDARD_GNU_11:YES" "STRICT_WARNINGS:NO")
add_executable (VfsNet "src/vfs.c")
# Linking with VFS libraries
target_link_libraries (VfsNet
${vfs_SERVER_LIB}
${vfs_IMPLEMENTATION_LIB}
${dnet_IMPLEMENTATION_LIB})
# Disconnect the block device driver
set_target_properties (VfsNet PROPERTIES ${blkdev_ENTITY}_REPLACEMENT "")
The dnet_implementation
library already includes a network driver, therefore it is not necessary to start a separate driver process.
Interaction between the Client process and the process of the "network version" of VFS
Building a "network version" of VFS with a separate network driver
Another option is to build the "network version" of VFS without a network driver. The network driver will need to be started as a separate process. Interaction with the driver occurs via IPC using the dnet_client
library.
In this case, the file containing the main()
function must be linked to the vfs_server
, vfs_implementation
and dnet_client
libraries.
CMakeLists.txt
project (vfsnet)
include (platform/nk)
# Set compile flags
project_header_default ("STANDARD_GNU_11:YES" "STRICT_WARNINGS:NO")
add_executable (VfsNet "src/vfs.c")
# Linking with VFS libraries
target_link_libraries (VfsNet
${vfs_SERVER_LIB}
${vfs_IMPLEMENTATION_LIB}
${dnet_CLIENT_LIB})
# Disconnect the block device driver
set_target_properties (VfsNet PROPERTIES ${blkdev_ENTITY}_REPLACEMENT "")
Interaction between three processes: client, "network version" of VFS, and network driver.
Building a "full version" of VFS
If the VFS needs to include a network stack and implementations of file systems, the build should use the vfs_server
library, vfs_implementation
library, dnet_implementation
library (or dnet_client
library for a separate network driver), and the libraries for implementing file systems.