Hi!
Just started crafting the posix shm driver, with the following:
- Started with "driver" approach (i.e. not mountable fs), similar to
mqueue.
- Added shm_open and shm_unlink to syscalls (similarly as mq_open).
shm_unlink would *maybe* also work directly through vfs, but at least
shm_open needs to be there; it is not possible to create a file via
basic "open" (vfs/fs_open) for a "driver".
- Added an ioctl for ftruncate, since file_operations don't have truncate
Now I realized that there is a problem with munmap; there is no clear
way to translate address+len into a mapped file, so it is not really
possible to do e.g. an ioctl to the shmfs. I wonder what would be a good
way to solve this? I could:
- leave munmap unimplemented for now (then it is not possible to really
free memory once allocated by a shared memory object).
- implement some sort of support for named mmappings (e.g. at mmap
reserve some extra space in front of every mapping for mmap info, and
use this in fs/mm/fs_munmap to find the proper file/driver)
- always send an ioctl for shmfs driver, and keep the info of mapped
areas there (quite ugly).
- something else, ideas?
Suggestions? Maybe I missed something, but I didn't see an obvious way
to do munmap.
-Jukka
On 5.4.2022 14.04, Xiang Xiao wrote:
On Tue, Apr 5, 2022 at 5:08 PM Jukka Laitinen <jukka.laiti...@iki.fi> wrote:
Hi!
I would like to do the posix shm interface for NuttX (shm_open,
shm_unlink etc.); with the following properties
- Would work in all memory protection modes (flat, protected and kernel).
- In flat it would just "malloc" the memory and share the pointer
w. mmap
- In protected it would per CONFIG_ flag either do malloc from user
heap, or alternatively from a dedicated shm heap
- In kernel build it would do the proper allocation by gran
allocator & mmap, basically wrapping the existing shm interface
My use case is applications, which can communicate over shm, would work
the same for linux and nuttx, and would be usable in nuttx in all the
build modes.
Now, I started looking into fs/shm and made the observation
(fs/Makefile, etc) that initially the intention has been that the shm is
not a mountable filesystem, but rather similar to mqueue, socket and
semaphore. This seems to bring the problem that only mountable
filesystems support "truncate", which is used in posix shm to set the
size of the shared object.
Another thing which I was wondering is, that we could maybe mimic linux,
which uses tmpfs for shared memory. There I noticed, that tmpfs doesn't
support kernel build. It doesn't use gran allocator to allocate on page
boundaries, nor proper mmap). Tmpfs also feels a bit complex for the
purpose. I'd maybe rather target for a minimized implementation.
So, I am basically asking opinions on how this would be best :)
1. Does the above make any sense, would others be interested in posix shm ?
Yes, it's very useful.
2. Is it feasible if I do shm as an own "mountable" filesystem (to
support truncate), or is there something I missed?
One possible solution is add FIOC_TRUNCATE, so the char driver could
implement the truncation in ioctl callback.
3. The support for flat and protected modes can be built into fs layer,
or additionally added to the existing shm interface. Which way feels
arhitecturally better for others? I would initially default to putting
it directly into shm fs, to avoid modifying the existing shm if.
It's better to follow mqueue structure:
1. All functionality except naming is located at mm/shm
2. The file system integration is located at fs/shm
Br,
Jukka