mirror of
https://github.com/apache/nuttx.git
synced 2026-09-11 03:16:45 +00:00
An ET_DYN object is loaded into one allocation with its data behind its text, because its data references sit at a fixed distance from the code that makes them. An FDPIC object does not work that way: it reaches its data through a base register, so the two segments can be placed wherever suits, and the point of the format is that the read-only one is left on the media and executed there while only the writable one is copied. One copy of the text then serves every instance. So libelf_load() grows a second case. The object announces itself in the OS/ABI byte, which is noted once in libelf_loadhdrs() rather than re-derived; e_flags cannot be used for this, as an FDPIC object's are an unremarkable EABI version and testing them would reject every valid module. Text is taken from the media address plus the segment's own file offset -- the same arithmetic the ET_REL path already does with sh_offset -- and libelf_loadfile() does not read it. If the filesystem cannot show its media, the loader copies the text to RAM instead. The module then loses the shared text and the flash saving, but it runs. Obtaining that address needs two mechanisms, and they are not interchangeable. A compacting filesystem can move a file's blocks, so it hands out an address only with a pin that holds them still and expects the pin back; xipfs is the one in tree. A filesystem whose layout never changes has nothing to hold and answers FIOC_XIPBASE with a bare address; romfs and tmpfs are those. libelf_xipacquire() asks for the pin first, because a filesystem that needs one is not safe without it, and libelf_unload() gives it back. The loader asks for a pin only if it can hold one, or the pin would stay for ever. The pin is thus not specific to FDPIC. Any module that executes in place from a compacting filesystem takes one, and gives it back at unload. mmap() is not used, though both filesystems implement it. The mapping would be recorded against whichever task called the loader, while the release happens when the module's own task exits, which is a different group -- so the pin would outlive the module and the extent would never become movable again. Unloading has to change with placement: the existing path frees only textalloc because ET_DYN had a single allocation, which would leak an FDPIC object's data and free media the filesystem only lent us. Nothing here runs for a non-FDPIC object; every branch is behind the flag and the single-allocation path is untouched. Built and booted mps3-an547:picostest, which is CONFIG_ELF with CONFIG_PIC, with no change in behaviour. Assisted-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Signed-off-by: Marco Casaroli <marco.casaroli@gmail.com>
196 lines
6 KiB
Text
196 lines
6 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_PIN
|
|
bool
|
|
default n
|
|
---help---
|
|
Selected by a file system that can pin a file's blocks in place and
|
|
hand out their media address, so that a module's read-only segment
|
|
can be executed where it already lies instead of being copied.
|
|
|
|
The pin is held for as long as the module is loaded and given back
|
|
when it is unloaded.
|
|
|
|
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 FS_LINKS
|
|
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"
|