mirror of
https://github.com/apache/nuttx.git
synced 2026-08-01 20:28:58 +00:00
ROMFS is the usual way to carry executables on a NOMMU target with memory mapped NOR flash: it can hand out a real flash pointer from mmap(), so the NXFLAT loader maps a module's text in place instead of copying it into RAM. But a ROMFS image is built on the host and is read only, so a module cannot be downloaded onto the board at run time. xipfs is a writable file system with the same in-place property. Each file is stored as one physically contiguous, erase-block aligned extent, so an mmap() of it resolves to flash_base + extent_offset and a loader can execute the file where it already lies. This needs the underlying MTD driver to answer BIOC_XIPBASE; on the RP2350 rp23xx_flash_mtd.c does. Files are write once. A file is created, its size is declared, it is written sequentially, closed, and is thereafter immutable until it is deleted. That is the whole life cycle of a downloaded module, and it is what licenses the design: the exact extent is reserved at create time, so no file ever grows, moves, or fragments internally. Random writes, appends and truncation of a written file are not supported and are refused. The only source of fragmentation is therefore free space holes left by deletes. Allocation fails with -ENOSPC when no single contiguous run is large enough, and never defragments on its own; the caller decides whether to compact and retry, through XIPFSIOC_DEFRAG. Defragmentation is manual, best effort and interruptible: it is a loop of atomic single-extent relocations, each one copy, commit, erase, so every stop point -- a time budget, a pinned extent, an erase error -- leaves a consistent layout that is simply less compact. It reports the largest contiguous run it achieved, which is what tells the caller whether the retry will fit. Metadata is committed power safely. Two metadata block sets are used in ping-pong, each generation carrying a sequence number and a CRC, and every state change is ordered as write the new data, flip the metadata reference, then erase what the old one referenced. Mount scans both sets and selects the last fully valid generation, so a torn write costs the interrupted operation and nothing else. A mapping takes a pin on the extent, and the pin lives on the extent rather than on the file descriptor, so three running instances of one module hold three pins and the extent becomes movable only when the last one goes. Defragmentation skips pinned extents, which is what stops it relocating code that is executing. The pin is released by munmap() or by the task teardown walk, so a task that dies without unmapping does not leak it. Directories are records in that same generation, carrying their own identity and the identity of the directory holding them; the root is implicit and owns identity zero. They are deliberately NOT objects in the data region, which is what keeps the commit story in one piece: mkdir and rmdir add or remove a record and commit one generation, exactly as create and unlink do, so there is never a multi-object update to journal or an orphan to collect at mount. An empty directory therefore exists, survives a remount, and costs one entry out of the volume's fixed supply and no flash blocks at all. A name is one path component; depth comes from the parent, so XIPFS_NAME_MAX bounds a component, which is what statfs reports it as. Mount rebuilds the tree and checks that it is one: identities unique, names unique within a directory, every parent a live directory, and following parents reaching the root -- a cycle on the medium would otherwise hang a path walk rather than merely answering wrongly. '.' and '..' are refused as components, since an entry stored under either could never be reached again. The commands that act on the volume rather than on one file -- XIPFSIOC_DEFRAG and XIPFSIOC_LISTPINNED -- are reached through the ioctldir method, on a descriptor for the mountpoint directory. They are accepted on a descriptor for a file inside the volume too, but that route holds the file open for the duration and an open extent cannot be relocated, so a pass asked for that way is obstructed by the act of asking. mmap() falls back to the generic RAM copy for ordinary readers when the media cannot be addressed directly. A module loader must not silently get a RAM copy, so MAP_XIP_STRICT is added: with it the mapping either resolves in place or fails with -ENXIO, which the caller can turn into defragment and retry. Assisted-by: Claude Code:claude-opus-5 Signed-off-by: Marco Casaroli <marco.casaroli@gmail.com>
185 lines
5.7 KiB
Text
185 lines
5.7 KiB
Text
#
|
|
# For a description of the syntax of this configuration file,
|
|
# see the file kconfig-language.txt in the NuttX tools repository.
|
|
#
|
|
|
|
comment "File system configuration"
|
|
|
|
config FS_PROFILER
|
|
bool "VFS Performance Profiler"
|
|
default n
|
|
---help---
|
|
Enable nanosecond/microsecond-level profiling for the Virtual File
|
|
System (VFS) operations (open, close, read, write). The profile stats
|
|
can be read via /proc/fs/profile if PROCFS is enabled.
|
|
|
|
config DISABLE_MOUNTPOINT
|
|
bool "Disable support for mount points"
|
|
default n
|
|
|
|
config FS_LARGEFILE
|
|
bool "Large File Support"
|
|
default n
|
|
---help---
|
|
Support files which's length is larger than 4GB:
|
|
https://www.opengroup.org/platform/lfs.html
|
|
|
|
Note: the protected and kernel mode on 32bit platform can't exceed
|
|
the 4GB limitation since the auto generated proxy and stub still
|
|
cut 64bit to 32bit value. Please check tools/mksyscall.c for more
|
|
information.
|
|
|
|
config FS_AUTOMOUNTER
|
|
bool "Auto-mounter"
|
|
default n
|
|
depends on !DISABLE_MOUNTPOINT
|
|
select SCHED_LPWORK
|
|
---help---
|
|
The automounter provides an OS-internal mechanism for automatically
|
|
mounting and unmounting removable media as the media is inserted and
|
|
removed. See include/nuttx/fs/automout.h for interfacing details.
|
|
|
|
config FS_AUTOMOUNTER_DEBUG
|
|
bool "Auto-mounter debug"
|
|
default n
|
|
depends on FS_AUTOMOUNTER && DEBUG_FEATURES
|
|
---help---
|
|
Normally, the auto-mounter will generate debug output when sub-system
|
|
level file system debug is enabled. This option will select debug
|
|
output from the logic related to the auto-mount feature even when file
|
|
system debug is not enable. This is useful primarily for in vivo
|
|
unit testing of the auto-mount feature.
|
|
|
|
config FS_AUTOMOUNTER_DRIVER
|
|
bool "Auto-mounter driver"
|
|
default n
|
|
depends on FS_AUTOMOUNTER && !DISABLE_ALL_SIGNALS
|
|
---help---
|
|
Enabling this option will lead to registering of a character driver
|
|
on FS_AUTOMOUNTER_VFS_PATH + mount point path for auto-mounter.
|
|
Example: /var/mnt/sdcard0
|
|
|
|
config FS_AUTOMOUNTER_VFS_PATH
|
|
string "Path to auto-mounter driver"
|
|
default "/var"
|
|
depends on FS_AUTOMOUNTER_DRIVER
|
|
---help---
|
|
The path to where auto-mounter driver will exist in the VFS namespace.
|
|
|
|
config FS_NEPOLL_DESCRIPTORS
|
|
int "Maximum number of default epoll descriptors for epoll_create1(2)"
|
|
default 8
|
|
---help---
|
|
The maximum number of default epoll descriptors for epoll_create1(2)
|
|
|
|
config FS_LOCK_BUCKET_SIZE
|
|
int "Maximum number of hash bucket using file locks"
|
|
default 0
|
|
|
|
config DISABLE_PSEUDOFS_OPERATIONS
|
|
bool "Disable pseudo-filesystem operations"
|
|
default DEFAULT_SMALL
|
|
---help---
|
|
Disable certain operations on pseudo-file systems include mkdir,
|
|
rmdir, unlink, and rename. These are necessary for the logical
|
|
completeness of the illusion created by the pseudo-filesystem.
|
|
However, in practical embedded system, they are seldom needed and
|
|
you can save a little FLASH space by disabling the capability.
|
|
|
|
config PSEUDOFS_ATTRIBUTES
|
|
bool "Pseudo-filesystem attributes"
|
|
default n
|
|
depends on !DISABLE_PSEUDOFS_OPERATIONS
|
|
---help---
|
|
Enable support for attributes(e.g. mode, uid, gid and time)
|
|
in the pseudo file system.
|
|
|
|
config FS_PERMISSION
|
|
bool "Enable UNIX Filesystem Permission Support"
|
|
default n
|
|
depends on !DISABLE_PSEUDOFS_OPERATIONS
|
|
depends on SCHED_USER_IDENTITY
|
|
depends on PSEUDOFS_ATTRIBUTES
|
|
|
|
---help---
|
|
Enable filesystem ownership and permission metadata
|
|
support for pseudoFS inodes.
|
|
|
|
Requires SCHED_USER_IDENTITY and
|
|
PSEUDOFS_ATTRIBUTES for task credential tracking
|
|
and inode ownership/mode metadata support.
|
|
|
|
This option alone does not enforce runtime
|
|
permission checks.
|
|
|
|
comment "UNIX filesystem permission support requires SCHED_USER_IDENTITY=y, PSEUDOFS_ATTRIBUTES=y and DISABLE_PSEUDOFS_OPERATIONS=n"
|
|
depends on !SCHED_USER_IDENTITY || !PSEUDOFS_ATTRIBUTES || DISABLE_PSEUDOFS_OPERATIONS
|
|
|
|
config PSEUDOFS_SOFTLINKS
|
|
bool "Pseudo-filesystem soft links"
|
|
default n
|
|
depends on !DISABLE_PSEUDOFS_OPERATIONS
|
|
---help---
|
|
Enable support for soft links in the pseudo file system. Soft
|
|
links are not supported within mounted volumes by any NuttX file
|
|
system. However, if this option is selected, then soft links
|
|
may be add in the pseudo file system. This might be useful, for
|
|
to link a directory in the pseudo-file system, such as /bin, to
|
|
to a directory in a mounted volume, say /mnt/sdcard/bin.
|
|
|
|
config PSEUDOFS_FILE
|
|
bool "Pseudo file support"
|
|
default n
|
|
depends on !DISABLE_PSEUDOFS_OPERATIONS
|
|
---help---
|
|
Support to create a file on pseudo filesystem.
|
|
|
|
config SENDFILE_BUFSIZE
|
|
int "sendfile() buffer size"
|
|
default 512
|
|
---help---
|
|
Size of the I/O buffer to allocate in sendfile(). Default: 512b
|
|
|
|
config FS_HEAPSIZE
|
|
int "Independent heap bytes"
|
|
default 0
|
|
depends on FS_SHMFS || FS_TMPFS || PSEUDOFS_FILE
|
|
---help---
|
|
Support for shm/tmpfs/fs_pseudofile.c ram based fs memory.
|
|
default 0 to use kmm directly. independent heap disabled
|
|
|
|
config FS_HEAPBUF_SECTION
|
|
string "FS heap use Userheap section"
|
|
depends on FS_HEAPSIZE > 0
|
|
default ""
|
|
---help---
|
|
Allocated fs heap from the specified section. If not
|
|
specified, it will alloc from kernel heap.
|
|
|
|
source "fs/vfs/Kconfig"
|
|
source "fs/aio/Kconfig"
|
|
source "fs/semaphore/Kconfig"
|
|
source "fs/event/Kconfig"
|
|
source "fs/mqueue/Kconfig"
|
|
source "fs/shm/Kconfig"
|
|
source "fs/mmap/Kconfig"
|
|
source "fs/partition/Kconfig"
|
|
source "fs/fat/Kconfig"
|
|
source "fs/nfs/Kconfig"
|
|
source "fs/nxffs/Kconfig"
|
|
source "fs/romfs/Kconfig"
|
|
source "fs/cromfs/Kconfig"
|
|
source "fs/tmpfs/Kconfig"
|
|
source "fs/smartfs/Kconfig"
|
|
source "fs/binfs/Kconfig"
|
|
source "fs/procfs/Kconfig"
|
|
source "fs/spiffs/Kconfig"
|
|
source "fs/littlefs/Kconfig"
|
|
source "fs/unionfs/Kconfig"
|
|
source "fs/userfs/Kconfig"
|
|
source "fs/hostfs/Kconfig"
|
|
source "fs/rpmsgfs/Kconfig"
|
|
source "fs/zipfs/Kconfig"
|
|
source "fs/mnemofs/Kconfig"
|
|
source "fs/xipfs/Kconfig"
|
|
source "fs/v9fs/Kconfig"
|