On Wed, Apr 6, 2022 at 8:20 PM Jukka Laitinen <jukka.laiti...@iki.fi> wrote:
> 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. > > This patch associate struct file with strucct fs_rammap_s, may help you: https://github.com/apache/incubator-nuttx/pull/5997 -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 > >> > >> > >> > >> > >> > >> >